元素定位
提供很多种方式去定位页面的元素。可以从中选择一个适合的用于测试。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[test()="Some text"]')
driver.find_elements(By.XPATH, '//button')
这些都是类可用的属性:
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"
1.使用ID定位
当你知道元素的id属性时,可以用ID定位。这种方式,将返回第一个和ID属性匹配的元素。如果没有匹配的元素,将会触发NoSuchElementException异常. 例如,参考这个页面的源代码:
<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>
可以通过下面方式定位form元素: login_form = driver.find_element_by_id('loginForm')
2.使用名称定位
当知道元素的名称属性时,可以通过名称的方式定位。这种方式,将返回第一个和name属性匹配的元素。如果没有匹配的元素,将触发NoSuchElementException异常。 例如,参考页源码:
<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和password元素可以通过下面的方式定位:
username = driver.find_element_by_name('username')
password = driver.find_element_by_name('password')
这样在“Clear"按钮之前,“login”按钮将先被获取:
continue = driver.find_element_by_name('continue')
3.使用Xpath定位
Xpath是XML文档中定于节点的语言。HTML可以看做是XML的一种实现,Selenium可以通过这一强大的语言去定位web应用的元素。XPath定位方法超过了id和name定位方法,它可以实现一些更多的定位可能,比如定位页面中第三个复选框。
使用Xpath定位一个很大原因是需要定位一个没有合适的is/name的元素。XPath可以定位相对路径的元素,还可以定位有id/name的元素。Xpath还可以用于指定通过id/name定位的元素。
XPaths可以获取所有root(html)中的元素的位置,虽然结果可能会失败,但对APP基本不会造成影响。可以借助通过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>
form元素可以通过以下方式定位:
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']")
- 1.绝对路径(只对HTML可能造成轻微影响)
- 2.HTML中第一个form元素
- 3.通过表单元素的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']")
- 1.通过第一个form元素的input子元素中name属性为"username"的元素定位
- 2.通过name属性为"loginForm"的form元素的input元素的第一个子元素定位
- 3.通第一个name属性为”username"的input元素定位
“Clear"元素可以通过以下方式定位:
clear_button = driver.find_element_by_xpath("//input[@name='continue'][@type='button']")
clear_button = driver.find_element_by_xpath("//form[@id='loginForm']/input[4]")
- 1.通过name属性为”continue"的input元素中name属性为"button"的元素定位。
- 2.通过id值为'loginForm'的form元素的第4个input子元素定位
上面的例子基本覆盖了基本用法,如果想了解更多,可以参考一下链接:
- W3Schools Xpath Tutorial (Thanks Jennifer for the original link invalid reminder.It's updated now)
- W3C Xpath Recommendition
- XPath Tutorial
也有几个非常有用的附加组件,可帮助通过XPath定位元素: XPath Checker Firebug * XPath Helper
4.通过链接文本定位超链接
当你知道一个锚点的链接文本,可以通过下面方式定位。这种方式,会返回第一个匹配的位置。如果没有匹配的元素,将会触发NoSuchElementException异常。
参考一下页源码:
<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')
5.通过Tag Name定位元素
当知道tag name的情况下,可以通过tag name去定位元素。同样,这个方式只会返回第一个匹配tagname的元素。如果找不到,同样会触发NoSuchElementException异常。
页源码参考如下:
<html>
<body>
<h1>Welcome</h1>
<p>Site content goes here.</p>
</body>
<html>
h1元素可以这样定位:
heading1 = driver.find_element_by_tag_name('h1')
6.通过class name定位元素
下面的方式可以通过class name属性去定位元素。同样会返回第一个匹配的元素。如果找不到元素,就会触发NoSuchElementException异常。
页源码参考如下:
<html>
<body>
<p class="content">Site content goes here.</p>
</body>
<html>
元素“p"可以通过下面的方式定位:
content = driver.find_element_by_class_name('content')
7.通过CSS选择器定位元素
使用下面的方式,可以通过CSS选择器去定位元素。同样,该方式也是返回第一个匹配CSS选择器的元素。如果没有匹配的元素,则触发NoSuchElementException异常。 页面源码参考如下:
<html>
<body>
<p class="content">Site content goes here.</p>
</body>
<html>
元素”p"可以通过下面的方式定位:
content = driver.find_element_by_css_selector('p.content')
Top^
上一篇Selenium主题3 下一篇Selenium主题5