【Selenium学习】元素定位

18种定位

Selenium的定位方式一共有18种,单数8种,复数8种,最后两种是前面这16种的底层封装

单数形式8种

复制代码
 1 # 1、id定位
 2 al = driver.find_element_by_id('i1')
 3 al.send_keys('id定位')
 4 
 5 # 2、class定位
 6 bl = driver.find_element_by_class_name('classname')
 7 bl.send_keys('class定位')
 8 
 9 # 3、css selector定位
10 cl = driver.find_element_by_css_selector('#i1')
11 cl.send_keys('css selector定位')
12 
13 # 4、name定位:按照标签中的name属性定位
14 dl = driver.find_element_by_name('name')
15 dl.send_keys('name定位')
16 
17 # 5、link_text 文本内容定位
18 import time
19 time.sleep(1)
20 driver.execute_script('window.scrollTo(0,0);')  # 跳转到网页的最上面
21 time.sleep(1)
22 el = driver.find_element_by_link_text('跳转大师兄博客地址')
23 el.click()
24 
25 # 6、partial_link_text 模糊文本内容匹配
26 import time
27 time.sleep(1)
28 driver.execute_script('window.scrollTo(0,0);')  # 跳转到网页的最上面
29 time.sleep(1)
30 fl = driver.find_element_by_partial_link_text('跳转')
31 fl.click()
32 
33 # 7、Xpath 定位
34 gl = driver.find_element_by_xpath('//input[@placeholder="请通过XPATH定位元素"]')
35 gl.send_keys('xpath 定位')
36 
37 # 8、tag_name 标签名定位
38 hl = driver.find_element_by_tag_name('input')
39 hl.send_keys('tag_name 标签名定位')
复制代码

复数形式也是8种,是以上8种的复数形式,返回的是一个列表

复制代码
 1 # 1、id定位
 2 als = driver.find_elements_by_id('i1')
 3 als[0].send_keys('id定位')
 4 
 5 # 2、class定位
 6 bls = driver.find_elements_by_class_name('classname')
 7 bls[0].send_keys('class定位')
 8 
 9 # 3、css selector定位
10 cls = driver.find_elements_by_css_selector('input')
11 cls[2].send_keys('定位到第三个input输入框')
12 
13 # 4、name定位:按照标签中的name属性定位
14 dls = driver.find_elements_by_name('name')
15 dls[0].send_keys('name定位')
16 
17 # 5、link_text 文本内容定位
18 import time
19 time.sleep(1)
20 driver.execute_script('window.scrollTo(0,0);')  # 跳转到网页的最上面
21 time.sleep(1)
22 els = driver.find_elements_by_link_text('跳转大师兄博客地址')
23 els[0].click()
24 
25 # 6、partial_link_text 模糊文本内容匹配
26 import time
27 time.sleep(1)
28 driver.execute_script('window.scrollTo(0,0)')  # 跳转到网页的最上面
29 time.sleep(1)
30 fls = driver.find_elements_by_partial_link_text('示例')
31 fls[0].click()
32 
33 # 7、Xpath 定位
34 gls = driver.find_elements_by_xpath('//input')
35 gls[4].send_keys('xpath 定位')
36 
37 # 8、tag_name 标签名定位
38 hls = driver.find_elements_by_tag_name('input')
39 hls[5].send_keys('tag_name 标签名定位')
复制代码

最后两种是前面16种的底层封装

1 driver.find_element('id','i1')
2 driver.find_elements('xpath','//input')

以上两种定位方式,第一个参数填入下面8个字符串,分别对应上面的16种定位方式,单数和复数分别对应

复制代码
1 "id"
2 "xpath"
3 "link text"
4 "partial link text"
5 "name"
6 "tag name"
7 "class name"
8 "css selector"
复制代码

下面举例说明:

复制代码
 1 ali = driver.find_element('id','i1')
 2 ali.send_keys('xxxx')
 3 # 相当于:
 4 al = driver.find_element_by_id('i1')
 5 al.send_keys('xxxx')
 6 
 7 bls = driver.find_elements('css selector','input')
 8 bls[1].send_keys('css selector')
 9 # 相当于:
10 bl = driver.find_elements_by_css_selector('input')
11 bl[1].send_keys('css selector')
复制代码

总结:

  我们工作当中应该优先使用Css Selector定位,如果定位不到再用Xpath定位。因为查看源代码发现:使用id、name、tag name、class name定位,都会转换成css selector定位,具体源代码如下:

复制代码
 1     def find_element(self, by=By.ID, value=None):
 2         if self.w3c:
 3             if by == By.ID:
 4                 by = By.CSS_SELECTOR
 5                 value = '[id="%s"]' % value
 6             elif by == By.TAG_NAME:
 7                 by = By.CSS_SELECTOR
 8             elif by == By.CLASS_NAME:
 9                 by = By.CSS_SELECTOR
10                 value = ".%s" % value
11             elif by == By.NAME:
12                 by = By.CSS_SELECTOR
13                 value = '[name="%s"]' % value
14         return self.execute(Command.FIND_ELEMENT, {
15             'using': by,
16             'value': value})['value']
17 
18     def find_elements(self, by=By.ID, value=None):
19         if self.w3c:
20             if by == By.ID:
21                 by = By.CSS_SELECTOR
22                 value = '[id="%s"]' % value
23             elif by == By.TAG_NAME:
24                 by = By.CSS_SELECTOR
25             elif by == By.CLASS_NAME:
26                 by = By.CSS_SELECTOR
27                 value = ".%s" % value
28             elif by == By.NAME:
29                 by = By.CSS_SELECTOR
30                 value = '[name="%s"]' % value
31         return self.execute(Command.FIND_ELEMENTS, {
32             'using': by,
33             'value': value})['value'] or []
复制代码

Xpath详细

一、什么是Xpath

XPath是XML的路径语言,通俗一点讲就是通过元素的路径来查找到这个标签元素。

工具

Xpath的练习建议大家安装火狐浏览器后,下载插件,FireBug。由于最新版火狐不再支持FireBug等开发工具,可以通过https://ftp.mozilla.org/pub/firefox/releases/ 下载49版本以下的火狐就可以增加Firebug等扩展了。

二、Xpath的使用方法

注:默认死格式 先写 //* 代表定位页面下所有元素

1、Xpath通过标签的属性定位

复制代码
 1 @代表以属性定位,后面可以接标签中任意属性
 2 通过ID定位
 3 //*[@id='i1']
 4 
 5 通过Class定位
 6 //*[@class='pg-header']
 7 
 8 通过Name定位
 9 //*[@name='username']
10 
11 通过Type定位
12 //*[@ type='button']
复制代码

2、当标签的属性重合时,Xpath提供了通过标签来进行过滤

复制代码
1 获取所有input标签元素
2 //input
3 
4 获取placeholder='用户名'的input标签元素
5 //input[@placeholder='用户名']   这种方式比//*要快
6 
7 当出现重复时可以使用下标定位,从1开始
8 //div[@class='inner'][2] 
复制代码

3、当标签页重复时,Xpath提供了层级过滤

例如:找不到儿子,那么就先找他的爸爸,实在不行可以在找他的爷爷

1 支持通过 / 进行层级递进,找到符合层级关系的标签
2 //form/div/input[@placeholder="用户名"]
3 
4 当层级都重复时,可以通过单个层级的属性进行定位
5 //form/div[@class='login-user']/input

4、一个元素它的兄弟元素跟它的标签一样,这时候无法通过层级定位到。Xpath提供了索引过滤

1 通过索引,在List中定位属性,与python的索引有些差别,Xpath从1开始
2 //select[@name='city'][1]/option[1]

5、上面集中如果都用上了之后还重复的话,我们就可以使用Xpath提供的终极神器,逻辑运算定位:and和or

通过and来缩小过滤的范围,只有条件都符合时才能定位到
//select[@name='city' and @size='4' and @multiple="multiple"]

or就相反了,只要这些筛选中,其中一个出现那么久匹配到了
//select[@name='city' or @size='4']

 Css Selector详细

一、什么是Css Selector

  Css Selector定位实际就是HTML的Css选择器的标签定位

工具

  Css Selector的练习建议大家安装火狐浏览器后,下载插件,FireFinder 或 FireBug和FirePath组合使用。

二、Css Selector使用方法

1、通过ID、Class定位

复制代码
1 ID定位
2 #号代表id,定位有id的标签方式更加简洁
3 #i1
4 
5 Class定位
6 .代表Class
7 .c1
8 Class定位还提供了多个Class定位,通过连续.来缩小范围
9 .c1.c2.c3
复制代码

2、通过标签定位

1 定位方式 :直接输入标签名称
2 div
3 input
4 单独用没什么作用,因为一个页面相同的标签太多了,需要和其他方式组合起来用

3、通过属性定位

1 属性定位方式,直接中括号,加上属性就可以了 
2     [name='n1']

4、通过标签属性组合定位

复制代码
1 标签属性组合
2 input[name='n1']
3 
4 标签与Class组合
5 input.c1
6 
7 标签与ID组合
8 input#i1
复制代码

5、通过多属性组合

1 Css Selector 的多属性组合选择过滤 没有and 只需要多个[] 连接 就可以
2 select[name='city'][size='4'][multiple="multiple"]

6、通过层级关系定位

1 与Xpath的不同 Css Selector通过 > 来区分层级的界定
2 select>option[value='3']

7、模糊匹配

复制代码
1 ^= 匹配元素属性以什么开头
2 [placeholder^='请输入']
3 
4 $= 匹配属性以什么结尾
5 [placeholder$='元素']
6 
7 *= 匹配属性包含什么值 input
8 [placeholder*='ID']
复制代码
作者:gtea 博客地址:https://www.cnblogs.com/gtea
原文地址:https://www.cnblogs.com/gtea/p/12715776.html