find_element 和 find_elements 区别
- find_element 是定位一个元素对象,find_elements是定位多个元素对象
- find_element 得到的是一个WebElement对象,find_elements得到的是列表
- 如果找不到元素时,find_element报错NoSuch Element Exception,而find_elements得到是一个空列表
八大元素定位方式
- 使用网页中F12按键,定位到元素属性
- 获取属性:e.get_attribute(“id”)
- 不要用可能会动态变化的属性进行元素定位
- 不规则的字符串,会比较长
- 纯数字属性
- 带数字属性
- 如果确定我的元素表达式只能找到一个元素
- 复制表达式到浏览器,command+f
- find_elements 只有一个元素
定位方式
- id
driver.get("http://baidu.com")
driver.find_element_by_id("kw") #定位到一个元素
driver.find_elements_by_id("kw") #定位到多个元素
#用于帮助定位属性是否存在
if not driver.find_elements_by_id("kwwww")
print("not kwww")
else:
print("kwww")
- name
driver.find_element_by_name("wd")
driver.find_elements_by_name("wd")
可以利用源码中command+f,来查找name是否是唯一的,例如:
- class_name
driver.find_element_by_class_name("s_ipt")
driver.find_elements_by_class_name("s_ipt")
注意⚠️:
class_name 定义为一定要注意:中间不能有空格
例如:class_name = bg s_ipt_wr quickdelete-wrap
代码:driver.find_elements_by_class_name(" bg s_ipt_wr quickdelete-wrap")会直接报错,不合法
每一个空格都代表一个 class ,所以该class_name 拥有三个class,只需要定位一个即可。
代码:driver.find_elements_by_class_name("s_ipt_wr ")
- tag_name
driver.find_element_by_tag_name("input")
- link_text : 通过超链接文本进行定位
driver.find_element_by_link_text("新闻")
- partial_link_text :通过超链接文本的一部分进行定位
driver.find_element_by_link_text("新") #如果有两个带有“新”的元素,会定位第一个元素
----其实源码中name,id,tag_name,class_name都是使用css_selector进行的定位
⚠️重点学习:Xpath定位方式
定义:Xpath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言
一、使用xpath进行元素定位
- 先要获取xpath表达式
1. 通过浏览器右击复制
2. 自己编写
3. 使用插件
二、绝对定位和相对定位
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点 |
/ | 从根节点选取,绝对路径 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑她们的位置,相对路径 |
. | 选取当前节点 |
… | 选取当前节点的父节点 |
– | – |
@ | 选取属性 |
- 绝对路径:
1. /
2. 每次从根节点html开始 - 相对路径:
1. //
2. 每次只需从第一个已经找到的节点开始 - 绝对定位的劣势:
1. 前端经常变化,加div之类的,下次就不能继续用了
2. 表达更加繁琐 - 绝对路径 vs 相对路径:
1. 自动化测试中,会使用的是相对路径,不会用绝对路径
2. 绝对路径:从最开始的地方,一层一层进入对应的元素
3. 相对路径:我已经在某个位置了,不需要从最开始重新进入
4. 相对路径更加简洁,绝对路径冗余
5. 绝对路径容错性更差,相对路径更灵活容错性更好
#text()文本不是属性,不需要在前面加 @ 符号
driver.find_element_by_xpath("//a[text()='新闻'")
#通过 xpath contains 定位新闻
driver.find_element("xpath","//a[contains(text(),'新闻')"]
#多个属性组合定位
driver.find_element_by_xpath("//*[@id='kw' and @name='wd' and contains(@class,'s_ipt')")
#通过祖先和父亲进行查找
//span[@id='s_kw_wrap'/input[@class='s_ipt']
#通过子元素找父元素
//input[@class='s_ipt']/..
#通过索引方式:1.索引从1开始;2.括号是为了提高优先级,索引优先级比较高,所以需要括号先进行//input的筛选在进行索引
(//input)[1]