返回介绍

译:selenium webdriver (python)

发布于 2019-12-21 13:29:00 字数 19004 浏览 933 评论 0 收藏 0

如果翻译的很烂,原文档地址:

http://docs.seleniumhq.org/docs/03_webdriver.jsp

selenium webdriver


注: 我们不断的更新这份文档,使这份文档更加正确和完善;这份文档相对来讲也是比较准确的。

webdriver的简介


硒2.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 webdriver项目


要安装selenium 之后需要建立一个项目,这样就可以使用selenium写程序了你如何做到这一点取决于你的编程语言和开发环境。 (这里只介绍python的环境配置)

Python


如果您正在使用Python测试自动化,那么你可能已经熟悉在Python开发。那么你可以使用下面的命令添加selenium到Python环境。

pip install selenium

关于更具体的环境配置可以参考我这篇文档:

http://www.cnblogs.com/fnng/archive/2013/05/29/3106515.html

关于python开发的学习超出了本文的范围,你可以通过python资源(官方文档及其它相关资料、书籍)来快速的帮助你使用python进行自动化。

从selenium 1.0迁移


对于那些谁已经使用Selenium 1.0编写的测试套件的同学,我们已经提供了如何迁移到Selenium 2.0的提示。Selenium 2.0的主要开发人员,写了一篇文章从Selenium 1.0迁移。我们作为附录。

从Selenium RC迁移到selenium webdriver:

http://docs.seleniumhq.org/docs/appendix_migrating_from_rc_to_webdriver.jsp

selenium webdriver的API介绍


注:这里只贴python语言的代码

webdriver的是一个Web应用程序测试自动化工具,用来验证程序是否如预期的那样执行。它的目的是提供一个友好的API,比selenium RC(1.0)API更容易使用,这将有助于使你的测试脚本更容易阅读和维护。它不依赖于任何特定的测试框架,所以它可以用户单元测试或者一个老式的“main”方法中。本节介绍webdriver的API,下面让我们来帮助你熟悉它。

如果你已经设置了项目,你就会发现,webdriver的作用跟其它库一样:它是完全独立的,你通常在使用之前不需要启动任何额外的进程,或者运行任何安装程序,如果使用Selenium-RC则要到代理服务器。

注:需要额外的驱动来使脚本在不同环境下运行:Chrome Driver, Opera Driver, Android Driver andiPhone Driver

现在我们来写一些代码。打开浏览器,输入谷歌网页,并在搜索框内输入“Cheese” 点击搜索,最后关闭浏览器。

from selenium import webdriverfrom selenium.common.exceptions import TimeoutExceptionfrom selenium.webdriver.support.ui import WebDriverWait # available since 2.4.0from selenium.webdriver.support import expected_conditions as EC # available since 2.26.0# Create a new instance of the Firefox driverdriver = webdriver.Firefox()# go to the google home pagedriver.get("http://www.google.com")# find the element that's name attribute is q (the google search box)inputElement = driver.find_element_by_name("q")# type in the searchinputElement.send_keys("Cheese!")# submit the form (although google automatically searches now without submitting)inputElement.submit()# the page is ajaxy so the title is originally this:print driver.titletry:    # we have to wait for the page to refresh, the last thing that seems to be updated is the title
    WebDriverWait(driver, 10).until(EC.title_contains("cheese!"))    # You should see "cheese! - Google Search"
    print driver.titlefinally:
    driver.quit()

在下面的章节中,您将了解更多有关如何使用webdriver的东西,如如何使用浏览器的前进和后退功能(这在selenium 1.0中不能被很好的支持);以及如何使用框架和窗口测试网站。我们将会提供了更深入的讨论和范例。

Selenium webdriver的API命令和操作


取回页面

你可能使用webdriver想要做的第一件事是导航到一个页面,通过“get”可以轻松的做到之一点

driver.get("http://www.google.com")

webdriver的运行依赖于几个因素:包括操作系统/浏览器的组合,有时可能需要等待页面加载。webdriver的在某些情况下,可能需要控制返回页面的开始与加载时间。为了确保脚本的稳定性,需要等待的元素(S)在页面中存在的 显性和隐性的等待。

定位UI元素(WebElements)


参考:

http://www.cnblogs.com/fnng/archive/2012/01/12/2321117.html

自动化要想模拟用户(人)的行为操作,首先需要识别并定位UI上的元素,每个元素都有特定属性,webdriver就是通过识别元素的属性来定位元素。

我们可以通过下面的一些属性或方法来定定位元素:

ID


这是最有效和最优选的方式来定位一个元素。常见的陷阱,开发人员可以为元素设置非唯一的ID ,或通过自动生成ID ,应该避免这种情况。

如何通过ID的方式定位一个元素,看下面这样的例子:

<div id="coolestWidgetEvah">...</div>element = driver.find_element_by_id("coolestWidgetEvah")orfrom selenium.webdriver.common.by import By
element = driver.find_element(by=By.ID, value="coolestWidgetEvah")

By class name


“class ”是指DOM元素的属性。但在实际使用中有很多相同类名的DOM元素,在发现多个相同类名的元素时,程序会默认选择最先找到的第一个元素。

如何通过类名找到一个元素,看下面的例子:

<div class="cheese">
<span>Cheddar</span>
</div>
<div class="cheese">
<span>Gouda</span>
</div>cheeses = driver.find_elements_by_class_name("cheese")orfrom selenium.webdriver.common.by import By
cheeses = driver.find_elements(By.CLASS_NAME, "cheese")

By tag name


DOM标签名称的元素。

具体方式如下面的例子:

<iframe src="..."></iframe>frame = driver.find_element_by_tag_name("iframe")orfrom selenium.webdriver.common.by import By
frame = driver.find_element(By.TAG_NAME, "iframe")
By name

查找并匹配元素的name属性


具体方式如下面的例子:

<input name="cheese" type="text"/>cheese = driver.find_element_by_name("cheese")orfrom selenium.webdriver.common.by import By

cheese = driver.find_element(By.NAME, "cheese")

By link text

通过链接文本找到元素匹配


例子如下:

<a href="http://www.google.com/search?q=cheese">cheese</a>>cheese = driver.find_element_by_link_text("cheese")or
 from selenium.webdriver.common.by import By
cheese = driver.find_element(By.LINK_TEXT, "cheese")
By Partial Link Text

通过查找部分链接文件匹配元素


例子如下:

<a href="http://www.google.com/search?q=cheese">search for cheese</a>>cheese = driver.find_element_by_partial_link_text("cheese")orfrom selenium.webdriver.common.by import By
cheese = driver.find_element(By.PARTIAL_LINK_TEXT, "cheese")

By CSS


通过CSS的定位策略。默认情况下本机浏览器支持CSS定位,所以,请参考W3C CSS选择器

<http://www.w3.org/TR/CSS/#selectors> 显示一般可用的CSS选择器的列表。如果浏览器没有原生支持CSS查询,可以使用Sizzle(Sizzle是一个纯javascript CSS选择器引擎)。目前,IE 6,7和FF3.0使用Sizzle的CSS查询引擎。

注意:不是所有浏览器对CSS的支持都是一样的,可能在一个浏览器中运行良好,切换到另一个浏览器则不然。

具体用法如下:

<div id="food">

<span class="dairy">milk</span>

<span class="dairy aged">cheese</span>

</div>

cheese = driver.find_element_by_css_selector("#food span.dairy.aged")orfrom selenium.webdriver.common.by import By cheese = driver.find_element(By.CSS_SELECTOR, "#food span.dairy.aged") By XPATH

在高的级别上,尽可能的使用一个浏览器原生的webdriver XPath 的功能。在一些没有本地的XPath支持的浏览器,我们已经提供了我们自己的实现。这可能会导致一些意想不到的行为,除非你知道各种XPath引擎的差异。

驱动

标签和属性名称

属性值

本地的XPath支持

HtmlUnit Driver

小写

当他们出现在HTML

Internet Explorer Driver

小写

当他们出现在HTML

没有

Firefox Driver

不区分大小写

当他们出现在HTML

这点抽象,对于下面这段HTML 代码来说:

<input type="text" name="example" />
<INPUT type="text" name="other" />inputs = driver.find_elements_by_xpath("//input")orfrom selenium.webdriver.common.by import By
inputs = driver.find_elements(By.XPATH, "//input")

不同驱动对大小写的支持:

XPath expression

HtmlUnit Driver

Firefox Driver

Internet Explorer Driver

//input

1 (“example”)

2

2

//INPUT

0

2

0

HTML元素有时并不需要显式地声明,因为他们默认为已知值的属性。例如,“input”的标签并不需要的“type”属性,因为它默认为“text”。webdriver使用XPath时,你不应该期望能够对这些隐含的属性相匹配。

使用JavaScript


你可以执行任意javascript来找到一个元素,只要你返回一个DOM元素,它将自动转换为一个WebElement对象。

简单的例子,在页面上加载了jQuery:

element = driver.execute_script("return $('.cheese')[0]")

在页面上的每一个标签查找所有输入元素:

labels = driver.find_elements_by_tag_name("label")

inputs = driver.execute_script(    "var labels = arguments[0], inputs = []; for (var i=0; i < labels.length; i++){" +    "inputs.push(document.getElementById(labels[i].getAttribute('for'))); } return inputs;", labels)

用户输入-填写表单


我们已经看到了如何将文字输入到一个文本或文本字段,但其他元素?您可以“切换”复选框的状态,你可以使用“点击”设置类似选择的选项标记。处理SELECT标签是不是太糟糕:

select = driver.find_element_by_tag_name("select")

allOptions = select.find_elements_by_tag_name("option")for option in allOptions:    print "Value is: " + option.get_attribute("value")

    option.click()

找到页面上第一个“select”的元素,并通过每个选项依次循环,打印出它们的值。你会发现,这不是最有效处理SELECT元素的方式。在webdriver的支持类中,有一个名为“select”,它提供了一些有用的方法,来处理这些交互。

# available since 2.12from selenium.webdriver.support.ui import Select

select = Select(driver.find_element_by_tag_name("select"))

select.deselect_all()

select.select_by_visible_text("Edam")

从页面上第一个选择开始取消所有选项,从第一个选择页面上的所有选项,然后选择显示的文本与“Edam” 的选项。

当你完成填写表格,你可能要提交。我们需要找到“提交”按钮,然后单击它:

driver.find_element_by_id("submit").click()

另外,有方便的方法可以在webdriver的每个元素上的“提交”。如果调用此表单内的元素,webdriver通过的DOM按顺序找到封闭的形式,然后调用该提交。如果该元素不是一种形式,那么会抛出NoSuchElementException异常:

element.submit()

移动Windows和框架(Frames)


一些web应用程序有许多框架或多个窗口。通过webdriver的“switchTo”方法可以对他们呢进行移动操作。

driver.switch_to_window("windowName")

调用驱动程序现在解释为被定向到特定的窗口。但是如何知道窗口的名字?以JavaScript或链接的方式打开它看看:

<a href="somewhere.html" target="windowName">Click here to open a new window</a>

另外,你也可以通过“window handle”的“switchTo().window()”方法。认识到这一点,那么就可以遍历所有打开的窗口,像这样:

for handle in driver.window_handles:

    driver.switch_to_window(handle)

还可以切换从frames到frames(或到iframe中):

driver.switch_to_frame("frameName")

访问子frames由一个圆点分隔的路径,并且可以通过其索引指定frames。是:

driver.switch_to_frame("frameName.0.child")

would go to the frame named “child” of the first subframe of the frame called “frameName”.All frames are evaluated as if from *top*. --实在不知道这个怎么翻译

弹出对话框


Selenium 2.0测试版一开始,内置有处理弹出对话框支持。当你触发一个动作,打开一个弹出框,您将得到以下提醒:

alert = driver.switch_to_alert()# usage: alert.dismiss(), etc.

这将返回当前打开的警报对象。有了这个对象,你现在可以接受,拒绝,读取其内容,甚至类型会得到一个提示。这个接口同样适用警告,确认和提示。参考到的JavaDoc 或RubyDocs的的更多信息。

导航:历史和位置


此前,我们介绍了webdriver的导航使用“get”命令

(driver.get(“http://www.example.com”)),我们在有些情况下是要用到导航栏前进和头退功能:

driver.get("http://www.example.com")  # python doesn't have driver.navigate

重申:“navigate().to()” 和 “get()” 的效果是一样的。一个只是很多比其他更容易输入!

你可以随意的使用浏览器历史记录中后退和前进功能:

driver.forward()

driver.back()

请注意,此功能完全依赖于底层浏览器。当你调用这些方法时,在不同的浏览器下可能会发生意想不到的事情

Cookies


你可能会非常感兴趣了解如何使用Cookie。首先,你需要知道cookie有效期。如果您想先预设的cookie,然后再开始与网站进行交互,你的主页很大/且需要一段时间来加载,一个办法是找到一个更小的网页来代替,通常404页小(http://example.com/some404page)

#转到正确的域

driver.get("http://www.example.com")

 

#现在在这里的整个域设置的cookie,

#这里的cookie的名称是'key',它的值是'value'的

driver.add_cookie({'name':'key', 'value':'value', 'path':'/'})# additional keys that can be passed in are:# 'domain' -> String,# 'secure' -> Boolean,# 'expiry' -> Milliseconds since the Epoch it should expire.# 现在的输出当前URL的所有可用的cookiesfor cookie in driver.get_cookies():    print "%s -> %s" % (cookie['name'], cookie['value'])# You can delete cookies in 2 ways# By namedriver.delete_cookie("CookieName")# Or all of themdriver.delete_all_cookies()

更改用户代理


这是很容易与Firefox的驱动程序:

拖放


下面是一个例子使用执行拖放动作类。本地事件事件需要被激活。

from selenium.webdriver.common.action_chains import ActionChains
element = driver.find_element_by_name("source")
target =  driver.find_element_by_name("target")

ActionChains(driver).drag_and_drop(element, target).perform()

驱动程序的细节和权衡

Selenium webdriver的驱动程序


参考:

http://www.cnblogs.com/fnng/archive/2012/02/10/2345187.html

webdriver的对于不同浏览器通过不同的接口实现;下面介绍这几种实现方式:

HtmlUnit的驱动程序


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

用法

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

优点

· 在Webdriver执行自动化最快的方式

· 一个纯Java的解决方案,因此它是独立于平台的。

· 支持JavaScript的

缺点

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

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的配置文件,它包含许多有用的扩展。有两种方式获得此配置文件。假设使用Firefox的配置文件管理器(火狐 ProfileManager),已创建配置:

另外,如果配置文件尚未在Firefox注册:

当我们正在开发firefox 启动的特性,我们能够正常使用。

正如我们在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驱动程序运行

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

Opera Driver

见歌剧院驱动器在上使用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 的下载页下载服务器独立<version>.jar和可选的IEDriverServer。如果您打算使用Chrome,从Google Code上下载。

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

启动服务器的命令行

java -jar <path_to>/selenium-server-standalone-<version>.jar

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

Dwebdriver.enable.native.events = 1

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

java -jar <path_to>/selenium-server-standalone-<version>.jar -help

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文