目录
什么是元素定位?
- 通过元素的属性值或者层级结构定位元素
为什么进行元素定位?
- 就像盲人走路需要导盲棍、导盲犬是一样的(无恶意),当我们通过操作浏览器驱动来对页面进行一些操作的时候,程序是需要知道“怎么走”的,我们需要给他一个方向。
- 注意:需提前安装好浏览器及其对应版本的驱动,不知道如何操作的移步自动化前期准备之环境搭建
初识<Chrome开发者模式>/<Edge检查>/F12/Ctrl+Shift+i
- 元素选择器:点击元素选择器之后再点击页面某元素,该元素的代码将会高亮显示
- 元素面板(Elements):当前页面的源代码
- 控制台(Console):可进行js代码编写,对页面进行操作(后面会提到)
如何进行元素定位?
八大元素定位法(需要导包)
【单数形式定位】
- ID值定位---参数为ID值,行业规范内,元素ID在页面内应为唯一值,所以ID定位是较为稳妥的方法
- NAME值定位---参数为NAME值,在页面内可能会有多个元素name值相同,这时可以选择使用其他方法定位,也可选择复数形式定位
- TAG_NAME为标签名称定位---参数为标签名称,如<input>、<a>等,在一个页面内极少会有唯一的标签名,所以多为复数形式定位
- CLASS_NAME值定位---参数为CLASS值
- CLASS_SELECT为CSS样式选择器---参数为.CLASS值或#ID值
- LINK_TEXT为超链接文本精确定位---参数为<a></a>中间的全部文本
- PARTIAL_LINK_TEXT为超链接文本模糊定位---参数为<a></a>中间的文本(可以是部分文本也可以是全文本)
- XPATH定位---是一种特殊的路径标识语言,可以通过选中元素-copy(复制)-copy XPATH来获取该元素的XPATH属性
【注意】:在使用class值时,如果有多个class值,如:<input class="bg s_btn">,中间有空格时,将空格改为点,即 . 否则会定位失败
# 导入浏览器驱动
from selenium import webdriver
# 导入元素定位By方法
from selenium.webdriver.common.by import By
# 获取浏览器驱动
driver = webdriver.Chrome()
# 通过浏览器驱动定位元素
driver.find_element(By.ID,'ID值')
driver.find_element(By.NAME,'NAME值')
driver.find_element(By.TAG_NAME,'标签名称')
driver.find_element(By.CLASS_NAME,'CLASS值')
driver.find_element(By.CSS_SELECTOR,'.CLASS值或#ID值')
driver.find_element(By.LINK_TEXT,'链接文本')
driver.find_element(By.PARTIAL_LINK_TEXT,'模糊文本')
driver.find_element(By.XPATH,'XPATH值')
【获取XPATH】
- xpath:相对路径
- full xpath:绝对路径
【复数定位】
- 使用复数形式定位,会返回一个列表(数据类型较为特殊的一种列表),这时就需要将返回的列表赋值给一个变量名,再通过元素在页面的索引进行定位
- 第一种写法---分布式
# 此处省略获取驱动、打开浏览器操作
# 定位页面中的所有<a>标签---返回一个存放特殊数据类型的列表
tag_list = driver.find_elements(By.TAG_NAME,'a')
# 通过索引定位我们需要的那个元素并进行左击操作
tag_list[3].click()
-
第二种写法---链式编程
# 此处省略获取驱动、打开浏览器操作
# 定位所有<a>标签
driver.find_elements(BY.TAG_NAME,'a')[3].click()
如何查看当前页面某值的元素个数?
- 在Console中输入document.getElementsByClassName('hello')可查看当前页面class值为hello的所有元素
- 其他属性(NAME/TAGNAME)等同理
- length代表数量
在知道如何查看页面同名元素个数后,我们在编写代码之前就可以先查看该属性值元素个数,再决定使用什么方法定位元素。
用单数形式定位多个同名的元素
【注意】:也可用单数形式定位有多个同名的元素,这种情况下,会默认返回定位到的第一个,也就是对定位到的第一个进行操作
对元素的一些基础操作
- 在我们的日常使用场景中,使用频率最多的也就是左击(比如点击按钮、点击输入框)和输入(比如输入用户名)
- 那么如何在脚本中实现呢?
- 左击:click()
- 模拟键盘输入:send_keys()
【一个简单的小栗子】
- 通过浏览器驱动打开百度,在百度中搜索“软件测试”
# 获取浏览器驱动
driver = webdriver.Edge()
# 打开百度
driver.get("https://www.baidu.com/")
# 通过ID定位百度输入框,并输入“软件测试”
driver.find_element(By.ID,'kw').send_keys("软件测试")
# 强制时间等待
time.sleep(3)
# 通过class定位百度一下按钮
driver.find_element(By.CLASS_NAME,'bg.s_btn').click()
# 关闭浏览器
driver.quit()
- 程序运行速度是很快的,而网络速度有时是有限的,为了便于观察页面变化、检测脚本运行效果,也为了避免因为网络或其他非代码错误而发生的异常,我们可以在代码中加一些强制等待,参数的单位是秒。
- 时间等待、键盘操作、鼠标操作后续还会更新,这里提到的只是基础的操作