什么是显式等待?
在appium 中 可以通过implicitly_wait设置隐式等待时间,即一个全局等待元素出现的最长时间。
隐式等待设置完成后,可以一直等待到元素出现,如果在设置的最长时间内元素没有出现,则会报元素找不到错误。
显示等待提供了一些自定义的元素等待方法,可以通过设置自己定义等待的方法来进行扩展。
使用方式
WebDriverWait(driver, 10).until(lambda x:自定义)
实际应用的场景
比如应用中有时会弹出版本升级对话框,或者做某些操作如果用户登录信息失效的时候需要重新登录,这个时候可以使用显示等待来进行操作。
如果用户没有登录,则需要先登录才能继续发帖。
from appium import webdriver
import unittest
from selenium.webdriver.support.wait import WebDriverWait
class TestAPP(unittest.TestCase):
def setUp(self) -> None:
caps = {}
caps["automationName"] = "UiAutomator2"
caps["platformName"] = "Android"
caps["platformVersion"] = "5"
caps["deviceName"] = "127.0.0.1:21503"
caps['appPackage'] = "org.cnodejs.android.md"
caps['appActivity'] = ".ui.activity.LaunchActivity"
caps['noReset'] = True
caps['fullReset'] = False
self.driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", caps)
self.driver.implicitly_wait(20)
def test_alert(self):
def handler_login(x):
token = '527e85d4-cd50-468c-8003-b804651fba09'
xpath = '//android.widget.Button[@text="登录"]'
if len(self.driver.find_elements_by_xpath(xpath)) > 0:
self.driver.find_element_by_xpath(xpath).click()
self.driver.find_element_by_xpath(
'//*[@resource-id="org.cnodejs.android.md:id/edt_access_token"]').send_keys(token)
self.driver.find_element_by_xpath('//*[@resource-id="org.cnodejs.android.md:id/btn_login"]').click()
return True
else:
return False
self.driver.find_element_by_id('org.cnodejs.android.md:id/fab_create_topic').click()
# WebDriverWait(self.driver, 10, 0.3).until(lambda x : True)
try:
WebDriverWait(self.driver, 10, 0.3).until(handler_login)
self.driver.find_element_by_id('org.cnodejs.android.md:id/fab_create_topic').click()
except:
pass
self.driver.find_element_by_id('org.cnodejs.android.md:id/edt_title').send_keys("hello world")