当前位置: 首页 > news >正文

web自动化测试-selenium_01_元素定位

文章目录

  • 一、id 定位
  • 二、name 定位
  • 三、class_name 定位
  • 四、tag_name 定位
  • 五、link_text 定位
  • 六、partial_link_text 定位
  • 七、XPath 定位
    • 1. 基本语法
    • 2. 常用定位方式
    • 3. 优缺点
  • 八、CSS 定位
    • 1. 基本语法
    • 2. 常用定位方式
    • 3. 优缺点
    • XPath与CSS定位对比与选择建议
    • 示例总结


1.在pycharm终端:pip install selenium
2.安装浏览器驱动:下载地址:https://googlechromelabs.github.io/chrome-for-testing/
添加浏览器驱动的环境变量

第一个案例:

# 1.导入包
from selenium import webdriver
import time
# 2.创建浏览器驱动对象 
driver = webdriver.Chrome()
# 3.打开web页面
driver.get("https://www.baidu.com")
# 4.暂停3秒
time.sleep(3)
# 5.关闭驱动对象
driver.quit()

Selenium 八种定位元素方式:

  1. id
  2. name
  3. class_name
  4. tag_name
  5. link_text
  6. partial_link_text
  7. XPath
  8. CSS

一、id 定位

id 定位就是通过元素的 id 属性来定位元素,HTML 规定 id 属性在整个HTML文档中必须是唯一的。
前提:元素有 id 属性。

element = driver.find_element(By.ID,'id')

⭐ 案例
需求:打开注册 A.html 页面,完成以下操作:

  1. 使用 id 定位,输入用户名:admin
  2. 使用 id 定位,输入密码:123456
  3. 3秒后关闭浏览器窗口
# 1.导入包
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep# 2.获取浏览器对象
driver = webdriver.Chrome()# 3.打开url
# 改成实际路径
url = r"E:\CODE\test_study\web_source\day01\注册A.html"
driver.get(url)# 4.查找 用户名元素
username = driver.find_element(By.ID,'userA')# 5.查找 密码元素
password = driver.find_element(By.ID,'passwordA')# 6.用户名输入 admin
# send_keys('内容')
username.send_keys('admin')
# 7.密码输入 123456
password.send_keys('123456')# 8.暂停3秒
sleep(3)# 9.退出浏览器驱动
driver.quit()

在这里插入图片描述

二、name 定位

name 定位就是根据元素 name 属性来定位,HTML 文档中 name 的属性值是可以重复的。
前提:元素有 name 属性。

element = driver.find_element(By.NAME,'name')

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleepdriver = webdriver.Chrome()url = r"E:\CODE\test_study\web_source\day01\注册A.html"
driver.get(url)username = driver.find_element(By.NAME,'userA').send_keys('admin')
password = driver.find_element(By.NAME,'passwordA').send_keys('123456')sleep(3)driver.quit()

三、class_name 定位

class_name 定位就是根据元素 class 属性值来定位元素。
HTML 通过使用 class 来定义元素的样式。
前提:元素有 class 属性。
注意:如果 class 有多个属性值,只能使用其中的一个。

element = driver.find_element(By.CLASS_NAME,'class_name')

⭐ 案例
需求:打开注册A.html页面,完成以下操作:

  1. 通过 class_name 定位电话号码 A,并输入:18611111111
  2. 3秒后关闭浏览器窗口
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleepdriver = webdriver.Chrome()url = r"E:\CODE\test_study\web_source\day01\注册A.html"
driver.get(url)telephone = driver.find_element(By.CLASS_NAME,'telA')telephone.send_keys('18611111111')sleep(3)driver.quit()

四、tag_name 定位

tag_name 定位就是通过标签名来定位。
HTML 本质就是由不同的 tag 组成,每一种标签一般在页面中会存在多个,所以不方便进行精确定位,一般很少使用。

element = driver.find_element(By.TAG_NAME,'tag_name')

如果存在多个相同标签,则返回符合条件的第一个标签。

需求:使用 tag_name 定位方式,使用注册A.html页面,用户名输入 admin

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleepdriver = webdriver.Chrome()url = r"E:\CODE\test_study\web_source\day01\注册A.html"
driver.get(url)username = driver.find_element(By.TAG_NAME,'input')
username.send_keys('admin')sleep(3)driver.quit()

要获取相同标签名的第二个元素,可以使用 find_elements 方法先获取所有符合条件的元素列表,再通过索引获取第二个元素(索引从 0 开始,第二个元素的索引为 1)。

示例代码如下:

# 导入By类
from selenium.webdriver.common.by import By# 获取所有指定标签名的元素(返回列表)
elements = driver.find_elements(By.TAG_NAME, 'tag_name')# 获取第二个元素(索引为1)
if len(elements) >= 2:  # 确保列表至少有2个元素,避免索引越界second_element = elements[1]
else:print("没有足够的元素")

说明:

  • find_elements 会返回页面中所有符合标签名的元素,以列表形式存储。
  • 列表的索引从 0 开始,因此 elements[1] 对应第二个元素。
  • 使用前建议判断列表长度,避免因元素数量不足导致报错。
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleepdriver = webdriver.Chrome()url = r"E:\CODE\test_study\web_source\day01\注册A.html"
driver.get(url)# 获取所有input元素(列表形式)
inputs = driver.find_elements(By.TAG_NAME, 'input')# 第一个input通常是用户名(索引0)
username = inputs[0]
username.send_keys('admin')# 第二个input通常是密码(索引1)
password = inputs[1]
password.send_keys('123456')  # 输入密码sleep(3)driver.quit()

在这里插入图片描述

五、link_text 定位

link_text 定位是专门用来定位超链接元素(<a>标签</a>),并且是通过超链接的文本内容来定位元素。

element = driver.find_element(By.LINK_TEXT, 'link_text')

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleepdriver = webdriver.Chrome()url = r"E:\CODE\test_study\web_source\day01\注册A.html"
driver.get(url)driver.find_element(By.LINK_TEXT,'访问 新浪 网站').click()sleep(3)
driver.quit()

在这里插入图片描述

在这里插入图片描述

六、partial_link_text 定位

在 Selenium 中,partial_link_text 是一种通过链接文本的部分内容来定位超链接元素(<a> 标签)的方法。它适用于当你知道链接文本的一部分,但不确定完整文本时使用。

find_element(By.PARTIAL_LINK_TEXT, 部分文本)

  1. 匹配规则
    只要链接的完整文本(<a> 标签内的文本内容)中包含你指定的“部分文本”,就会被匹配到。
    例如,链接文本为“点击查看示例页面”,使用 partial_link_text="示例" 可以成功定位。

  2. 大小写敏感
    匹配过程区分大小写(不同浏览器可能略有差异,建议按实际文本大小写编写)。

  3. 返回结果

    • find_element 会返回第一个匹配到的元素。
    • 若要获取所有匹配的元素,使用 find_elements(返回列表,无匹配时为空列表)。
  4. 适用元素
    仅用于定位 <a> 标签的超链接,其他标签(如按钮)不适用。

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleepdriver = webdriver.Chrome()url = r"E:\CODE\test_study\web_source\day01\注册A.html"
driver.get(url)driver.find_element(By.PARTIAL_LINK_TEXT,'访问').click()sleep(3)
driver.quit()

在这里插入图片描述

七、XPath 定位

XPath 是一种在 XML/HTML 文档中查找元素的语言,通过路径表达式定位元素,支持复杂条件匹配,灵活性极高。

1. 基本语法

  • 绝对路径:从根节点(/html)开始,逐级书写,如:
    html/body/div[1]/a(不推荐,页面结构变化易失效)。
  • 相对路径:从任意节点开始,以 // 开头,如:
    //div[@class="container"]/a(推荐,更稳定)。

2. 常用定位方式

场景表达式示例说明
通过标签名//tagname匹配所有 tagname 标签(如 //a
通过属性//tagname[@属性名="属性值"]//input[@id="username"]
通过部分属性值//tagname[contains(@属性名, "部分值")]包含://a[contains(@href, "login")]
//tagname[starts-with(@属性名, "开头值")]开头://img[starts-with(@src, "logo")]
通过文本内容//tagname[text()="完整文本"]精确匹配文本,如 //button[text()="登录"]
通过部分文本//tagname[contains(text(), "部分文本")]//p[contains(text(), "欢迎")]
索引定位(从1开始)//tagname[index]//li[2](第二个li标签)
多条件组合//tagname[@a="x" and @b="y"]同时满足多个属性条件
父节点/子节点/兄弟节点//div[@id="box"]/parent::*(父节点)parent::* 表示父节点,child::* 子节点,following-sibling::* 后续兄弟

3. 优缺点

  • 优点:支持文本定位、复杂条件组合、层级关系灵活,几乎能定位所有元素。
  • 缺点:语法相对复杂,定位速度略慢于 CSS。

⭐ 绝对定位

# 相对路径://*[@id="userA"]
# 绝对路径:/html/body/form/div/fieldset/p[1]/inputfrom selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleepdriver = webdriver.Chrome()url = r"E:\CODE\test_study\web_source\day01\注册A.html"
driver.get(url)try:driver.find_element(By.XPATH,'/html/body/form/div/fieldset/p[1]/input').send_keys('admin')sleep(2)finally:driver.quit()

⭐ 相对定位:

# 相对路径://*[@id="userA"]
# 绝对路径:/html/body/form/div/fieldset/p[1]/inputfrom selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleepdriver = webdriver.Chrome()url = r"E:\CODE\test_study\web_source\day01\注册A.html"
driver.get(url)try:driver.find_element(By.XPATH,'//*[@id="userA"]').send_keys('admin')sleep(2)finally:driver.quit()

在这里插入图片描述

八、CSS 定位

CSS(层叠样式表)定位通过元素的样式属性或层级关系定位,语法简洁,定位速度快,是实际项目中推荐的方式。

1. 基本语法

  • 通过标签名tagname(如 a 匹配所有 <a> 标签)。
  • 通过ID#id值(如 #username 匹配 id="username" 的元素)。
  • 通过class.class值(如 .btn 匹配 class="btn" 的元素,多class用 .class1.class2)。

2. 常用定位方式

场景表达式示例说明
通过属性tagname[属性名="属性值"]input[name="password"]
部分属性值(包含)tagname[属性名*="部分值"]a[href*="register"]
部分属性值(开头)tagname[属性名^="开头值"]img[src^="banner"]
部分属性值(结尾)tagname[属性名$="结尾值"]a[href$=".html"]
层级关系(直接子元素)父元素 > 子元素div.container > ul > li
层级关系(后代元素)祖先元素 后代元素.nav a(匹配class为nav内的所有a标签)
索引定位(从1开始)tagname:nth-child(n)li:nth-child(3)(父元素下第3个li)
第一个/最后一个子元素tagname:first-child / :last-childtr:first-child

3. 优缺点

  • 优点:语法简洁,定位速度快,支持大多数场景,是Selenium推荐的定位方式。
  • 缺点:不支持直接通过文本内容定位(需结合其他属性),复杂层级条件不如XPath灵活。

XPath与CSS定位对比与选择建议

场景优先选择原因
简单ID/Class/属性定位CSS语法更简洁,速度更快
文本内容定位XPathCSS不支持直接文本匹配
复杂条件组合(多属性)XPath支持 and/or 逻辑,更灵活
层级关系(如兄弟节点)XPath处理层级关系更直观
性能优先CSS浏览器对CSS解析效率更高

示例总结

需求XPath 表达式CSS 表达式
定位id为"login"的按钮//button[@id="login"]button#login
定位class含"active"的a标签//a[contains(@class, "active")]a[class*="active"]
定位文本为"首页"的链接//a[text()="首页"]无直接支持(需间接通过其他属性)
定位第2个li子元素//ul/li[2]ul li:nth-child(2)

提示:实际使用中,建议优先用CSS,复杂场景(如文本定位)再用XPath,同时避免过度依赖绝对路径,尽量通过稳定的属性(如id、独特class)定位。

http://www.dtcms.com/a/531830.html

相关文章:

  • 苏州建设工程信息网站wordpress自动生成tag
  • 学习C#调用OpenXml操作word文档的基本用法(1:读取样式定义)
  • Java-Spring入门指南(二十八)Android界面设计基础
  • Go 语言类型转换
  • 【Windows】goland-2024版安装包
  • 快速入门elasticsearch
  • Linux 多用户服务器限制单用户最大内存使用(systemd user.slice)
  • 食品公司网站设计项目雨蝶直播免费直播
  • SQL 调试不再靠猜:Gudu SQL Omni 让血缘分析一键可视化
  • RV1126 NO.34:OPENCV的交叉编译和项目Makefile讲解
  • FreeRTOS---进阶知识4---通用链表
  • jvm逃逸问题的分析以及给出解决方案?
  • PHP 表单:深入浅出地掌握表单处理
  • Linux(Ubuntu)操作系统下文件的解压
  • HTTP 1.0版本的webserver自主实现
  • 【开题答辩全过程】以 基于微信小程序的个性化饮品定制点餐系统设计与实现为例,包含答辩的问题和答案
  • kotlin - 显示heic图片
  • 做网站域名是什么意思网站不备案会怎样
  • A2A+MCP构建智能体协作生态:下一代分布式人工智能架构解析
  • SpringBoot 的三类配置文件
  • 创造模式物品栏——多物品栏
  • Docker中部署多个ASP.NET Core实例
  • HarmonyOS生物识别认证深度解析:从指纹到人脸的安全实践
  • GitHub等平台形成的开源文化正在重塑加热d
  • C++新特性概览
  • dify 配置 deepseek Credentials validation failed with status code 402
  • 【自然语言处理】Transformer模型
  • 使用 RapidXML 实现 C++ 中的 XML 文件读取与生成,特别适合需要快速处理 XML 的场景
  • 基于Reactor模式的高性能C++仿Muduo库:Server服务器模块实现
  • 常州市网站建设设计公众号开发和小程序开发哪个简单