自动化之显示等待

显式等待是appium中webdriver用于同步测试的另外一种等待机制。显式等待比隐式等待具备更好的操控性。 ,与隐式等待不同,我们可以为脚本设置一些预置或者定制化的条件,等待条件满足后再近些下一步测试。
在使用场景上,隐式等待用来做一个全局的控制,例如设置全局隐式等待6秒;显式等待可以只作用于仅有同步需求的测试用例,它可以只针对某一个元素进行等待。
webdriver提供了WebDriverWait类来实现显式等待,配合该类的until()和until_not()方法,在设置的时间内,默认每隔一段时间去检测一次当前页面下指定的元素是否加载完,加载完了就执行下一步,否则继续每隔一段时间去判断,指定时间截止,如果超时就会抛出异常(TimeoutException)。具体格式如下:

WebDriverWait(driver,timeout=10,poll_frequency=0.5,ignored_exceptions=None)
  • driver:webdriver实例
  • timeout:最长超时时间,默认以秒为单位
  • poll_frequency:检测的时间间隔,默认为0.5秒
  • ignored_exceptions:超时后的异常信息,默认情况下抛出TimeoutException异常
#调用该方法提供的驱动程序作为一个参数,直到返回值为True
until(method,message='')
#调用该方法提供的驱动程序作为一个参数,直到返回Fasle
until_not(method,message="")

如下所示:

WebDriverWait(driver,timeout=10,poll_frequency=0.5,\
              ignored_exceptions=None).until(lambda x :x.find_element_by_id("resource_id"))

实例:

from appium import webdriver
from selenium.common.exceptions import NoSuchElementException, TimeoutException
import time
from selenium.webdriver.support.wait import WebDriverWait

desired_caps = {
    'platformName': 'Android',
    'platformVersion': '6.0.1',
    'deviceName': '127.0.0.1:21305',
    'appPackage': 'com.baidu.homework',
    'appActivity': 'com.baidu.homework.activity.index.IndexActivity',
    'automationName': 'Appium',
    'noReset': False,
    # 输入中文参数配置
    "unicodeKeyboard": True,
    "resetKeyboard": True,
}

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



def zuoyebang_login(un="zuoyebang", pw="zuoyebang!test"):

    # 点击未登录按钮
    driver.find_element_by_id("com.baidu.homework:id/rl_login_guide_layout").click()
    # 点击密码登陆
    driver.find_element_by_id("com.baidu.homework:id/sll_password").click()
    #设置隐式等待时间10s
    try:
        # 输入用户名
        print(time.strftime('%H:%M:%S', time.localtime(time.time())))
        us=WebDriverWait(driver, timeout=10, poll_frequency=0.5).until(lambda x: x.find_element_by_id("com.baidu.homework:id/passport_phone_number_input_edit0"),message='用户名输入框定位超时')
        us.send_keys("un")
        # 输入密码
        driver.find_element_by_id("com.baidu.homework:id/passport_password_input_view").send_keys(pw)
    except TimeoutException as e:
        print(e)
        print(time.strftime('%H:%M:%S', time.localtime(time.time())))
if __name__ == '__main__':
    # 调用登陆方法
    zuoyebang_login()
posted @ 2020-08-22 15:47  Eliphaz  阅读(313)  评论(0编辑  收藏  举报