Selenium 八大元素定位方法及场景扩展

Selenium 提供了八种常见的元素定位方法,用于在网页中准确找到需要操作的元素。以下是详细介绍以及一些特殊场景的解决方案。


1. ID 定位

用法:

通过元素的唯一 id 属性进行定位。

复制代码
element = driver.find_element(By.ID, "element_id")

使用场景:

适用于 HTML 中 id 唯一的场景,通常是表单控件、按钮等。


2. Name 定位

用法:

通过元素的 name 属性进行定位。

复制代码
element = driver.find_element(By.NAME, "element_name")

使用场景:

适合用在表单或具有明确 name 属性的标签。


3. Class Name 定位

用法:

通过元素的 class 属性进行定位。

复制代码
element = driver.find_element(By.CLASS_NAME, "element_class")

使用场景:

适用于具有明确样式类的 HTML 标签。需要注意,如果多个元素有相同的 class,需要结合其他属性筛选。


4. Tag Name 定位

用法:

通过标签名进行定位。

复制代码
elements = driver.find_elements(By.TAG_NAME, "button")

使用场景:

适合查找一组同类元素,比如获取页面上所有的按钮或输入框。


用法:

通过超链接的完整文本内容进行定位。

复制代码
element = driver.find_element(By.LINK_TEXT, "Click Here")

使用场景:

适用于超链接文本明确且唯一的情况。


用法:

通过超链接的部分文本内容进行定位。

复制代码
element = driver.find_element(By.PARTIAL_LINK_TEXT, "Click")

使用场景:

适用于超链接文本较长且部分内容具有唯一性的场景。


7. CSS Selector 定位

用法:

通过 CSS 选择器语法进行定位。

复制代码
element = driver.find_element(By.CSS_SELECTOR, "div.container > ul > li:nth-child(2)")

使用场景:

适用于复杂的嵌套结构,支持丰富的选择器语法,如 nth-child、伪类等。


8. XPath 定位

用法:

通过 XPath 表达式进行定位,支持绝对路径和相对路径。

复制代码
element = driver.find_element(By.XPATH, "//div[@id='main']//a[text()='Click Here']")

使用场景:

适用于复杂的层级结构和条件筛选,支持灵活的定位逻辑。


特殊场景扩展

1. 通过子节点找到父节点

场景描述: Selenium 不直接支持从子节点返回父节点,但可以通过 XPath 的 .. 语法实现。

示例:

复制代码
<div class="parent">
    <span class="child-class">Child</span>
</div>

XPath:

复制代码
parent_element = driver.find_element(By.XPATH, "//span[@class='child-class']/..")

解释:

  • //span[@class='child-class'] 定位子节点 <span>
  • /.. 回到父节点 <div>

2. 通过兄弟节点定位

场景描述: 找到当前元素的兄弟节点,通常用于导航到同级的其他元素。

示例:

复制代码
<div id="current">Current Node</div>
<div id="sibling">Sibling Node</div>

XPath:

复制代码
sibling_element = driver.find_element(By.XPATH, "//div[@id='current']/following-sibling::div[1]")

解释:

  • //div[@id='current'] 定位当前节点。
  • /following-sibling::div[1] 查找当前节点后面的第一个兄弟节点。

3. 动态属性定位

场景描述: 有些属性的值是动态生成的,比如随机 ID,可以使用部分匹配的方法来定位。

示例:

复制代码
<input id="random_1234" type="text">

XPath:

复制代码
element = driver.find_element(By.XPATH, "//input[contains(@id, 'random_')]")

解释:

  • contains(@id, 'random_') 匹配包含 random_id 属性。

4. 查找所有子节点

场景描述: 如果需要找到一个父节点下的所有直接子节点,可以使用 * 通配符。

示例:

复制代码
<div id="container">
    <p>Paragraph 1</p>
    <p>Paragraph 2</p>
    <span>Span 1</span>
</div>

XPath:

复制代码
child_elements = driver.find_elements(By.XPATH, "//div[@id='container']/*")

解释:

  • //div[@id='container'] 定位父节点。
  • /* 表示父节点下的所有直接子节点。

5. 多条件复合定位

场景描述: 当单个属性无法唯一标识元素时,可以结合多个属性进行定位。

示例:

复制代码
<input type="text" name="username" class="login-input">

XPath:

复制代码
element = driver.find_element(By.XPATH, "//input[@type='text' and @name='username']")

解释:

  • @type='text'@name='username' 是两个条件。
  • and 用于组合条件。

6. 使用索引定位

场景描述: 如果有多个相似的元素,需要通过索引定位特定的一个。

示例:

复制代码
<div class="item">Item 1</div>
<div class="item">Item 2</div>
<div class="item">Item 3</div>

XPath:

复制代码
element = driver.find_element(By.XPATH, "(//div[@class='item'])[2]")

解释:

  • (//div[@class='item']) 返回所有匹配的节点集合。
  • [2] 表示选择第二个元素。

7. 部分匹配属性值

场景描述: 如果属性值有特定的前缀或后缀,可以使用 starts-withcontains

示例:

复制代码
<button class="btn-primary-save">Save</button>

XPath:

复制代码
element = driver.find_element(By.XPATH, "//button[starts-with(@class, 'btn-primary')]")

解释:

  • starts-with(@class, 'btn-primary') 匹配以 btn-primary 开头的 class 属性值。

8. 动态加载的元素定位

场景描述: 某些页面的元素是异步加载的,需要显式等待。

示例:

复制代码
<div id="dynamic_element_id">Loaded Content</div>

代码:

复制代码
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, "dynamic_element_id"))
)

解释:

  • WebDriverWait 等待元素出现。
  • presence_of_element_located 检查元素是否已加载到页面上。

通过合理使用以上方法,结合实际场景的需求,可以高效定位并操作网页中的各种元素,提升测试的稳定性和准确性。

相关推荐
程序员小远4 天前
自动化测试基础知识总结
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
LT10157974444 天前
2026年Web自动化测试工具选型指南:多浏览器兼容解决方案
前端·测试工具·自动化
程序员三藏4 天前
Web自动化测试详解
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
深蓝电商API4 天前
Selenium 5.0 全新架构解析:值得升级吗?
爬虫·selenium
专业机床数据采集5 天前
基于 Wireshark 抓包逆向设备通信协议,并用 C# UDP协议跨平台 实现宝元数控程序列表读取、上传、下载和删除
网络·测试工具·wireshark·程序传输·宝元数控·dnc·数控程序传输
程序员龙叔5 天前
从 0 开始学习 AI 测试 - 从接口测试来教你如何用 AI 来生成自动化测试代码
自动化测试·软件测试·python·软件测试工程师·测试工具·性能测试·ai测试
Saniffer_SH5 天前
【高清视频】Gen6 服务器还没到,Gen6 SSD 怎么测?Emily 现场演示三种测试环境
人工智能·驱动开发·测试工具·缓存·fpga开发·计算机外设·压力测试
川石课堂软件测试5 天前
APP自动化测试|高级手势操作&toast操作
css·功能测试·测试工具·microsoft·fiddler·单元测试·harmonyos
LT10157974445 天前
2026年开源自动化测试工具选型指南:功能与适用场景解析
测试工具·开源·自动化