四、自动化等待机制

文章介绍了在Appium自动化测试中处理页面加载和元素出现延迟的三种等待方式:强制等待通过`time.sleep()`实现;隐式等待`implicitly_wait()`更智能,全局设置影响所有元素查找;显式等待利用`WebDriverWait`和`expected_conditions`进行精确控制,等待特定元素出现。此外,还提到了`wait_activity`用于等待Android特定页面活动加载。
摘要由CSDN通过智能技术生成

目录

1、强制等待

2、隐式(性)等待(推荐)

等待资源加载

等待指令

3、显式(性)等待

条件等待

activity 等待


为了保证脚本的稳定性,有时候需要引入等待时间,等待页面加载元素后再进行操作,主要有三种等待时间设置方式。

1、强制等待

sleep()以秒为单位

import time
from appium import webdriver
from appium.webdriver.webdriver import By
from selenium.webdriver.support.wait import WebDriverWait

des = {
    'automationName':'appium',
    'platformName':'Android',
    'platformVersion':'12.4.1',  # 填写android虚拟机/真机的系统版本号
    'deviceName':'aa',      # 填写安卓虚拟机/真机的设备名称
    'appPackage':'bb',    # 填写被测app包名
    'appActivity':'.cc',    # 填写被测app的入口
    'udid':'127.0.0.1:4532',    # 填写通过命令行 adb devices 查看到的udid
    'noReset':True,               # 是否重置APP
    'unicodeKeyboard':True,       # 是否支持中文输入
    'resetKeyboard':True,         # 是否支持重置键盘
    'newCommandTimeout':60        # 60秒没发送新命令就断开连接
       }

driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',des)

time.sleep(2)        # 等待2秒

2、隐式(性)等待

implicitlyWait():隐式等待是由webdriver提供的超时等待方法,它比 sleep() 方法智能,sleep()方法只能在一个固定的时间等待,而 implicitlyWait() 可以在一个时间范围内等待,称为隐式等待

缺点:当使用了隐式等待执行测试的时候,如果 WebDriver没有在 DOM(Document Object Model)中找到element,将继续等待,超出设定时间后则抛出找不到element的异常。那就是当查找element或element并没有立即出现的时候,隐式等待将等待一段时间再查找 DOM,默认的时间是0,一旦设置了隐式等待,则它存在整个 WebDriver 对象实例的声明周期中,隐式等待会让一个正常响应的应用的测试变慢,它将会在寻找每个element的时候都进行等待,这样会增加整个测试执行的时间。
 

  • 等待资源加载

import time
from appium import webdriver
from appium.webdriver.webdriver import By
from selenium.webdriver.support.wait import WebDriverWait

des = {
    'automationName':'appium',
    'platformName':'Android',
    'platformVersion':'12.4.1',  # 填写android虚拟机/真机的系统版本号
    'deviceName':'aa',      # 填写安卓虚拟机/真机的设备名称
    'appPackage':'bb',    # 填写被测app包名
    'appActivity':'.cc',    # 填写被测app的入口
    'udid':'127.0.0.1:4532',    # 填写通过命令行 adb devices 查看到的udid
    'noReset':True,               # 是否重置APP
    'unicodeKeyboard':True,       # 是否支持中文输入
    'resetKeyboard':True,         # 是否支持重置键盘
    'newCommandTimeout':60        # 60秒没发送新命令就断开连接
       }


driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',des)

# 隐式等待:全局设置,它只要设置了,那么下面的代码只要包含了 find_element 方法都会产生等待元素的效果
# 等待机制:每隔500ms 在页面上检查是否出现该元素,如果在指定的时间内都没找到,则报错
driver.implicitly_wait(30)  # 隐式等待
driver.find_element(By.XPATH,'//android.widget.TextView[@text="hello"]').click()
driver.find_element(By.XPATH,'//android.widget.TextView[@text="word"]').click()
  • 等待指令

caps={
    ...
    # 等待新的指令出现,如果超过某一段时间,没有新的指令发送给appium,则正在保持的会话自动结束,默认是3000ms
    "newCommandTimeout":36000
}

3、显式(性)等待

显示等待(用到WebDriverWait和expected_conditions两个类),由webdriver提供,是针对某个元素来设置的等待时间;显性等待是每次都需要调用的一种等待类型

条件等待

语法格式如下:

WebDriverWait(driver,timeout,poll_frequency=0.5,ignore_exceptions=None)

driver:WebDriver的驱动程序(IE,火狐,谷歌或远程)

timeout:最长超时时间,默认以秒为单位

poll_frequency:休眠时间的间隔(步长)时间,默认为0.5秒(即每500毫秒扫描一次页面)

ignore_exceptions:超时后的异常信息,默认情况下抛NoSuchElementException异常

通常在网页中并不是所有元素都是可见的,也有的是初始化时不可见,加载完成时则状态又变为可见,所以在元素等待中以下这些方式是经常被用到的 

from selenium.webdriver.support import expected_conditions as ec
以下是ec 的函数:

# 判断某个元素是否被加到了dom树里,并不代表该元素一定可见
presence_of_element_located   # 底层就是用的find_element,所以它也只是对加载的等待。

# 找所有元素,所有元素都能找到就行
presence_of_all_elements_located 

# 元素等待直到能定位到可见的元素
visibility_of(element)

#判断某个元素是否可见. 可见代表元素非隐藏,并且元素的宽和高都不等于0
visibility_of_element_located # 底层是元素的显示属性的等待,所以它是包含了对渲染的结果的等待。

# 找所有元素,所有元素都要是显示出来的才行。
visibility_of_all_elements_located

# 这个是找所有元素,所有元素中有一个显示了就行,即判断是否至少有1个元素存在于dom树中,并且可见
visibility_of_any_elements_located

# 判断某个元素中是否不存在于dom树或不可见,即元素等待直到元素被加载,可以定位到并且元素必须为不可见状态,才会结束等待
invisibility_of_element_located(locator)
import time
from appium import webdriver
from appium.webdriver.webdriver import By
from selenium.webdriver.support.wait import WebDriverWait

des = {
    'automationName':'appium',
    'platformName':'Android',
    'platformVersion':'12.4.1',  # 填写android虚拟机/真机的系统版本号
    'deviceName':'aa',      # 填写安卓虚拟机/真机的设备名称
    'appPackage':'bb',    # 填写被测app包名
    'appActivity':'.cc',    # 填写被测app的入口
    'udid':'127.0.0.1:4532',    # 填写通过命令行 adb devices 查看到的udid
    'noReset':True,               # 是否重置APP
    'unicodeKeyboard':True,       # 是否支持中文输入
    'resetKeyboard':True,         # 是否支持重置键盘
    'newCommandTimeout':60        # 60秒没发送新命令就断开连接
       }


driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',des)
# 显示等待:创建一个显示等待对象  until() 需要一个method作为实参
# 工作机制:默认每隔500ms检查是否出现该元素,默认值可以通过参数自定义poll_frequency
wait = WebDriverWait(driver,30,0.8)
# wait.until(<ec模块函数的调用>)
# wait.until_not(<ec模块函数的调用>)
wait.until(lambda dr:dr.find_element_by_xpath('//android.widget.TextView[@text="hello"]'))
wait.until_not()

activity 等待

在启动app的时候,如果直接做下一步点击操作,经常会报错,于是我们会在启动完成的时候加sleep,但是等待时间到底设置多少合适呢?设置长了,就浪费时间,设置短了,就会找不到元素报错了。
这个时候我们可以用wait_activity的语法,等到你想点击的页面activity出现了,再点击,可以有效的节省时间。

 android特有的,返回的True或者False

driver.wait_activity(活动名,超时时间,频率时间)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值