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定位,可以参考一下链接
- W3Schools XPath Tutorial
- W3C XPath Recommendation
- XPath Tutorial - with interactive examples.
同时,也有很多有用的插件
- 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.