元素定位
元素定位就是通过元素的信息或者元素层级结构来定位元素。当定位到了重复的属性,默认会定位到第一个标签。
id定位 - find_element_by_id
同一个html页面中id值是唯一的。
模拟在百度输入框中输入想要查找的内容
python
代码解读
复制代码
from selenium import webdriver import time driver = webdriver.Chrome() driver.get("http://www.baidu.com") inp = driver.find_element_by_id("kw") # 通过id定位元素 - 定位到输入框 inp.send_keys("蜡笔小新") # 针对输入框进行输入操作 time.sleep(2) driver.quit()
name定位-find_element_by_name
通过元素的name属性值进行元素定位,该属性是可以重复的。
arduino
代码解读
复制代码
find_element_by_name # name属性
classname定位-find_element_by_class_name
通过元素的class属性进行元素定位,参数是其中一个属性值,不能使用所有属性值进行定位
bash
代码解读
复制代码
find_element_by_class_name # 类名
tag_name定位
通过元素的标签名称进行定位,同一个html页面中相同元素有很多。
bash
代码解读
复制代码
find_element_by_tag_name # 通过标签名
link_text定位-find_element_by_link_text
通过超链接的全部文本信息进行定位。
ini
代码解读
复制代码
from selenium import webdriver import time driver = webdriver.Chrome() driver.get("https://www.baidu.com") res = driver.find_element_by_link_text("新闻") # 通过a标签定位元素,重复的话默认定位第一个 res.click() # 点击操作 time.sleep(2) driver.quit()
partical_link_text定位 - find_element_by_partical_link_text
通过超链接的局部文本信息进行定位。也就是进行模糊匹配
arduino
代码解读
复制代码
driver.find_element_by_partical_link_text("新闻")
定位一组元素 - find_elements_by_xxx
可以解决定位到多个元素如何获取所有的重复的元素。注意多了一个s哦~
定位一组元素返回的值是一个列表,即可以通过索引进行获取指定的元素。
ini
代码解读
复制代码
from selenium import webdriver import time driver = webdriver.Chrome() driver.get("https://www.baidu.com") res = driver.find_elements_by_tag_name("a") # 通过a标签定位元素,结果是一个列表 print(res[0]) time.sleep(2) driver.quit()
xpath元素定位
XPath是XML Path的简称,是一门在XML文档中查找元素信息的语言,xpath可以使用工具生成。
python
代码解读
复制代码
from selenium import webdriver import time driver = webdriver.Chrome() driver.get("https://cn.bing.com/") res = driver.find_element_by_xpath('//*[@id="sb_form_q"]') # 通过a标签定位元素,结果是一个列表 res.send_keys('蜡笔小新') # 获取标签的文本内容 id time.sleep(2) driver.quit()
Xpath定位策略find_element_by_xpath(xpath表达式)
最常用的定位方式
路径定位:
绝对路径:表达式以/html
开头,元素的层级之间以/
分隔,相同层级的元素可以使用索引,索引从1开始,找到元素需要经过所有的层级元素比如/html/body/div/form/p[1]/input
相对路径:匹配任意层级的元素,以//tag_name
或者//*
开头,*
表示所有的标签
属性定位:最好能够通过属性定位到唯一的元素
xpath表达式://*[@属性名=属性值]
比如//input[@value='取消']
属性与逻辑结合:同时满足多个条件
xpath表达式://tag_name[@属性名=属性值 and @属性名=属性值]
属性与层级结合:
xpath表达式://tag_name[@属性名=属性值]/tag_name[@属性名=属性值]
通过全部文本内容进行定位
xpath表达式://*[test()='文本内容']
元素的某个属性值包含value
xpath表达式://*[contains(@属性名,'属性值的一部分')]
css定位
介绍
使用的方法是find_element_by_css_selector(css选择器表达式)
一般不常用,可能不能精确定位。多种属性可以组合使用
id选择器
表达式:#id
表示#id值
ini
代码解读
复制代码
driver = webdriver.Chrome() driver.get("https://cn.bing.com/") res = driver.find_element_by_css_selector('#sb_form_q')
class选择器
表达式:.class
表示.其中一个属性值
元素选择器 - 不推荐使用
表达式:tagname
会定位到多个,因此不推荐使用
属性选择器
表达式:[属性名=属性值]
层级选择器
- 后代选择器 - 空格表示后代选择器
css
代码解读
复制代码
div span - 表示div内部的span标签
- 儿子选择器 -
>
表示儿子关系,内部第一层
css
代码解读
复制代码
div > span - 表示div内部第一层的span标签
- 毗邻选择器 - +表示毗邻关系,毗邻关系:同级别紧挨着的下一个标签
css
代码解读
复制代码
div + span - 表示紧挨着div的同级别的span标签
- 弟弟选择器 - ~表示弟弟关系,弟弟关系:同级别的所有标签
css
代码解读
复制代码
div ~ span - 表示和div同级别的span标签
元素定位的另一种写法
ini
代码解读
复制代码
from selenium.webdriver.common.by import By res = driver.find_element(by=By.CSS_SELECTOR, value='#sb_form_q') res = driver.find_element(By.XPATH, '#sb_form_q') res = driver.find_element(By.ID, '#sb_form_q') res = driver.find_element(By.CLASS_NAME, '#sb_form_q') res = driver.find_element(By.NAME, '#sb_form_q') res = driver.find_element(By.TAG_NAME, '#sb_form_q') res = driver.find_element(By.LINK_TEXT, '#sb_form_q')
案例:
python
代码解读
复制代码
from selenium import webdriver from selenium.webdriver.common.by import By import time driver = webdriver.Chrome() driver.get("https://cn.bing.com/") res = driver.find_element(By.CSS_SELECTOR, '#sb_form_q') # 通过a标签定位元素,结果是一个列表 res.send_keys('蜡笔小新') # 获取标签的文本内容 id time.sleep(2) driver.quit()
这是我整理的**《2024最新Python自动化测试全套教程》** ,以及配套的接口文档/项目实战**【网盘资源】** ,需要的朋友可以下方视频的置顶评论获取。肯定会给你带来帮助和方向。
【已更新】B站讲的最详细的Python接口自动化测试实战教程全集(实战最新版)