4.定位元素
有各种策略来定位页面中的元素。您可以使用最适合您的情况。Selenium提供了以下方法来定位页面中的元素:
- find_element_by_id
- find_element_by_name
- find_element_by_xpath
- find_element_by_link_text
- find_element_by_partial_link_text
- find_element_by_tag_name
- find_element_by_class_name
- find_element_by_css_selector
要查找多个元素(这些方法将返回一个列表):
- find_elements_by_name
- find_elements_by_xpath
- find_elements_by_link_text
- find_elements_by_partial_link_text
- find_elements_by_tag_name
- find_elements_by_class_name
- find_elements_by_css_selector
除了上面给出的公共方法之外,还有两个私有方法可能对页面对象中的定位器有用。这是两个私有方法:find_element和find_elements。
用法示例:
from selenium.webdriver.common.by import By
driver.find_element(By.XPATH, '//button[text()="Some text"]')
driver.find_elements(By.XPATH, '//button')
这些是By类可用的属性:
ID = "id"
XPATH = "xpath"
LINK_TEXT = "link text"
PARTIAL_LINK_TEXT = "partial link text"
NAME = "name"
TAG_NAME = "tag name"
CLASS_NAME = "class name"
CSS_SELECTOR = "css selector"
4.1。按ID定位
当您知道元素的id属性时使用此选项。使用此策略,将返回id属性值与位置匹配的第一个元素。如果没有元素具有匹配的id 属性,NoSuchElementException
则将引发a。
例如,请考虑此页面来源:
<html>
<body>
<form id="loginForm">
<input name="username" type="text" />
<input name="password" type="password" />
<input name="continue" type="submit" value="Login" />
</form>
</body>
<html>
表单元素可以像这样定位:
login_form = driver.find_element_by_id('loginForm')
4.2。按名称定位
当您知道元素的name属性时,请使用此选项。使用此策略,将返回名称属性值与位置匹配的第一个元素。如果没有元素具有匹配的name 属性,NoSuchElementException
则将引发a。
例如,请考虑此页面来源:
<html>
<body>
<form id="loginForm">
<input name="username" type="text" />
<input name="password" type="password" />
<input name="continue" type="submit" value="Login" />
<input name="continue" type="button" value="Clear" />
</form>
</body>
<html>
用户名和密码元素可以像这样定位:
username = driver.find_element_by_name('username')
password = driver.find_element_by_name('password')
这将在“清除”按钮之前显示“登录”按钮:
continue = driver.find_element_by_name('continue')
4.3。通过XPath定位
XPath是用于在XML文档中定位节点的语言。由于HTML可以是XML(XHTML)的实现,因此Selenium用户可以利用这种强大的语言来定位其Web应用程序中的元素。XPath扩展(以及支持)通过id或name属性定位的简单方法,并打开各种新的可能性,例如在页面上找到第三个复选框。
使用XPath的主要原因之一是当您没有适合您要查找的元素的id或name属性时。您可以使用XPath以绝对术语(不建议)或相对于具有id或name属性的元素来定位元素。XPath定位器还可用于通过id和name以外的属性指定元素。
绝对XPath包含来自根(html)的所有元素的位置,因此可能会失败,只需对应用程序进行最轻微的调整。通过查找具有id或name属性的附近元素(理想情况下是父元素),您可以根据关系找到目标元素。这不太可能改变,可以使您的测试更加健壮。
例如,请考虑此页面来源:
<html>
<body>
<form id="loginForm">
<input name="username" type="text" />
<input name="password" type="password" />
<input name="continue" type="submit" value="Login" />
<input name="continue" type="button" value="Clear" />
</form>
</body>
<html>
表单元素可以像这样定位:
login_form = driver.find_element_by_xpath("/html/body/form[1]")
login_form = driver.find_element_by_xpath("//form[1]")
login_form = driver.find_element_by_xpath("//form[@id='loginForm']")
- 绝对路径(如果HTML仅稍微更改,则会中断)
- HTML中的第一个表单元素
- 具有名为id的属性和值loginForm的表单元素
username元素可以像这样定位:
username = driver.find_element_by_xpath("//form[input/@name='username']")
username = driver.find_element_by_xpath("//form[@id='loginForm']/input[1]")
username = driver.find_element_by_xpath("//input[@name='username']")
- 第一个表单元素,带有一个输入子元素,其属性名为 name,值为username
- 表单元素的第一个输入子元素,其属性名为 id,值为loginForm
- 第一个输入元素,其属性名为“name”,值为 username
“清除”按钮元素可以像这样定位:
clear_button = driver.find_element_by_xpath("//input[@name='continue'][@type='button']")
clear_button = driver.find_element_by_xpath("//form[@id='loginForm']/input[4]")
- 输入名为name的属性,值为continue,属性名为type,值为button
- 表单元素的第四个输入子元素,其属性名为 id,值为loginForm
这些示例涵盖了一些基础知识,但为了了解更多信息,建议使用以下参考:
- W3Schools XPath教程
- W3C XPath建议书
- XPath教程 - 使用交互式示例。
还有一些非常有用的附加组件可以帮助发现元素的XPath:
- XPath Checker - 建议XPath,可用于测试XPath结果。
- Firebug - XPath建议只是这个非常有用的附加组件的众多强大功能之一。
- XPath Helper - 适用于谷歌浏览器
4.4。通过链接文本定位超链接
当您知道锚标记中使用的链接文本时,请使用此选项。使用此策略,将返回链接文本值与位置匹配的第一个元素。如果没有元素具有匹配的链接文本属性,NoSuchElementException
则将引发a。
例如,请考虑此页面来源:
<html>
<body>
<p>Are you sure you want to do this?</p>
<a href="continue.html">Continue</a>
<a href="cancel.html">Cancel</a>
</body>
<html>
continue.html链接可以像这样定位:
continue_link = driver.find_element_by_link_text('Continue')
continue_link = driver.find_element_by_partial_link_text('Conti')
4.5。按标签名称定位元素
如果要按标签名称查找元素,请使用此选项。使用此策略,将返回具有给定标记名称的第一个元素。如果没有元素具有匹配的标记名称,NoSuchElementException
则将引发a。
例如,请考虑此页面来源:
<html>
<body>
<h1>Welcome</h1>
<p>Site content goes here.</p>
</body>
<html>
标题(h1)元素可以像这样定位:
heading1 = driver.find_element_by_tag_name('h1')
4.6。按类名定位元素
如果要按类属性名称定位元素,请使用此选项。使用此策略,将返回具有匹配类属性名称的第一个元素。如果没有元素具有匹配的类属性名称,NoSuchElementException
则将引发a。
例如,请考虑此页面来源:
<html>
<body>
<p class="content">Site content goes here.</p>
</body>
<html>
“p”元素可以像这样定位:
content = driver.find_element_by_class_name('content')
4.7。通过CSS选择器定位元素
如果要通过CSS选择器语法查找元素,请使用此选项。使用此策略,将返回具有匹配的CSS选择器的第一个元素。如果没有元素具有匹配的CSS选择器,NoSuchElementException
则将引发a。
例如,请考虑此页面来源:
<html>
<body>
<p class="content">Site content goes here.</p>
</body>
<html>
“p”元素可以像这样定位:
content = driver.find_element_by_css_selector('p.content')
Sauce Labs有很好的 CSS选择器文档