深度解析自动化测试元素定位神器:element_get函数

深度解析自动化测试元素定位神器:element_get函数

在自动化测试中,元素定位是基础但也是痛点,本文将深入解析一个强大的元素定位函数,解决测试中的常见难题

一、函数全景解析

def element_get(self, driver, locate_type, locator_expression, timeout=10, must_be_visible=False):
    # 函数实现代码...

函数参数详解

参数名类型默认值作用示例值
driverWebDriver浏览器驱动实例webdriver.Chrome()
locate_typestr定位方式By.ID, By.XPATH
locator_expressionstr定位表达式“username”, “//input[@name=‘password’]”
timeoutint10超时时间(秒)15
must_be_visibleboolFalse是否要求元素可见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()

解决的问题:区分元素"存在"和"可见"两种状态
实际案例

  1. 隐藏的下拉菜单(存在但不可见)
  2. 弹窗蒙层下的按钮(被覆盖不可操作)
  3. 屏幕外的页面元素(需要滚动才可见)

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函数,我们解决了自动化测试中最常见的元素定位难题,显著提升了测试脚本的稳定性和可靠性。


「小贴士」:点击头像→【关注】按钮,获取更多软件测试的晋升认知不迷路! 🚀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值