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

什么是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.py
author: hu@daonao.com QQ: 443089607 weixin: huzhenghui weibo: http://weibo.com/443089607
category : selenium
original url : http://bbs.csdn.net/topics/1234567890
original title : 
title : 使用Python Selenium PhantomJS的XPath时应注意校验结果
csdn blog url :
weibo article url :
weibo message url :
为了清晰直观展现python严格要求的缩进,请访问博客上博文
详细说明见源代码中的注释
"""

import datetime
import logging
import urllib

from 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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值