目录
一、简介:
二、BY模块
三、find_element方法和find_elements方法
1)、find_element方法和find_elements方法的区别
2)、find_element方法和find_elements方法搭配BY模块使用
(1)find_element方法:
(2)find_elements方法:
三、测试用例
1)、定位逻辑
2)、实际用例
测试代码
一、简介:
Selenium是通过模拟人对浏览器进行操作,既然是模拟人进行操作,那么就需要选择对页面上的哪一个标签进行操作。例如想让Selenium对页面上的登录按钮进行点击,就需要先让Selenium定位到这个按钮,在进行点击操作。
我们把整个页面(HTML标签)看作是地球,HTML标签的子集标签看做是国家,
子集标签的子集标签看做是城市。当我们想要定位重庆时,我们以地球为根节点出发,选择中国子节点,在选择中国子节点下的重庆字节的。
二、BY模块
selenium的by模块提供了八种定位方式。
通过from selenium.webdriver.common.by import By导入By模块。
标签的id属性值进行定位使用: | By.ID |
通过标签的name属性值进行定位使用: | By.NAME |
通过标签的class属性值进行定位使用: | By.CLASS_NAME |
通过标签的标签中文本值进行定位使用: | By.LINK_TEXT |
通过标签的标签中的部分文本值进行定位使用: | By.PARTIAL_LINK_TEXT |
通过标签的标签名进行定位使用: | By.TAG_NAME |
通过标签的xpath路径进行定位使用: | By.XPATH |
通过标签的css选择器进行定位使用: | By.CSS_SELECTOR |
三、find_element方法和find_elements方法
通过webdriver调用这两种方法搭配BY模块进行定位可以解决大部分的定位需求。
find_element(by模块,'属性值')
find_elements(by模块,'属性值')
1)、find_element方法和find_elements方法的区别
find_element只返回一个选中的标签,即有多个满足条件的标签值返回第一个。
find_elements返回的是一个列表,可以满足多个满足条件的标签,注意返回的是列表,让要对其中的标签进行操作需要指定列表元素的下标。
2)、find_element方法和find_elements方法搭配BY模块使用
例如有两个个标签:
<a id='id1' class='class' >111</a>
<a id='id2' class='class' >222</a>
(1)find_element方法:
定位第一个a标签:
使用By.ID和标签id属性去定位
find_element(By.ID, 'id1')
使用By.CLASS_NAME和标签class属性去定位(有多个满足。但只匹配第一个)
find_element(By.CLASS_NAME, 'class')
定位第二个a标签:
使用By.ID和标签id属性去定位
find_element(By.ID, 'id2')
(2)find_elements方法:
定位第一个a标签:
使用By.ID和标签id属性去定位(返回是列表,记得下标)
find_elements(By.ID, 'id1')[0]
使用By.CLASS_NAME和标签class属性去定位(返回是列表,记得下标)
find_elements(By.CLASS_NAME, 'class')[0]
定位第二个a标签
使用By.ID和标签id属性去定位(返回是列表,记得下标)
find_elements(By.ID, 'id2')[0]
使用By.CLASS_NAME和标签class属性去定位(返回是列表,记得下标)
find_elements(By.CLASS_NAME, 'class')[1]
三、测试用例
1)、定位逻辑
假如我们有如下节点,我们像定位到中国重庆下的巴南标签,那我们是不是得选定位中国下的重庆,在去定位中国重庆下的巴南,这样才能准确的定位到我们想要的元素,以XPATH写法为演示则是:/中国/重庆/巴南。
<中国>
<重庆>
<渝北></渝北>
<巴南></巴南>
</重庆>
<天津市>
<和平区></和平区>
<河西区></河西区>
</天津市>
<上海市>
<黄浦区></黄浦区>
<徐汇区></徐汇区>
</上海市>
</中国>
2)、实际用例
我们进入百度的网页,按F12进入开发者模式
比如我们想拿这个标签里的’贴吧‘两字,我们是不是得先定位到这个a标签。
那我们先分析一下这不标签所在的路径。这个a标签的的父级是div标签,div标签的父级也是一个div标签,再往前走一级是还是一个div标签,再再往前走一级是一个body标签,再再再往上走一级到了根节点html标签,那么它的路径就确定下来了,html -> body ->div ->div ->div -> a,如图
我们以XPATH写法为例子:我们以 . 代表当前页面,./html/body/div,在这我们定位4这个位置,在往下我们要定位到3去,但我们发现4下面有多个div标签。
而我们要去的是它下面的第二个div,这时候我们就得去指定它:
第一种方法:./html/body/div/div[2] 给它一个下标,代表我们选择./html/body/div下面的第二个div。
第一种方法:在我们想要选取的div里面不是有个属性id嘛,,我们在定位标签的时候加上它的属性./html/body/div/div[@id="head"]。
再往下定位也是一样的逻辑,指定我们想要选择的标签:
./html/body/div/div[@id="head"]/div[@class="s-top-left-new s-isindex-wrap"]/a[4]文章来源:https://www.toymoban.com/news/detail-791537.html
XPah语法
XPath 语法 | 菜鸟教程文章来源地址https://www.toymoban.com/news/detail-791537.html
测试代码
from selenium import webdriver
from selenium.webdriver.common.by import By
# 创建浏览器驱动对象,Chrome()代表是谷歌浏览器的驱动
driver = webdriver.Chrome()
#打开网页
driver.get('https://www.baidu.com/')
#定位到指定标签
_blank = driver.find_element(By.XPATH,
'./html/body/div/div[@id="head"]/div[@class="s-top-left-new s-isindex-wrap"]/a[4]'
)
#打印标签的文本内容
print(_blank.text)
到了这里,关于Selenium:定位(二:By模块定位,简单无基础)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!