什么是显式等待?

在appium 中 可以通过implicitly_wait设置隐式等待时间,即一个全局等待元素出现的最长时间。
隐式等待设置完成后,可以一直等待到元素出现,如果在设置的最长时间内元素没有出现,则会报元素找不到错误。

显示等待提供了一些自定义的元素等待方法,可以通过设置自己定义等待的方法来进行扩展。

使用方式

  1. WebDriverWait(driver, 10).until(lambda x:自定义)

实际应用的场景

比如应用中有时会弹出版本升级对话框,或者做某些操作如果用户登录信息失效的时候需要重新登录,这个时候可以使用显示等待来进行操作。

image.png
如果用户没有登录,则需要先登录才能继续发帖。

  1. from appium import webdriver
  2. import unittest
  3. from selenium.webdriver.support.wait import WebDriverWait
  4. class TestAPP(unittest.TestCase):
  5. def setUp(self) -> None:
  6. caps = {}
  7. caps["automationName"] = "UiAutomator2"
  8. caps["platformName"] = "Android"
  9. caps["platformVersion"] = "5"
  10. caps["deviceName"] = "127.0.0.1:21503"
  11. caps['appPackage'] = "org.cnodejs.android.md"
  12. caps['appActivity'] = ".ui.activity.LaunchActivity"
  13. caps['noReset'] = True
  14. caps['fullReset'] = False
  15. self.driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", caps)
  16. self.driver.implicitly_wait(20)
  17. def test_alert(self):
  18. def handler_login(x):
  19. token = '527e85d4-cd50-468c-8003-b804651fba09'
  20. xpath = '//android.widget.Button[@text="登录"]'
  21. if len(self.driver.find_elements_by_xpath(xpath)) > 0:
  22. self.driver.find_element_by_xpath(xpath).click()
  23. self.driver.find_element_by_xpath(
  24. '//*[@resource-id="org.cnodejs.android.md:id/edt_access_token"]').send_keys(token)
  25. self.driver.find_element_by_xpath('//*[@resource-id="org.cnodejs.android.md:id/btn_login"]').click()
  26. return True
  27. else:
  28. return False
  29. self.driver.find_element_by_id('org.cnodejs.android.md:id/fab_create_topic').click()
  30. # WebDriverWait(self.driver, 10, 0.3).until(lambda x : True)
  31. try:
  32. WebDriverWait(self.driver, 10, 0.3).until(handler_login)
  33. self.driver.find_element_by_id('org.cnodejs.android.md:id/fab_create_topic').click()
  34. except:
  35. pass
  36. self.driver.find_element_by_id('org.cnodejs.android.md:id/edt_title').send_keys("hello world")