zoukankan      html  css  js  c++  java
  • selenium+phantomjs解析JS

    背景知识:

    PhantomJS 是一个基于WebKit的服务器端 JavaScript API。它全面支持web而不需浏览器支持,其快速,原生支持各种Web标准: DOM 处理, CSS 选择器, JSON, Canvas, 和 SVG。PhantomJS可以用于页面自动化,网络监测,网页截屏,以及无界面测试等。

    Selenium也是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7、8、9)、Mozilla Firefox、Mozilla Suite等。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。

    PhantomJS 用来渲染解析JS,Selenium 用来驱动以及与 Pyt

    复制代码
    #coding=utf-8
    from selenium import webdriver
    
    driver = webdriver.PhantomJS(executable_path=‘C:UsersGentlyguitarDesktopphantomjs-1.9.7-windowsphantomjs.exe‘)
    driver.get("http://phperz.com/")
    driver.find_element_by_id(‘search_form_input_homepage‘).send_keys("Nirvana")
    driver.find_element_by_id("search_button_homepage").click()
    print driver.current_url
    driver.quit()
    复制代码

    hon 的对接,Python 进行后期的处理。

    selenium2支持的Python版本:2.7, 3.2, 3.3 and 3.4

    如果需要进行远程操作的话,就需要额外安装selenium server

    安装:

    先装selenium2,哪种方式装都可以,我一般都是直接下载压缩包,然后用python setup.py install命令来装,selenium 2.42.1的下载地址:https://pypi.python.org/pypi/selenium/2.42.1

    然后下载phantomjs,https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-1.9.7-windows.zip,解压后可以看到一个phantomjs.exe的文件

    范例1

    其中的executable_path就是刚才phantomjs.exe的路径,运行结果:

    https://phperz.com/?q=Nirvana

    Walk through of the example

     值得一提的是:

    get方法会一直等到页面被完全加载,然后才会继续程序

    但 是对于ajax: It’s worth noting that if your page uses a lot of AJAX on load then WebDriver may not know when it has completely loaded

    send_keys就是填充input

    范例2

    复制代码
    #coding=utf-8
    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver import ActionChains
    import time
    import sys
    
    driver = webdriver.PhantomJS(executable_path=‘C:UsersGentlyguitarDesktopphantomjs-1.9.7-windowsphantomjs.exe‘)
    driver.get("http://www.zhihu.com/#signin")
    #driver.find_element_by_name(‘email‘).send_keys(‘your email‘)
    driver.find_element_by_xpath(‘//input[@name="password"]‘).send_keys(‘your password‘)
    #driver.find_element_by_xpath(‘//input[@name="password"]‘).send_keys(Keys.RETURN)
    time.sleep(2)
    driver.get_screenshot_as_file(‘show.png‘)
    #driver.find_element_by_xpath(‘//button[@class="sign-button"]‘).click()
    driver.find_element_by_xpath(‘//form[@class="zu-side-login-box"]‘).submit()
    
    try:
        dr=WebDriverWait(driver,5)
        dr.until(lambda the_driver:the_driver.find_element_by_xpath(‘//a[@class="zu-top-nav-userinfo "]‘).is_displayed())
    except:
        print ‘登录失败‘
        sys.exit(0)
    driver.get_screenshot_as_file(‘show.png‘)
    #user=driver.find_element_by_class_name(‘zu-top-nav-userinfo ‘)
    #webdriver.ActionChains(driver).move_to_element(user).perform() #移动鼠标到我的用户名
    loadmore=driver.find_element_by_xpath(‘//a[@id="zh-load-more"]‘)
    actions = ActionChains(driver)
    actions.move_to_element(loadmore)
    actions.click(loadmore)
    actions.perform()
    time.sleep(2)
    driver.get_screenshot_as_file(‘show.png‘)
    print driver.current_url
    print driver.page_source
    driver.quit()
    复制代码

    这个程序完成的是,登陆知乎,然后能自动点击页面下方的“更多”,以载入更多的内容

    Walk through of the example

    from selenium.webdriver.common.keys import Keys,keys这个类就是键盘上的键,文中的send_keys(Keys.RETURN)就是按一个回车

    from selenium.webdriver.support.ui import WebDriverWait是为了后面一个等待的操作

    from selenium.webdriver import ActionChains是导入一个动作的类,这句话的写法,我找了很久

    find_element推荐使用Xpath的方法,非常方便

    Xpath表达式写法教程:http://www.ruanyifeng.com/blog/2009/07/xpath_path_expressions.html

    值得注意的是,避免选择value带有空格的属性,譬如class = "country name"这种,不然会报错,大概compound class之类的错

    检查用户密码是否输入正确的方法就是在填入后截屏看看

    想要截屏,这么一句话就行:

    driver.get_screenshot_as_file(‘show.png‘)

    但是,这里的截屏是不带滚动条的,就是给你把整个页面全部照下来

    try:

        dr=WebDriverWait(driver,5)

        dr.until(lambda the_driver:the_driver.find_element_by_xpath(‘//a[@class="zu-top-nav-userinfo "]‘).is_displayed())

    except:

        print ‘登录失败‘

        sys.exit(0)

    是用来通过检查某个元素是否被加载来检查是否登录成功,我认为当个黑盒子用就可以了。其中5的解释:5秒内每隔500毫秒扫描1次页面变化,直到指定的元素

    对于表单的提交,即可以选择登录按钮然后使用click方法,也可以选择表单然后使用submit方法,后者能应付没有登录按钮的情况,所以推荐使用submit()

    对于一次点击,既可以使用click(),也可以使用一连串的action来实现,如文中:

    loadmore=driver.find_element_by_xpath(‘//a[@id="zh-load-more"]‘)

    actions = ActionChains(driver)

    actions.move_to_element(loadmore)

    actions.click(loadmore)

    actions.perform()

    这5句话其实就相当于一句话,find element然后click,但是action的适用范围更广,譬如在这个例子中,要点击的是一个a标签对象,我不知道为什么直接用click不行,不起作用

    print driver.current_url

    print driver.page_source

    打印网页的两个属性:url和source

     转载http://www.phperz.com/article/15/0829/117337.html

  • 相关阅读:
    左右下划线,中间文字
    sql语言动词
    SQL语言的四个组成部分
    MySQL执行一条查询语句的内部执行过程
    07 | 行锁功过:怎么减少行锁对性能的影响?
    06 | 全局锁和表锁 :给表加个字段怎么有这么多阻碍?
    05 | 深入浅出索引(下)
    04 | 深入浅出索引(上)
    03 | 事务隔离:为什么你改了我还看不见?
    02 | 日志系统:一条SQL更新语句是如何执行的?
  • 原文地址:https://www.cnblogs.com/BigFishFly/p/6337051.html
Copyright © 2011-2022 走看看