自动化APP测试APPium的元素等待

在使用Appium进行移动应用自动化测试时,有三种等待。

隐式等待driver.implicitly_wait()

显式等待(常用)

time.sleep()

隐式等待(Implicit Wait)

应用场景

  • 当你希望对所有元素定位操作设置统一的超时时间,以应对网络波动或服务器响应速度不一致的情况。

概念

  • 设置一个全局的等待时间,如果在指定时间内未找到元素,则抛出NoSuchElementException异常。
  • 适用于整个会话期间,对于每个元素查找都会生效。

步骤

复制代码
driver.implicitly_wait(10)  # 设置隐式等待时间为10秒

作用

  • 减少了代码中重复的等待逻辑,简化了脚本编写。
  • 对于不稳定网络环境下的元素查找尤其有用。

显式等待(Explicit Wait)

应用场景

  • 当你需要针对特定元素或条件进行等待时,例如等待某个特定元素变得可点击或可见。

概念

  • 使用WebDriverWait结合expected_conditions模块,可以灵活地定义等待条件。
  • 允许更精细地控制何时继续执行下一步操作。

常用expected_conditions方法

  • title_is(title):等待页面标题等于给定值。
  • presence_of_element_located(locator):等待元素出现在DOM中。
  • element_to_be_clickable(locator):等待元素出现在DOM中且可点击。
  • 更多请参考Selenium文档中的Expected Conditions

示例代码

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

wait = WebDriverWait(driver, 25, 5)  # 最多等待25秒,每5秒检查一次
element = wait.until(EC.element_to_be_clickable((By.XPATH, "//android.widget.TextView[@text='Login']")))
element.click()

time.sleep()

概念

  • 是一个阻塞调用,会让当前线程暂停执行指定的秒数。
  • 不推荐频繁使用,因为它会导致不必要的延迟,降低测试效率。

智能等待机制 - 轮询检查

为了提高测试效率并减少不必要的等待时间,可以采用轮询检查的方法代替固定的time.sleep()。这种方法通过每次短暂等待后检查目标状态是否满足,直到达到最大等待时间或条件被满足为止。

示例代码

复制代码
def wait_for_element(driver, by, value, timeout=30):
    end_time = time.time() + timeout
    while time.time() < end_time:
        try:
            element = driver.find_element(by, value)
            if element.is_displayed():
                return element
        except Exception:
            pass
        time.sleep(1)  # 每隔1秒检查一次
    raise TimeoutError("等待元素超时")

总结

  • 隐式等待提供了一种简单的方式为所有元素查找设置统一的超时时间,适合应用于需要一致等待策略的场景。
  • 显式等待则允许更加精准地控制何时继续执行,基于特定条件进行等待,非常适合复杂或动态变化的应用界面。
  • 避免直接使用time.sleep(),除非确实有必要,因为这会导致不可预知的延迟,影响测试性能。
相关推荐
TTBIGDATA1 小时前
【knox】User: knox is not allowed to impersonate admin
大数据·运维·ambari·hdp·trino·knox·bigtop
佑白雪乐1 小时前
<Linux基础第10集>复习前面内容
linux·运维·服务器
春日见1 小时前
自动驾驶规划控制决策知识点扫盲
linux·运维·服务器·人工智能·机器学习·自动驾驶
玉树临风江流儿2 小时前
docker镜像加速器配置步骤
运维·docker·容器
China_Yanhy3 小时前
我的区块链运维日记 · 第 11 日:生死时速 —— 闪电贷攻击与“红色按钮”
运维·区块链
2401_840192273 小时前
怎么把运维能力沉淀下来?
运维
云游云记3 小时前
nesbot/carbon 常用功能总结
linux·运维·服务器
landonVM4 小时前
Linux 下的高效压缩工具 Zstandard
linux·运维·服务器
遇见火星4 小时前
服务器运维操作命令速查手册
运维·服务器