Python自动化测试之selenium - 元素定位

元素定位

元素定位就是通过元素的信息或者元素层级结构来定位元素。当定位到了重复的属性,默认会定位到第一个标签。

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 # 通过标签名

通过超链接的全部文本信息进行定位。

复制代码

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() ​

通过超链接的局部文本信息进行定位。也就是进行模糊匹配

复制代码

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接口自动化测试实战教程全集(实战最新版)

相关推荐
喵叔哟10 分钟前
重构代码中引入外部方法和引入本地扩展的区别
java·开发语言·重构
尘浮生16 分钟前
Java项目实战II基于微信小程序的电影院买票选座系统(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven·intellij-idea
hopetomorrow30 分钟前
学习路之PHP--使用GROUP BY 发生错误 SELECT list is not in GROUP BY clause .......... 解决
开发语言·学习·php
小牛itbull40 分钟前
ReactPress vs VuePress vs WordPress
开发语言·javascript·reactpress
请叫我欧皇i1 小时前
html本地离线引入vant和vue2(详细步骤)
开发语言·前端·javascript
nuclear20111 小时前
使用Python 在Excel中创建和取消数据分组 - 详解
python·excel数据分组·创建excel分组·excel分类汇总·excel嵌套分组·excel大纲级别·取消excel分组
闲暇部落1 小时前
‌Kotlin中的?.和!!主要区别
android·开发语言·kotlin
GIS瞧葩菜1 小时前
局部修改3dtiles子模型的位置。
开发语言·javascript·ecmascript
chnming19871 小时前
STL关联式容器之set
开发语言·c++
Lucky小小吴1 小时前
有关django、python版本、sqlite3版本冲突问题
python·django·sqlite