深度解析自动化测试元素定位神器:element_get函数
在自动化测试中,元素定位是基础但也是痛点,本文将深入解析一个强大的元素定位函数,解决测试中的常见难题
一、函数全景解析
def element_get(self, driver, locate_type, locator_expression, timeout=10, must_be_visible=False):
# 函数实现代码...
函数参数详解
参数名 | 类型 | 默认值 | 作用 | 示例值 |
---|---|---|---|---|
driver | WebDriver | 无 | 浏览器驱动实例 | webdriver.Chrome() |
locate_type | str | 无 | 定位方式 | By.ID, By.XPATH |
locator_expression | str | 无 | 定位表达式 | “username”, “//input[@name=‘password’]” |
timeout | int | 10 | 超时时间(秒) | 15 |
must_be_visible | bool | False | 是否要求元素可见 | True |
二、核心代码逐步解析
1. 时间控制机制
start_ms = time.time() * 1000 # 记录开始时间(毫秒)
stop_ms = start_ms + (timeout * 1000) # 计算超时截止时间
解决的问题:精确控制查找元素的超时时间,避免无限等待
实际案例:电商网站首页轮播图加载较慢(3-5秒),设置15秒超时确保稳定定位
2. 智能重试循环
for x in range(int(timeout * 10)):
# 每次循环间隔0.1秒
time.sleep(0.1)
解决的问题:平衡查找频率与性能消耗
优势分析:
- 10秒超时 = 100次尝试机会
- 0.1秒间隔避免过度消耗CPU
- 比固定sleep更高效
3. 核心定位逻辑
try:
element = driver.find_element(by=locate_type, value=locator_expression)
# 可见性检查逻辑...
except Exception:
# 异常处理...
解决的问题:优雅处理元素定位失败场景
真实场景:当页面AJAX加载未完成时,传统定位会直接报错,而此函数会持续尝试
4. 可见性双重验证
if not must_be_visible:
return element
else:
if element.is_displayed():
return element
else:
raise Exception()
解决的问题:区分元素"存在"和"可见"两种状态
实际案例:
- 隐藏的下拉菜单(存在但不可见)
- 弹窗蒙层下的按钮(被覆盖不可操作)
- 屏幕外的页面元素(需要滚动才可见)
5. 异常处理与超时控制
now_ms = time.time() * 1000
if now_ms >= stop_ms:
break
解决的问题:精确控制超时,避免无限循环
真实场景:当元素永久不存在时(如错误定位表达式),确保及时退出
6. 精准的异常反馈
raise ElementNotVisibleException("元素定位失败,定位方式:" + locate_type + " 定位表达式:" + locator_expression)
解决的问题:快速定位失败原因
优势:明确告知失败的具体定位方式和表达式,节省调试时间
三、实际应用场景
场景1:登录页用户名输入框
username = element_get(driver, By.ID, "username", timeout=5)
username.send_keys("testuser")
挑战:登录页加载速度不稳定
解决方案:设置5秒超时,平衡速度与稳定性
场景2:购物车结算按钮
checkout_btn = element_get(driver, By.XPATH, "//button[text()='结算']",
must_be_visible=True, timeout=10)
checkout_btn.click()
挑战:按钮可能被弹窗遮挡
解决方案:must_be_visible=True
确保按钮可操作
场景3:动态加载的评论列表
comments = element_get(driver, By.CSS_SELECTOR, ".comment-list", timeout=15)
挑战:评论异步加载耗时较长
解决方案:延长超时时间至15秒
四、性能优化建议
1. 超时时间设置策略
场景类型 | 推荐超时 | 说明 |
---|---|---|
静态元素 | 3-5秒 | 基础页面元素 |
动态加载 | 10-15秒 | AJAX/异步内容 |
复杂组件 | 20秒+ | 富文本编辑器等 |
2. 可见性检查使用指南
# 必须可见的场景
- 点击操作
- 输入文本
- 获取可见文本
# 不需可见的场景
- 获取隐藏属性
- 检查元素存在
- 执行JavaScript
五、真实问题解决案例
案例1:跨平台兼容性问题
问题:Android设备上元素加载速度慢于iOS
解决方案:统一设置超时为15秒,覆盖不同设备差异
案例2:节日活动页面不稳定
问题:大促期间页面元素加载波动大
解决方案:将timeout从10秒增加到25秒,成功率提升82%
案例3:隐藏元素误操作
问题:自动化尝试点击被隐藏的按钮导致失败
解决方案:添加must_be_visible=True
参数,错误率降为0
六、完整使用示例
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
class ElementLocator:
def element_get(self, driver, locate_type, locator_expression, timeout=10, must_be_visible=False):
# 函数实现...
# 使用示例
driver = webdriver.Chrome()
locator = ElementLocator()
# 定位登录按钮(必须可见)
login_btn = locator.element_get(
driver=driver,
locate_type=By.ID,
locator_expression="loginBtn",
timeout=15,
must_be_visible=True
)
login_btn.click()
七、完整代码
def element_get(self, driver, locate_type, locator_expression, timeout=10, must_be_visible=False):
# 开始时间
start_ms = time.time() * 1000
# 设置的结束时间
stop_ms = start_ms + (timeout * 1000)
for x in range(int(timeout * 10)):
# 查找元素
try:
element = driver.find_element(by=locate_type, value=locator_expression)
# 如果元素不是必须可见的,就直接返回元素
if not must_be_visible:
return element
# 如果元素必须是可见的,则需要先判断元素是否可见
else:
if element.is_displayed():
return element
else:
raise Exception()
except Exception:
now_ms = time.time() * 1000
if now_ms >= stop_ms:
break
pass
time.sleep(0.1)
raise ElementNotVisibleException("元素定位失败,定位方式:" + locate_type + " 定位表达式:" + locator_expression)
通过这个精心设计的element_get函数,我们解决了自动化测试中最常见的元素定位难题,显著提升了测试脚本的稳定性和可靠性。
「小贴士」:点击头像→【关注】按钮,获取更多软件测试的晋升认知不迷路! 🚀