selenium官方文档、API 翻译(二):获取页面、定位UI元素(WebElements)

@高效码农  May 1, 2019

通过示例介绍Selenium-WebDriver API

--------------------------------------------------------------------------------------------------

WebDriver是一种用于自动化Web应用程序测试的工具,特别是用于验证它们是否按预期工作。它旨在提供一个易于探索和理解的友好API,比Selenium-RC(1.0)API更易于使用,这将有助于使您的测试更易于阅读和维护。它不依赖于任何特定的测试框架,因此它可以在单元测试项目中使用,也可以从普通的“主”方法中使用。本节介绍WebDriver的API,帮助您开始熟悉它。首先,如果您还没有设置WebDriver项目。这在上一节“ 设置Selenium-WebDriver项目”中有所描述。

设置项目后,您可以看到WebDriver的行为与任何普通库一样:它完全是自包含的,您通常不需要记住在使用它之前启动任何其他进程或运行任何安装程序,而不是使用Selenium-RC到代理服务器。

注意:使用ChromeDriverOpera DriverAndroid DriveriOS Driver需要执行其他步骤

你现在准备写一些代码了。一个简单的入门方法就是这个例子,它在Google上搜索术语“Cheese”(由于众所周知的原因,我们的列子是在百度上搜索“高效码农”),然后将结果页面的标题输出到控制台。

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait # 从2.4.0起可用
from selenium.webdriver.support import expected_conditions as EC # 自2.26.0起可用

# 创建Chrome驱动程序的新实例
driver = webdriver.Chrome()

# 转到百度主页
driver.get("https://www.baidu.com")

# 打印页面title
print(driver.title)

# 找到id属性为kw的元素(百度搜索框)
inputElement = driver.find_element_by_id("kw")

# 输入搜索内容
inputElement.send_keys("高效码农")

# 提交表单
inputElement.submit()

try:
    # 我们必须等待页面刷新,似乎更新的最后一件事是标题
    WebDriverWait(driver, 10).until(EC.title_contains("高效码农"))

    # 你应该看到"高效码农 -  百度搜索"
    print(driver.title)

finally:
    # 退出驱动关闭所有窗口
    driver.quit()

Selenium-WebDriver API命令和操作

1、获取页面

--------------------------------------------------------------------------------------------------
您可能想要使用WebDriver做的第一件事是导航到页面。执行此操作的常规方法是调用"get":

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

由于系统和浏览器的差异,WebDriver可能会也可能不会等待页面加载。在某些情况下,WebDriver可能会在页面完成甚至开始加载之前返回控件。为确保稳健性,您需要使用显式和隐式等待等待页面中存在的元素 。

2、定位UI元素(WebElements)

--------------------------------------------------------------------------------------------------
WebDriver中的定位元素可以使用WebDriver实例本身或WebElement上完成。 每个语言绑定都公开“查找元素”和“查找元素列表”方法。 前者返回与查询匹配的WebElement对象,如果找不到这样的元素,则抛出异常。 后者返回WebElements列表,如果没有DOM元素与查询匹配,则可能为空。
“Find”方法采用名为“By”的定位器或查询对象。 “By”策略列在下面:

2.1、By ID

这是定位元素的最有效和首选方式。UI开发人员常见的缺陷是在页面上具有非唯一ID或自动生成id,两者都应该避免。html元素上的类比自动生成的id更合适。

如何查找如下所示元素的示例:

<div id="coolestWidgetEvah">...</div>

Python举例:

element = driver.find_element_by_id("coolestWidgetEvah")

或者

from selenium.webdriver.common.by import By
element = driver.find_element(by=By.ID, value="coolestWidgetEvah")
2.2、By Class Name

在这种情况下,“Class”是指DOM元素上的属性。通常在实际使用中有许多具有相同类名的DOM元素,因此找到多个元素变得比找到第一个元素更实用。

如何查找如下所示元素的示例:

<div class="cheese"><span>Cheddar</span></div><div class="cheese"><span>Gouda</span></div>

Python举例:

cheeses = driver.find_elements_by_class_name("cheese")

或者

from selenium.webdriver.common.by import By
cheeses = driver.find_elements(By.CLASS_NAME, "cheese")
2.3、By Tag Name

DOM标签元素的名称。

如何查找如下所示元素的示例:

<iframe src="..."></iframe>

Python举例:

frame = driver.find_element_by_tag_name("iframe")

或者

from selenium.webdriver.common.by import By
frame = driver.find_element(By.TAG_NAME, "iframe")
2.4、By Name

找到具有匹配name属性的input元素。

如何查找如下所示元素的示例:

<input name="cheese" type="text"/>

Python举例:

cheese = driver.find_element_by_name("cheese")

或者

from selenium.webdriver.common.by import By
cheese = driver.find_element(By.NAME, "cheese")
2.5、By Link Text

找到具有匹配可见文本的link元素。

如何查找如下所示元素的示例:

<a href="http://www.google.com/search?q=cheese">cheese</a>

Python举例:

cheese = driver.find_element_by_link_text("cheese")

或者

from selenium.webdriver.common.by import By
cheese = driver.find_element(By.LINK_TEXT, "cheese")
2.6、By Partial Link Text

找到部分匹配可见文本的链接元素。

如何查找如下所示元素的示例:

<a href="http://www.google.com/search?q=cheese">search for cheese</a>

Python举例:

cheese = driver.find_element_by_partial_link_text("cheese")

或者

from selenium.webdriver.common.by import By
cheese = driver.find_element(By.PARTIAL_LINK_TEXT, "cheese")
2.7、By CSS

默认情况下使用本机浏览器支持,因此请参阅w3c css选择器以获取通常可用的css选择器列表。 如果浏览器没有css查询的本机支持,则使用Sizzle。 IE 6,7和FF3.0目前使用Sizzle作为css查询引擎。

请注意,并非所有浏览器都是相同的,一些可能在一个版本中工作的CSS可能在另一个版本中不起作用。

找到下面的cheese 的例子:

<div id="food"><span class="dairy">milk</span><span class="dairy aged">cheese</span></div>

Python举例:

cheese = driver.find_element_by_css_selector("#food span.dairy.aged")

或者

from selenium.webdriver.common.by import By
cheese = driver.find_element(By.CSS_SELECTOR, "#food span.dairy.aged")
2.8、By XPath

在较高的层面上,WebDriver尽可能使用浏览器的本机XPath功能。 在那些没有本机XPath支持的浏览器上,我们提供了自己的实现。 除非您了解各种XPath引擎中的差异,否则这可能会导致一些意外行为。

DriverTag and Attribute NameAttribute ValuesNative XPath Support
HtmlUnit DriverLower-casedAs they appear in the HTMLYes
Internet Explorer DriverLower-casedAs they appear in the HTMLNo
Firefox DriverCase insensitiveAs they appear in the HTMLYes

这有点抽象,所以对于下面的HTML:

<input type="text" name="example" />
<INPUT type="text" name="other" />

Python举例:

inputs = driver.find_elements_by_xpath("//input")

或者

from selenium.webdriver.common.by import By
inputs = driver.find_elements(By.XPATH, "//input")

将找到以下匹配:

XPath expressionHtmlUnit DriverFirefox DriverInternet Explorer Driver
//input1 (“example”)22
//INPUT020

有时,HTML元素不需要显式声明属性,因为它们将默认为已知值。 例如,“input”标记不需要“type”属性,因为它默认为“text”。 在WebDriver中使用xpath时的经验法则是,您不应期望能够匹配这些隐式属性。

2.9、使用JavaScript

您可以执行任意javascript来查找元素,只要返回DOM元素,它就会自动转换为WebElement对象。

加载jQuery的页面上的简单示例:

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


添加新评论