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浏览器驱动包括:
selenium可支持的伪浏览器驱动:
selenium可支持的移动端驱动:
上述的所有驱动不仅可以直接通过各自语言客户端来调用,还是注册到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)
最快的依次是htmlunit、PhantomJS、chrome、ie、Firefox
这是目前最快,最轻量级的实施webdriver测试。正如它的名字所暗示的,这是基于HtmlUnit的。HtmlUnit是一个java实现基于web浏览器,没有图形用户界面。对于任何语言绑定(Java以外)Selenium服务器需要使用此驱动程序。
用法
driver = webdriver.Remote("http://localhost:4444/wd/hub", webdriver.DesiredCapabilities.HTMLUNIT))
优点
缺点
使用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的插件来控制火狐浏览器,firefox 配置文件使用selenium.xpi(插件)。默认情况下,需要修改一些设置(see the source to see which ones),火狐驱动是能够运行在Windows,Mac,Linux上进行测试。目前在版本3.6,10(这个版本早过时了)
用法
driver = webdriver.Firefox()
优点
缺点
我们在Firefox Driver开发功能。例如,直到我们感觉本机事件为Linux上的Firefox是稳定的,他们是默认情况下禁用。要启用它们:
profile = webdriver.FirefoxProfile()
profile.native_events_enabled = True
driver = webdriver.Firefox(profile)
信息
请参阅火狐部分维基页面的最新最先进的信息。
该驱动程序控制.dll,因而只适用于Windows操作系统。每个selenium释放它的核心功能在xp下测试IE版本6,7和8,在Windows7下测试IE 9。
用法
driver = webdriver.Ie()
优点
缺点
信息
维基页面的最先进的最新信息,请参阅Internet Explorer的部分。请特别注意所需的配置部分。
Chrome驱动程序维护/支持Chrome 项目本身。webdriver的工作与Chrome通过的chromedriver二进制(Chrome项目的下载页面上找到)。你需要有两个chromedriver和安装一个版本的Chrome浏览器。为了webdriver的自动找到,chromedriver需要要放在系统的路径上。Chrome浏览器本身由chromedriver在默认安装路径找到。这些都可以通过环境变量覆盖。 有关更多信息,请参阅维基。
用法
driver = webdriver.Chrome()
优点
缺点
信息
最先进的最新信息,请参阅我们的wiki。更多信息,也可以找到下载页面
获取与Chrome驱动程序运行
chromium驱动程序可执行文件下载 ,并按照其他的wiki页面上的说明
Opera Driver
见OperaDriver驱动器在上使用Opera驱动程序的信息的selenium维基wiki文章。
iPhone Driver
查看iPhone的驱动selenium维基上使用Mac的iOS驱动程序的信息,wiki文章。
Android Driver
查看Android的驱动程序 硒selenium维基采用了Android驱动程序的信息,wiki文章。
Webdriver替换selenium RC
webdriver的Java版本的selenium RC API提供了一种实现。这意味着,你可以使用Selenium-RC API和使用底层webdriver的技术。这主要是用于向后兼容。它允许那些使用selenium RC API的用户使用webdriver覆盖现有的测试套件。它提供帮助缓解迁移到selenium webdriver。此外,允许一个人使用这两个API,在相同的测试代码。
Selenium webdriver的使用是这样的:
优点
缺点
备份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老版本的网站,其中哪个下载的是原版的就不得而知了。
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
火狐相对比较容易找,这里也贴出来其ftp链接:
http://ftp.mozilla.org/pub/firefox/releases/
https://download-installer.cdn.mozilla.net/pub/firefox/releases/
至于火狐的版本与selenium的对应关系,确实没有这方面合适的资料,不过建议selenium 2.53以及以下的朋友,用47以下的火狐。
chromedriver的版本也不容易找:
http://chromedriver.storage.googleapis.com/index.html
其中各版本下的notes.txt中说明了该版本以及以前一些版本支持的chrome浏览器版本,不过,老司机早就给你整理了一份一目了然的表格:
selenium之 chromedriver与chrome版本映射表
这样,该下载哪个版本的chrome与chromedriver是不是就很清楚了。
geckodriver下载仓库:https://github.com/mozilla/geckodriver/releases
最后,当然还有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