元素定位

提供很多种方式去定位页面的元素。可以从中选择一个适合的用于测试。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子元素定位

上面的例子基本覆盖了基本用法,如果想了解更多,可以参考一下链接:

也有几个非常有用的附加组件,可帮助通过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

by 李鹏