Selenum提供了多种策略进行网页中的元素定位,从而不用如urllib那样采用re正则表达式进行信息过滤。Selenium 提供一下API进行元素定位,你可以选用其中合适的方式来实现你的功能。

  • 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

 

因为在HTML中,只有id是唯一的,下面API返回一个列表。

  • 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

以上如果找不到对应属性的element,则会抛出异常NoSuchElementException

 

除了以上方便的公有定位方法,selenium也提供两个基本的四有定位方法: 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"

 

下面以如下XML为列子

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

 

ID定位

如果定位这个表,可通过find_element_by_id定位,但是如果该网页中不存在相关的的元素,则会抛出 “NoSuchElementException”这个异常

login_form = driver.find_element_by_id('loginForm')

 

Name定位

如果定位usernam和password输入框, 对应的异常是 NoSuchElementException。 由于在一个XML中,name不是唯一的,因此这个API返回第一个name属性匹配的元素。如果需要返回所有name属性匹配的元素则可采用API, find_elements_by_name

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

 

Xpath定位

如果没有合适的id和name进行定位,可以采用Xpath的方式。Xpath可以是绝对路径(不建议),也可以是相对路径。

Xpath定位方式定位同一个元素有多种方式,如以下三种方式都可以定位<form id="loginForm"> 表

login_form = driver.find_element_by_xpath("/html/body/form[1]")   # 绝对路径,不推荐
login_form = driver.find_element_by_xpath("//form[1]")                  # 返回第一个form
login_form = driver.find_element_by_xpath("//form[@id='loginForm']") # 返回id是“loginForm”的form

定位username可用以下方法

username = driver.find_element_by_xpath("//form[input/@name='username']") # 返回name是“username”的//form/input 元素
username = driver.find_element_by_xpath("//form[@id='loginForm']/input[1]") # 返回id = "loginForm"的表格的第一个input元素
username = driver.find_element_by_xpath("//input[@name='username']") #返回name是“username”的//input 元素,在本列中是唯一的,但是实际该元素不一定在form路劲下,也可能是其他元素

定位clear按钮

clear_button = driver.find_element_by_xpath("//input[@name='continue'][@type='button']")  #name是continue并且type是button的第一个input元素
clear_button = driver.find_element_by_xpath("//form[@id='loginForm']/input[4]") # loginForm中的第四个input元素

以上只是一些简单的例子,如果要学习更多的xpath定位,可以参考一下链接

同时,也有很多有用的插件

  • XPath Checker - suggests XPath and can be used to test XPath results.
  • Firebug - XPath suggestions are just one of the many powerful features of this very useful add-on.
  • XPath Helper - for Google Chrome

另一个xml源码

<html>
 <body>
  <h1>Welcome</h1>
  <p class="content">Site content goes here.</p>
  <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_link = driver.find_element_by_link_text('Continue')
continue_link = driver.find_element_by_partial_link_text('Conti')

Tag Name定位

heading1 = driver.find_element_by_tag_name('h1')

 

Class Name定位

content = driver.find_element_by_class_name('content')

 

CSS定位

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

更多CSS小窍门见 Sauce Labs has good documentation on CSS selectors.

posted on 2015-07-08 14:43  橘子季节  阅读(458)  评论(0编辑  收藏  举报