使用Python Selenium PhantomJS的XPath时应注意校验结果

来源:互联网 发布:网络双向是什么意思 编辑:程序博客网 时间:2024/06/12 21:18

什么是Selenium?

Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本。

什么是PhantomJS?

PhantomJS是一个基于WebKit的服务器端JavaScript API,它基于BSD开源协议发布。PhantomJS无需浏览器的支持即可实现对Web的支持,且原生支持各种Web标准,如DOM 处理、JavaScript、CSS选择器、JSON、Canvas和可缩放矢量图形SVG。PhantomJS主要是通过JavaScript和CoffeeScript控制WebKit的CSS选择器、可缩放矢量图形SVG和HTTP网络等各个模块。PhantomJS主要支持Windows、Mac OS、Linux三个平台,并且提供了对应的二进制安装包。

为什么Selenium和PhantomJS在一起?

Selenium和PhantomJS是相互独立的,如果是简单使用的话,可以不需要Selenium,直接操作PhantomJS,不过Selenium已经封装了大量的接口,而且访问不同的浏览器可以使用相同的接口,因此使用Selenium就比直接操作PhantomJS方便多了。

此外,在Python中可以直接安装Selenium封装好的包。

如何安装PhantomJS?

访问 http://phantomjs.org/download.html 下载Windows平台的压缩包,解压缩其中的phantomjs.exe程序,放在Windows操作系统的PATH中的某个路径中,或者随便放在什么地方,然后把这个文件夹的路径加在PATH中。

使用Selenium操作PhantomJS有什么注意事项?

和那些带有界面的浏览器相比,主要的区别可以看 http://phantomjs.org/supported-web-standards.html 中的介绍:

  • 不支持Plugins,例如Flash
  • 不支持WebGL
  • 不支持音频和视频
  • 不支持CSS 3-D

说到这里强调一下,目前大量的机器人都是使用PhantomJS制作的,因此,防止机器人的一个方式就是使用CSS 3-D显示某些内容。

使用Selenium操作PhantomJS有什么更重要的注意事项?

也是看 http://phantomjs.org/supported-web-standards.html 中的介绍:

  • XPath,未测试!

支持XPath,简单的没问题,复杂的也没问题,但是没有测试,也就是说,在其他浏览器上符合要求的XPath,在PhantomJS上可能返回不一样的结果。

怎么办?

本例以一个去除度娘广告为例讲解在使用Selenium操作PhantomJS时,应当核对结果。

人工核对?

当然不!

既然是自动化测试,就应当自动化核对!

# -*- coding: utf-8 -*-"""filename : phantomjs_xpath.pyauthor: hu@daonao.com QQ: 443089607 weixin: huzhenghui weibo: http://weibo.com/443089607category : seleniumoriginal url : http://bbs.csdn.net/topics/1234567890original title : title : 使用Python Selenium PhantomJS的XPath时应注意校验结果csdn blog url :weibo article url :weibo message url :为了清晰直观展现python严格要求的缩进,请访问博客上博文详细说明见源代码中的注释"""import datetimeimport loggingimport urllibfrom selenium import webdriver# 日志logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')# 启动时间START_DATETIME = datetime.datetime.now()# 日志中显示启动时间logging.debug('start at %s', START_DATETIME)# Firefox驱动FIREFOX = webdriver.Firefox()# 查看Firefox驱动的类型logging.debug('type(FIREFOX) : %s', type(FIREFOX))# PhantomJS驱动PHANTOMJS = webdriver.PhantomJS()# 查看Phantom的类型logging.debug('type(PHANTOMJS) : %s', type(PHANTOMJS))# 定义个抓取函数def no_ad(web_driver, word, days):    """    使用指定驱动,查询指定关键词,并限制指定天数    """    # 当前时间戳,用于百度网站的按照时间过滤的参数    now_timestamp = int(datetime.datetime.now().timestamp())    # 拼接URL,关键词,查询开始时间戳,查询结束时间戳    url = ('http://www.baidu.com/s?wd=' + urllib.parse.quote(word) +           '&gpc=stf%3D' + str(now_timestamp - days * 86400) + '%2C' + str(now_timestamp) +           '%7Cstftype%3D1')    # 访问地址    web_driver.get(url)    # 使用xpath查询结果,过滤广告,返回字典    return dict((element.text, element.find_element_by_xpath('a').get_attribute('href'))                for element in (web_driver.find_elements_by_xpath('/html/body//h3'))                if element.get_attribute('class') == 't')# 使用Firefox查询python一天内的结果FIREFOX_NO_AD = no_ad(FIREFOX, 'python', 1)# 显示结果logging.debug(FIREFOX_NO_AD)# 使用PhantomJS查询python一天内的结果PHANTOMJS_NO_AD = no_ad(PHANTOMJS, 'python', 1)# 显示结果logging.debug(PHANTOMJS_NO_AD)# 计算Firefox结果和PhantomJS结果的交集INTERSECTION_NO_AD = list(result for result in FIREFOX_NO_AD if result in PHANTOMJS_NO_AD)# 显示结果交集logging.debug(INTERSECTION_NO_AD)# 显示交集数量logging.debug('len(INTERSECTION_NO_AD) : %d', len(INTERSECTION_NO_AD))#end of file
原创粉丝点击