Selenium+Python之元素定位方法

一、id定位

id 可以看做是一个人的身份号,当然这个 id 并不像我们现实中的身份证号有那么强的唯一性,如果在一个页面上发现有两个元素的 id="kw"也是不足为奇的,这个取决前端代码的规范程度。

'''
driver.find_element_by_id() 方法用于元素中 id 属性的定位。
'''
#例:
driver.find_element_by_id("kw")
driver.find_element_by_id("su")

二、name定位

name 的定位与 id 类似,每一个人都会有名字,那么 name 就可作是一个元素的名字。

'''
driver.find_element_by_name("username") 方法用于元素中 name 属性的定位
'''
#例:
driver.find_element_by_name("username")

三、class定位

class 也是不少元素会有的一个属性,它的定位和 name 以及 id 类似

'''
driver.find_element_by_class_name()方法用于元素中 class 属性的定位。
'''
#例:
driver.find_element_by_class_name("s_ipt")
driver.find_element_by_class_name("bg s_btn")

四、tag定位

tag 定位取的是一个元素的标签名,通过标签名去定位单个元素的唯一性最底,因为在一个页面中有太多的元素标签为

和了,所以很难通过标签名去区分不同的元素

'''
driver.find_element_by_tag_name()  方法通过元素的 tag name 来定位元素。并不能区别不同的元素,因为在一个页面上标签名相同很难以避免。
'''
#例:
driver.find_element_by_tag_name("input")

五、link定位

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

<a class="mnav" name="tj_trnews" href="http://news.baidu.com">新闻</a>
<a class="mnav" name="tj_trhao123" href="http://www.hao123.com">hao123</a>
<a class="mnav" name="tj_trmap" href="http://map.baidu.com">地图</a>
<a class="mnav" name="tj_trvideo" href="http://v.baidu.com">视频</a>
<a class="mnav" name="tj_trtieba" href="http://tieba.baidu.com">贴吧>

通过 link 定位实现如下:

driver.find_element_by_link_text("新闻")
driver.find_element_by_link_text("hao123")
driver.find_element_by_link_text("地图")
driver.find_element_by_link_text("视频")
driver.find_element_by_link_text("贴吧")

'''
driver.find_element_by_link_text()方法通过元素标签对之间的文本信息来定位元素。不过,需要强调的是
Python 对于中文的支持并不好,如 Python 在执行中文的地方出现在乱码,可以在中文件字符串的前面
加个小“u”可以有效的避免乱码的问题,加 u 的作用是把中文字符串转换中 unicode 编码,如:
find_element_by_link_text(u"新闻")
'''

六、partial link定位

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

<a class="mnav" name="tj_lang" href="#">一个很长很长的文本链接</a>

通过 partial link 定位如下:

'''
driver.find_element_by_link_text()方法通过元素标签对之间的部分文本信息来定位元素。
'''
driver.find_element_by_partial_link_text("一个很长的")
driver.find_element_by_partial_link_text("文本连接")


七、XPath定位

XPath 是一种在 XML 文档中定位元素的语言。因为 HTML 可以看做 XML 的一种实现,所以 selenium
用户可以使用这种强大语言在 web 应用中定位元素。

1、绝对路径定位

XPath 有多种定位策略,最简单和直观的就是写元素的绝对路径。

获取绝对路径的方法:

第一步:按F12

第二步:Ctrl+Shift+C,点击要定位的元素

第三步:在代码区域右击,选择Copy-CopyXpath

driver.find_element_by_xpath("/html/body/div/div[2]/div[1]/div[3]/div/button").click()
'''
driver.find_element_by_xpath()方法用于 XPath 语言定位元素。XPath 的绝对路径主要用标签名的层级关系来
定位元素的绝对路径。最外层为 html 语言,body 文本内,一级一级往下查找,如果一个层级下有多个相
同的标签名,那么就按上下顺序确定是第几个,div[2]表示第二个 div 标签
'''

2、利用元素属性定位

除了使用绝对路径的以外,XPath 也可以使用使素的属性值来定位。当然,使用 XPath 不仅仅只局限在 id、name 和 class 这三个属性值,元素的任意属性值都可以使用,只要它能唯一的标识一个元素。

driver.find_element_by_xpath("//input[@id='kw']")
'''
//表示当前页面某个目录下,input 表示定位元素的标签名,[@id='kw'] 表示这个元素的 id 属性值等于kw。
'''

driver.find_element_by_xpath("//input[@autocomplete='off']")
driver.find_element_by_xpath("//input[@type='submit']")

3、层级与属性结合

如果一个元素本身并没有可以唯一标识这个元素的属性值,我们可以找其上一级元素,如果它的上级
有可以唯一标识属性的值,也可以拿来使用

driver.find_element_by_xpath("//p[@class='ng-scope']/input")

4、使用逻辑运算符

如果一个属性不能唯一的区分一个元素,我们还可以使用逻辑运算符连接多个属性来区别于其它属性。

<input id="kw" class="su" name="ie">
<input id="kw" class="aa" name="ie">
<input id="bb" class="su" name="ie">

如上面的三行元素,假如我们现在要定位第一行元素,如果使用 id 将会与第二行元素重名,如果使用
class 将会与第三行元素的重名。那么如果同时使用 id 和 class 就会唯一的标识这个元素。那么这个时候就
可以通过逻辑运算符号连接。

driver.find_element_by_xpath("//input[@id='kw' and @class='su']/span/input")

当然,我们也可以用 and 连接更多的属性来唯一的标识一个元素。

八、CSS定位

CSS(Cascading Style Sheets)是一种语言,它被用来描述 HTML 和 XML 文档的表现。CSS 使用选择器
来为页面元素绑定属性。这些选择器可以被 selenium 用作另外的定位策略。
CSS 可以比较灵活选择控件的任意属性,一般情况下定位速度要比 XPath 快,但对于初学者来说比较
难以学习使用,下面我们就详细的介绍 CSS 的语法与使用。
CSS 选择器的常见语法:
在这里插入图片描述

例:

<span class="bg s_ipt_wr">
<input id="kw" class="s_ipt" autocomplete="off"
maxlength="100" value="" name="wd">
</span>
<span class="bg s_btn_wr">
<input id="su" class="bg s_btn" type="submit"
value="百度一下">
</span>

通过 class 属性定位:

driver.find_element_by_css_selector(".s_ipt")
driver.find_element_by_css_selector(".bg s_btn")

driver.find_element_by_css_selector()方法用于 CSS 语言定位元素,点号(.)表示通过 class 属性来定位元素。

通过 id 属性定位:

driver.find_element_by_css_selector("#kw")
driver.find_element_by_css_selector("#su")
#井号(#)表示通过 id 属性来定位元素。

通过标签名定位:

driver.find_element_by_css_selector("input")
在 CSS 语言中用标签名定位元素不需要任何符号标识,直接使用标签名即可,但我们前面已经了解到
标签名重复的概率非常大,所以通过这种方式很难唯一的标识一个元素。

通过父子关系定位:

driver.find_element_by_css_selector("span>input")
上面的写法表示有父亲元素,它的标签名叫 span,查找它的所有标签名叫 input 的子元素。

通过属性定位:

driver.find_element_by_css_selector("input[autocomplete='off']")
driver.find_element_by_css_selector("input[maxlength='100']")
driver.find_element_by_css_selector("input[type='submit']")
在 CSS 当中也可以使用元素的任意属性,只要这些属性可以唯一的标识这个元素。

组合定位:
我们当然可以把上面的定位策略组合起来使用,这样就大大加强了元素的唯一性。

driver.find_element_by_css_selector("span.bg s_ipt_wr>input.s_ipt")
driver.find_element_by_css_selector("span.bg s_btn_wr>input#su")

九 用 By 定位元素

有时需要使用定位方法,在具体通过哪种定位方式(id 或 name)根据实际场景而定位,By 就可以设置定位略。

driver.find_element(By.ID,"kw")
driver.find_element(By.NAME,"wd")
driver.find_element(By.CLASS_NAME,"s_ipt")
driver.find_element(By.TAG_NAME,"input")
driver.find_element(By.LINK_TEXT,u"新闻")
driver.find_element(By.PARTIAL_LINK_TEXT,u"新")
driver.find_element(By.XPATH,"//*[@class='bg s_btn']")
driver.find_element(By.CSS_SELECTOR,"span.bg s_btn_wr>input#su")


driver.find_element()方法只用于定位元素。它需要两个参数,第一个参数是定位方式,这个由 By 提供;另
第二个参数是定位的值。在使用 By 时需要将 By 类导入。
from selenium.webdriver.common.by import By

声明:部分资料参考《Selenium2 Python 自动化测试实战》一书

猜你喜欢

转载自blog.csdn.net/weixin_46055113/article/details/108403079