webdriver 提供了八种元素定位方法:
·id
·name
·class name
·tag name
·link text
·partial link text
·xpath
·css selector
在 Python 语言中对应的定位方法如下:
1- id定位
通过页面元素的id属性进行元素的定位。
find_element_by_id()方法返回与ID属性值匹配的一个元素。
find_elements_by_id()方法返回一组元素。
driver.find_element_by_id("su")
driver.find_elements_by_id("su")
2- name定位
通过页面元素的name属性进行元素的定位。如果name值匹配成功可返回定位的元素;反之,则抛出NoSuchElementException的异常
常用方法:
find_element_by_name() 和find_elements_by_name()方法可以通过匹配name值来定位单个或一组元素。
driver.find_element_by_name("q")
driver.find_elements_by_names("q")
3- class定位
通过页面元素的class属性进行元素的定位。如果name值匹配成功可返回定位的元素;反之,则抛出NoSuchElementException的异常
常用方法:
find_element_by_class_name()和find_elements_by_class_name()方法可以通过匹配class属性来定位单个或一组元素
#查找元素的class属性为button的元素
driver.find_element_by_class_name("button")
driver.find_elements_by_class_name("button")
4- tag定位
通过页面元素的tag名称进行元素的定位。如果tag name匹配成功可返回定位的元素;反之,则抛出NoSuchElementException的异常
常用方法:
find_element_by_tag_name()和find_elements_by_tag_name()方法可以通过匹配tag名称来定位单个或一组元素
#查找元素的class属性为button的元素
find_element_by_class_name("img")
find_elements_by_class_name("qbutton")
5- link 定位
通过文本链接来定位元素,常用的方法有:find_element_by_link_text() 和find_elements_by_link_text()
find_element_by_link_text("地图")
6- partial link 定位
parial link 定位是对 link 定们的一个种补充,有些文本连接会比较长,这个时候我们可以取文本链接的有一部分定位,只要这一部分信息可以唯一的标识这个链接。
find_element_by_partial_link_text(“一个很长的文本链接”)
7- XPath 定位
XPath是一种在XML文档中搜索和定位元素的查询语言。几乎所有的浏览器都支持XPath。同样,Selenium也可以通过XPath的方式在Web页面上定位元素。当我们发现通过ID、 name或class属性值都无法定位元素时,不妨尝试用XPath的方式。我们可以灵活地运用绝对或相对路径定位,也可以通过除ID、 name以外的其他属性来定位,甚至还可以通过属性值的一部分(如starts-with()、 contains()和ends-with())来帮助我们定位。
绝对路径定位/相对路径定位
XPath 的绝对路径主要用标签名的层级关系来定位元素的绝对路径。最外层为 html 语言,body 文本内,一级一级往下查找,如果一个层级下有多个相同的标签名,那么就按上下顺序确定是第几个,div[2]表示第二个 div 标签。
相对路径,以‘//’开头,格式为xxx.find_element_by_xpath("//标签")
例如:
find_element_by_xpath("/html/body/div/div[2]/div/div/div/from/span/input")
find_element_by_xpath("//div[x]/form[x]/input[x]")
#[x]可以省略的,x代表第x个div标签
利用元素属性定位
XPath 也可以使用使素的属性值来定位。我们以百度输入框和搜索按钮为例:
find_element_by_xpath("//input[@id='kw']")
find_element_by_xpath("//input[@id='su']")
find_element_by_xpath("//*[@class='s_ipt']")
表达式 中 //表示当前页面某个目录下,input为标签,该标签的id属性值为’su’。如果不想指定标签名也可以用星号(*)代替。
层级与属性结合:
如果一个元素本身并没有可以唯一标识这个元素的属性值,我们可以找其上一级元素,如果它的上级有可以唯一标识属性的值,也可以拿来使用。
find_element_by_xpath("//span[@class='bg s_btn_wr']/input")
使用逻辑运算符
如果一个属性不能唯一的区分一个元素,我们还可以使用逻辑运算符连接多个属性来区别于其它属性。比如用 and 连接更多的属性来唯一的标识一个元素
find_element_by_xpath("//input[@id='kw' and @class='su']/span/input")
文本值或者属性值使用模糊方法定位
如果标签中间存在唯一的文本值,使用:
find_element_by_xpath("//标签[contains(text(),‘文本值’)]")
如果属性值获取文本值很长,可以使用starts-with()和ends-with()和contains()
find_element_by_xpath("//input[starts-with(@id,'ctrl')]")
find_element_by_xpath("//input[ends-with(@id,'_userName')]")
find_element_by_xpath("//input[contains(@id,'userName')]")
8- CSS选择器定位
CSS(层叠样式表)是一种用于页面设计(HTML)与表现的文件样式,是一种计算机语言,能灵活地为页面提供各种样式风格。 CSS使用选择器为页面元素绑定属性(如ID、 class、 type、 attribute、 value等)
CSS 选择器的常见语法:
通过 class 属性定位:
find_element_by_css_selector(".s_ipt")
find_element_by_css_selector(".bg s_btn")
find_element_by_css_selector()方法用于 CSS 语言定位元素,点号(.)表示通过 class 属性来定位元素。
通过 id 属性定位:
井号(#)表示通过 id 属性来定位元素。
find_element_by_css_selector("#kw")
find_element_by_css_selector("#su")
通过标签名定位:
在 CSS 语言中用标签名定位元素不需要任何符号标识,直接使用标签名即可,但我们前面已经了解到标签名重复的概率非常大,所以通过这种方式很难唯一的标识一个元素。
find_element_by_css_selector("input")
通过父子关系定位:
上面的写法表示有父亲元素,它的标签名叫 span,查找它的所有标签名叫 input 的子元素。
find_element_by_css_selector("span>input")
通过属性定位:
在 CSS 当中也可以使用元素的任意属性,只要这些属性可以唯一的标识这个元素。
find_element_by_css_selector("input[autocomplete='off']")
find_element_by_css_selector("input[maxlength='100']")
find_element_by_css_selector("input[type='submit']")
组合定位:
我们当然可以把上面的定位策略组合起来使用,这样就大大加强了元素的唯一性。
find_element_by_css_selector("span.bg s_ipt_wr>input.s_ipt")
find_element_by_css_selector("span.bg s_btn_wr>input#su")
9- 用 By 定位元素
有时需要使用定位方法,在具体通过哪种定位方式(id 或 name)根据实际场景而定位,By 就可以设置定位策略。find_element()方法只用于定位元素。它需要两个参数,第一个参数是定位方式,这个由 By 提供;第二个参数是定位的值。在使用 By 时需要将 By 类导入。
from selenium.webdriver.common.by import By
find_element(By.ID,"kw")
find_element(By.NAME,"wd")
find_element(By.CLASS_NAME,"s_ipt")
find_element(By.TAG_NAME,"input")
find_element(By.LINK_TEXT,u"新闻")
find_element(By.PARTIAL_LINK_TEXT,u"新")
find_element(By.XPATH,"//*[@class='bg s_btn']")
find_element(By.CSS_SELECTOR,"span.bg s_btn_wr>input#su"
XPath 与 CSS定位方式对比