[133]selenium webdriver的各种driver

selenium.webdriver提供了所有WebDriver的实现,目前支持FireFox、phantomjs、Chrome、Ie和Remote

webdriver的简介

selenium2.0的主要新功能是集成的webdriver的API。webdriver的设计除了解决一些seleniumr-RC API的一些限制,与webdriver 的整合,将提供一个更简单,更简洁的编程接口。selenium webdriver会更好地支持动态的网页,页面本身被重新加载页面元素可能更改。webdriver的目标是提供一个设计良好的面向对象的API,提供了更好的支持现代先进的web-app测试。

WebDriver与Selenium-RC相比,是如何来驱动浏览器的?

selenium RC 的工作方式是为每一个支持的浏览器注入JavaScript函数,能过浏览器加载,然后在浏览器中使用javascripts来驱动AUT。

webdriver的不使用这种技术,它直接调用每个浏览器内置的自动化支持;对于不同浏览器的调用取决于浏览器本身,每个浏览器驱动的信息将会在后面的章节介绍。

webdriver 与selenium–server

你可能不需要selenium-server,这要看你怎么用selenium-webdriver了;如果你只使用webdriver的API ,那么是不需要selenium-server 的;如果你的测试和浏览器在同一台机器上运行,并且只使用webdriver的API ,那么也是不需要selenium-server的,webdriver 将直接运行浏览器。

但在有些情况下, Selenium-WebDriver是需要用到Selenium-Server 的:

  • 您正在使用Selenium-Grid测试分发到多台机器或虚拟机(VM)。

  • 你连接到一台远程的计算机上,在一个特定有浏览器版本上运行

  • 你不想用java(Python, C#, or Ruby)绑定,而想用HtmlUnit Driver

selenium官方加上第三方宣布支持的驱动有很多种;除了PC端的浏览器之外,还支持iphone、android的driver;大概记录一下selenium支持的各种driver的用途与说明。

selenium可支持的PC浏览器驱动包括:

  • Firefox driver【包含在各自语言的客户端里】
  • safari driver【包含在selenium server中】
  • ie driver
  • chrome driver 【第三方】
  • opera driver【第三方】

selenium可支持的伪浏览器驱动:

  • PhantomJS Driver【第三方】
  • HtmlUnit Driver【包含在selenium server中】

selenium可支持的移动端驱动:

  • Windows Phone driver 【第三方】
  • Selendroid -Selenium for Android【第三方】
  • ios-driver 【第三方】
  • Appium 支持iphone、ipad、android、FirefoxOS【第三方】

上述的所有驱动不仅可以直接通过各自语言客户端来调用,还是注册到selenium grid中进行分布式的远程调用。

因为移动端的driver都没有尝试过,所以就不做说明。PC端的driver都是基于浏览器的,主要分为2种类型:

一种是真实的浏览器driver

比如:safari、Firefox都是以插件形式驱动浏览器本身的;ie、chrome都是通过二进制文件来驱动浏览器本身的;

这些driver都是直接启动并通过调用浏览器的底层接口来驱动浏览器的,因此具有最真实的用户场景模拟,主要用于进行web的兼容性测试使用。

一种是伪浏览器driver

selenium支持的伪浏览器包括htmlunit、PhantomJS;他们都不是真正的在浏览器、都没有GUI,而是具有支持html、js等解析能力的类浏览器程序;这些程序不会渲染出网页的显示内容,但是支持页面元素的查找、JS的执行等;由于不进行css及GUI渲染,所以运行效率上会比真实浏览器要快很多,主要用在功能性测试上面。

htmlunit是java实现的类浏览器程序,包含在selenium server中,无需驱动,直接实例化即可;其js的解析引擎是Rhino

PhantomJS是第三方的一个独立类浏览器应用,可以支持html、js、css等执行;其驱动是Ghost driver在1.9.3版本之后已经打包进了主程序中,因此只要下载一个主程序即可;其js的解析引擎是chrome 的V8。

driver类型 优点 缺点 应用
真实浏览器driver 真实模拟用户行为 效率、稳定性低 兼容性测试
HtmlUnit 速度快 js引擎不是主流的浏览器支持的 包含少量js的页面测试
PhantomJS 速度中等、模拟行为接近真实 不能模拟不同/特定浏览器的行为 非GUI的功能性测试

PS:除上述的几种真实浏览器driver中,也可以通过不同的手段来取消浏览器的css解析、界面渲染等目的;这样既可以保证浏览器的真实兼容性、也可以提高执行效率问题;使用的手段有:autoit、pyvirtualdisplay、浏览器设置等。

几种PC端driver的效率比较

from selenium import webdriver  
import time  
  
  
drivers = ['HtmlUnit', 'PhantomJS', 'Chrome', 'FF', 'IE']   
  
dervers_time = {  
    'HtmlUnit' : 0,  
    'PhantomJS' : 0,  
    'Chrome' : 0,  
    'FF' : 0,  
    'IE' : 0,  
}  
times = 50  
def run_with_Chrome():  
    common_step(webdriver.Chrome())  
  
def run_with_FF():  
    common_step(webdriver.Firefox())  
      
def run_with_IE():  
    common_step(webdriver.Ie())  
  
def run_with_PhantomJS():  
    common_step(webdriver.PhantomJS(executable_path=r'C:\Python27\Scripts\phantomjs.exe'))  
      
def run_with_HtmlUnit():  
    driver = webdriver.Remote("http://localhost:4444/wd/hub",   
                                desired_capabilities=webdriver.DesiredCapabilities.HTMLUNIT)  
    common_step(driver)  
      
def common_step(driver):  
    driver.get('http://www.baidu.com')  
    ele = driver.find_element_by_id('su')  
    print ele.get_attribute('value')  
    driver.quit()  
  
for i in range(times):  
    print '=============Times %s============' % i  
    for driver in drivers:  
        start = time.time()   
        print start  
        eval('run_with_%s()'%driver)  
        end = time.time()   
        print end  
        elapse_time = end-start  
        dervers_time[driver] += elapse_time  
        print 'elapse for %s:%s' % (driver, elapse_time)  
      
for k,v in dervers_time.items():  
    print 'avg elapse for %s in %s times:%s' % (k, times, v/times) 

得出的结果:
[133]selenium webdriver的各种driver_第1张图片

最快的依次是htmlunit、PhantomJS、chrome、ie、Firefox


HtmlUnit的驱动程序

这是目前最快,最轻量级的实施webdriver测试。正如它的名字所暗示的,这是基于HtmlUnit的。HtmlUnit是一个java实现基于web浏览器,没有图形用户界面。对于任何语言绑定(Java以外)Selenium服务器需要使用此驱动程序。

用法

driver = webdriver.Remote("http://localhost:4444/wd/hub", webdriver.DesiredCapabilities.HTMLUNIT))

优点

  • 在Webdriver执行自动化最快的方式
  • 一个纯Java的解决方案,因此它是独立于平台的。
  • 支持JavaScript的

缺点

  • 模拟其他浏览器的JavaScript行为(见下文)

使用remote WebDriver之前,需要先启动selenium server,命令如下:

java -jar selenium-server-standalone-2.x.x.jar

selenium server运行之后会看到如下信息:

15:43:07.541 INFO - RemoteWebDriver instances should connect to: http://127.0.0.1:4444/wd/hub

上面的信息指明了连接seleniumserver的地址http://127.0.0.1:4444/wd/hub,下面是实例代码:

from selenium.webdriver.common.desired_capabilities import DesiredCapabilities  
   
driver = webdriver.Remote(  
   command_executor='http://127.0.0.1:4444/wd/hub',  
   desired_capabilities=DesiredCapabilities.CHROME)  
   
driver = webdriver.Remote(  
   command_executor='http://127.0.0.1:4444/wd/hub',  
   desired_capabilities=DesiredCapabilities.OPERA)  
   
driver = webdriver.Remote(  
   command_executor='http://127.0.0.1:4444/wd/hub',  
   desired_capabilities=DesiredCapabilities.HTMLUNITWITHJS)  

Desiredcapabilities是字典类型,因此除了使用默认值,也可以重新定义字典的值,代码如下:

driver = webdriver.Remote(  
   command_executor='http://127.0.0.1:4444/wd/hub',  
   desired_capabilities={'browserName':'htmlunit',  
                         'version':'2',  
                        'javascriptEnabled':True})

HtmlUnit驱动器JavaScript

没有流行的浏览器使用JavaScript引擎,使用HtmlUnit(Rhino)。

如果你使用HtmlUnit测试JavaScript ,相比其他浏览 结果可能会不一样。

当我们说JavaScript,其实我们说的是JavaScript和DOM。虽然DOM是由W3C定义的,每个浏览器都有自己特点和差异,HtmlUnit 有一套完整的实现DOM的方案,能很好的支持JavaScript ,但有别与其他浏览器,和W3C标准的主流浏览器的DOM的实现存在差异,尽管其模仿其有他浏览器的能力。

在webdriver ,我们选择使用HtmlUnit来测试Javascript ,不过这样存在问题和风险,但有越来越多的网站依赖于JavaScript ,我们采取了保守的做法,HtmlUnit默认情况下禁用JavaScript 。在webdriver的HtmlUnit的每个版本,我们重新评估这一决定:我们希望在一些点上HtmlUnit的默认情况下启用JavaScript。

启用JavaScript

启用JavaScript的支持是很容易的:

driver = webdriver.Remote("http://localhost:4444/wd/hub", webdriver.DesiredCapabilities.HTMLUNITWITHJS)

这将导致HtmlUnit的驱动程序默认情况下,模拟火狐3.6的JavaScript进行处理。

Firefox Driver

用Firefox的插件来控制火狐浏览器,firefox 配置文件使用selenium.xpi(插件)。默认情况下,需要修改一些设置(see the source to see which ones),火狐驱动是能够运行在Windows,Mac,Linux上进行测试。目前在版本3.6,10(这个版本早过时了)

用法

driver = webdriver.Firefox()

优点

  • 在一个真正的浏览器上运行,并支持JavaScript的
  • 速度比Internet Explorer的驱动程序快

缺点

  • 比HtmlUnit的驱动程序慢

我们在Firefox Driver开发功能。例如,直到我们感觉本机事件为Linux上的Firefox是稳定的,他们是默认情况下禁用。要启用它们:

profile = webdriver.FirefoxProfile()
profile.native_events_enabled = True
driver = webdriver.Firefox(profile)

信息

请参阅火狐部分维基页面的最新最先进的信息。

Internet Explorer Driver

该驱动程序控制.dll,因而只适用于Windows操作系统。每个selenium释放它的核心功能在xp下测试IE版本6,7和8,在Windows7下测试IE 9。

用法

driver = webdriver.Ie()

优点

  • 运行在一个真正的浏览器支持JavaScript与最终用户看到的所有的行为一致

缺点

  • 显然,Internet Explorer Driver只能在Windows上工作!
  • 相对缓慢(尽管仍然是相当快速的)
  • 本身不支持XPath的大多数版本。自动注入,这是明显慢于其他浏览器和进行比较时,在同一浏览器的CSS选择器变慢。
  • 本身不支持CSS版本6和7。
  • CSS选择器在IE 8和9是本地的,但这些浏览器不完全支持CSS3

信息

维基页面的最先进的最新信息,请参阅Internet Explorer的部分。请特别注意所需的配置部分。

Chrome驱动

Chrome驱动程序维护/支持Chrome 项目本身。webdriver的工作与Chrome通过的chromedriver二进制(Chrome项目的下载页面上找到)。你需要有两个chromedriver和安装一个版本的Chrome浏览器。为了webdriver的自动找到,chromedriver需要要放在系统的路径上。Chrome浏览器本身由chromedriver在默认安装路径找到。这些都可以通过环境变量覆盖。 有关更多信息,请参阅维基。

用法

driver = webdriver.Chrome()

优点

  • 在一个真正的浏览器上运行,并支持JavaScript的
  • 因为Chrome是基于Webkit的浏览器,Chrome Driver会允许您验证您的网站在Safari的测试效果。需要注意的是,因为浏览器使用其自己的V8 JavaScript引擎,而不是Safari浏览器的Nitro引擎,JavaScript的执行可能会有所不同。

缺点

  • 比HtmlUnit的驱动程序慢

信息

最先进的最新信息,请参阅我们的wiki。更多信息,也可以找到下载页面

获取与Chrome驱动程序运行

chromium驱动程序可执行文件下载 ,并按照其他的wiki页面上的说明

Opera Driver

见OperaDriver驱动器在上使用Opera驱动程序的信息的selenium维基wiki文章。

iPhone Driver

查看iPhone的驱动selenium维基上使用Mac的iOS驱动程序的信息,wiki文章。

Android Driver

查看Android的驱动程序 硒selenium维基采用了Android驱动程序的信息,wiki文章。

混合使用webdriver和RC技术

Webdriver替换selenium RC

webdriver的Java版本的selenium RC API提供了一种实现。这意味着,你可以使用Selenium-RC API和使用底层webdriver的技术。这主要是用于向后兼容。它允许那些使用selenium RC API的用户使用webdriver覆盖现有的测试套件。它提供帮助缓解迁移到selenium webdriver。此外,允许一个人使用这两个API,在相同的测试代码。

Selenium webdriver的使用是这样的:

优点

  • webdriver的和selenium的API允许并排存在
  • webdriver的迁移管理机制提供了一个简单的Selenium RC API
  • 不需要独立的Selenium RC服务器的运行

缺点

  • 不能支持每一个方法
  • 更多先进的selenium使用(using “browserbot” or other built-in JavaScript methods from Selenium Core)可能无法正常工作
  • 由于底层实现差异,有些方法可能会比较慢

备份webdriver与selenium

webdriver的尽可能多兼容selenium RC对浏览器的支持,同时仍然提供支持使用webdriver的API,所以为了您可以利用SeleneseCommandExecutor

Safari是支持这种方式,用下面的代码(确保禁用弹出窗口拦截功能):

这种方法目前有一些主要限制,尤其是findElements并不如预期般运作。此外,繁重的驱动浏览器,因为我们使用的是selenium 的核心,你的JavaScript沙箱限制。

运行独立Selenium服务器使用RemoteDrivers

从selenium 的下载页下载服务器独立.jar和可选的IEDriverServer。如果您打算使用Chrome,从Google Code上下载。

拆开IEDriverServer和(或)chromedriver,并把它们在$ PATH /%PATH% - Selenium服务器上的一个目录,这是应该能够IE / Chrome的处理请求,而无需额外的修改。

启动服务器的命令行

java -jar /selenium-server-standalone-.jar

如果你想使用原生的事件功能,表明在命令行上的选项

Dwebdriver.enable.native.events = 1

对于其他命令行选项,执行

java -jar /selenium-server-standalone-.jar -help

为了正常工作,应该允许以下端口传入的TCP连接:​​4444,7054-5(or twice as many ports as the number of concurrent instances you plan to run)。在Windows下,你可能需要以及疏通各种应用。


资源下载

所有版本chrome下载

是不是很难找到老版本的chrome?博主收集了几个下载chrome老版本的网站,其中哪个下载的是原版的就不得而知了。

http://www.slimjet.com/chrome/google-chrome-old-version.php

http://google_chrome.en.downloadastro.com/old_versions/

http://filehippo.com/zh/download_google_chrome/

http://www.chromedownloads.net/

下面这个网址大多是Mac的多些,Windows下的很缺,但是有好多其他的软件下载,可以去看看:http://google-chrome.en.uptodown.com/mac/old

所有版本firefox下载

火狐相对比较容易找,这里也贴出来其ftp链接:

http://ftp.mozilla.org/pub/firefox/releases/
https://download-installer.cdn.mozilla.net/pub/firefox/releases/

至于火狐的版本与selenium的对应关系,确实没有这方面合适的资料,不过建议selenium 2.53以及以下的朋友,用47以下的火狐。

所有版本chromedriver下载

chromedriver的版本也不容易找:

http://chromedriver.storage.googleapis.com/index.html

其中各版本下的notes.txt中说明了该版本以及以前一些版本支持的chrome浏览器版本,不过,老司机早就给你整理了一份一目了然的表格:

selenium之 chromedriver与chrome版本映射表

这样,该下载哪个版本的chrome与chromedriver是不是就很清楚了。

所有版本geckodriver下载

geckodriver下载仓库:https://github.com/mozilla/geckodriver/releases
在这里插入图片描述

所有版本selenium以及IEDriverServer下载

最后,当然还有selenium和IEDriverServer,Python版的selenium直接pip就可以了,下面的链接里主要是Java版的和.NET版的:

http://selenium-release.storage.googleapis.com/index.html

参考:https://www.cnblogs.com/fnng/archive/2013/06/16/3138283.html
https://blog.csdn.net/u013250071/article/details/78803230

你可能感兴趣的:(#,爬虫精选)