Python-Selenium 网页元素定位方式

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 选择器的常见语法:

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定位方式对比

你可能感兴趣的:(Python-Selenium 网页元素定位方式)