Selenium with Python中文翻译(四)

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_elementfind_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将会被触发:
例如,下面是网页的源码:

<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')

4.2.通过name属性来定位元素
如果你知道了元素的name属性那么你可以用这种方法。利用这种方法,将会返回第一个和你所给的name属性相匹配的元素。如果没有元素匹配到所给的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和passwd的元素可以以如下方式找到:

username = driver.find_element_by_name('username')
password = driver.find_element_by_name('password')

这将会在“Clear”按钮找到之前找到“Login”按钮:

continue = driver.find_element_by_name('continue')

4.3.通过Xpath来定位元素
Xpath是一种运用于XML文档中来寻找节点的语言。由于HTML是XML的另一种实现,Selenium用户可以在web请求中运用这种强而有力的语言。Xpath拓展实支持简单的通过id和name属性查找元素的方法,并打开了各种新的可能性比如定位到页面上的第三个选择框。
一个使用Xpath的主要的原因就是你在定位元素时并不需要合适的id和name属性。通过Xpath你甚至可以用绝对地址来定位元素,或者找到没有id和那么属性的元素。Xpath使用者可以通过其它的属性来定位元素(并不是只通过id和那么属性)。
绝对Xpaths包含了所有来自“根”的元素,因此做一些微小的调整很有可能导致程序查找失败。通过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. 绝对地址
  2. HTML中第一个form元素
  3. 第一个id名为loginForm属性的元素

可以像下面这样定位到用户名元素:

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元素的name属性值为username的input子元素
  2. 第一个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和type属性值为button的input元素
  2. form元素中第四个id属性值为loginForm的input子元素

这些只是一些基础的例子,如果想了解更多,可以点击下面的资源:

还有一些附加插件能够帮助你发现一个元素的Xpath:

  • XPath Checker -Xpath使用建议以及对于Xpath结果的测试。
  • Firebug -Xpath使用建议只是这个功能强大的插件中的一个功能
  • XPath Helper-为谷歌浏览器而生的附加插件。

4.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')

4.5.通过标签名来定位元素
如果你知道了元素的标签名那么你可以用这种方法。利用这种方法,将会返回第一个和你所给的标签名相匹配的元素。如果没有元素匹配到所给的标签名,NoSuchElementException将会被触发:
例如,下面是网页的源码:

<html>
 <body>
  <h1>Welcome</h1>
  <p>Site content goes here.</p>
</body>
<html>

下面的例子可以找到h1元素:

heading1 = driver.find_element_by_tag_name('h1')

4.6.通过Class属性名来定位元素
如果你知道了元素的class属性名那么你可以用这种方法。利用这种方法,将会返回第一个和你所给的class属性名相匹配的元素。如果没有元素匹配到所给的class属性名,NoSuchElementException将会被触发:
例如,下面是网页的源码:

<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将会被触发:
例如,下面是网页的源码:

<html>
 <body>
  <p class="content">Site content goes here.</p>
</body>
<html>

下面的例子将会定位到p元素:

content = driver.find_element_by_css_selector('p.content')

关于CSS选择器这里有一个好的文档。

如有错误,敬请指出!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值