Selenium元素定位

id定位

HTML规定id属性在HTML文档中必须是唯一的,这类似于公民的身份证号码,具有很强的唯一性。WebDriver提供的id定位方法就是通过元素的id属性来查找元素。通过id定位百度搜索输入框。用法如下

find_element_by_id('kw')

name定位

HTML规定name来指定元素的名称,因此它的作用更像是人的姓名。name的属性值,在当前页面中可以不唯一。用法

find_element_by_name('name')

class定位

HTML规定class来指定元素的类名。其用法与id、name类似,下面实例通过class属性定位。

find_element_by_class_name('s_ipt')

tag定位

HTML的本质就是通过tag来定义实现不同的功能,每一个元素本质上也是一个tag。因为一个tag往往定位一类功能,所以通过tag识别某个元素的概率很低。用法

find_element_by_tag_name('input')

link定位

link定位与前面介绍的几种定位方法有所不同,它专门用来定位文本超链接。用法

1
2
3
<a class="mnav" name="tg_trnews" href="http://news.baidu.com">新闻</a>  # 链接事例

find_element_by_link_text('新闻') # 用法事例

partial link定位

partial link定位是对link定位的一种补充,有些文本链接会比较长,这个时候我们可以取文本链接的一部分定位,只要这一部分信息可以唯一地标识这个链接

1
2
3
<a class="mnav" name="tg_trnews" href="#">这是一个超级长的文件链接</a>  # 链接事例

find_element_by_partial_link_text('这是一个超级长的') # 用法事例

XPath定位

XPath是一种在XML文档中定位元素的语言。因为HTML可以看作XML的一种实现,所以selenium用户可以使用这种强大的语言在Web应用中定位元素。XPath可以分为绝对路径定位和元素的属性值定位

绝对路径定位

绝对路径定位就是用绝对路径来定位元素

find_element_by_xpath("/html/body/div/div[2]/div/from/span/input")

元素属性定位

就是利用各个tag的属性值来进行定位(任何属性都可以,只要有唯一性就行)
1
2
3
find_element_by_xpath("//input[@id='kw']") # 一个id为‘kw’的input标签
find_element_by_xpath("//*[@class='su' and @id='su_id']") # class属性值为‘su’并且id值为‘su_id’的标签 * 表示所有标签 多属性值可and连接
find_element_by_xpath("//div[@id='kw']/span/input") # 一个id为‘kw’的div标签下的span下的input 和其他标签结合使用

CSS定位

CSS是一种语言,他用用来描述HTML和XML文档的表现。CSS使用选择器来为页面元素绑定属性。这些选择器可以被selenium用作另外的定位策略。CSS可以较为灵活地选择控件的任意属性,一般情况下定位速度要多xpath快,但学习难度比xpath要大。

选择器列子描述
.class.introclass选择器,选择class=“intro”的所有元素
#id#firstnameid选择器,选择id=“firstname”的所有元素
**选择所有元素
elementp所有p元素
element>elementdiv > input选择父元素为div的所有input元素
element + elementdiv + input选择同一级中紧接在div元素之后的所有input元素(同级)
[attribute=value][target=_blank]选择target=”_blank”的所有元素
通过class属性定位

find_element_by_css_selector('.s_ipt')

通过id属性定位

find_element_by_css_selector('#kw')

通过tag标签名定位

find_element_by_css_selector('input')

通过父子关系定位

find_element_by_css_selector('span>input')

通过属性定位

find_element_by_css_selector("[name='kw']")

组合定位

find_element_by_css_selector("form.fm>span>input.s_ipt")

_定位的这个元素标签名为input,这个元素的class为.s_ipt,并且他有一个父元素,标签为span,他的父标签span还有一个父标签form,且form的id值为fm_

用By定位元素

针对前面的八种定位方法,webdriver还提供了另一套写法,即统一调用find_element()方法,通过By来声明定位方法,并且传入对应定位方法的定位参数。使用此方法前要先导入By类

1
2
3
4
5
6
7
8
9
10
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,'新闻')
find_element(By.PARTIAL_LINK_TEXT,"新")
find_element(By.XPATH,"//*[@class='bg_btn']")
find_element(By.CSS_SELECTOR,"span.bg_btn>input#su")

XPath与CSS的类似功能对比

定位方式XPathCSS
标签//divdiv
By id//div[@id=”eleid”]div#eleid
By class//div[@class=”eleclass”]div.eleclass
By属性//div[@title=”my title”]div[title=”my title”]
定位子元素//[@id=”eleid”]/*div#eleid>*