appium之三大等待
三大等待很奇怪,很多人都爱问,但是说实在的,appUI自动化很少涉及到性能,所以其实只要你愿意等,强制等待和显式等待就够用,毕竟极端情况很少,但是我们还是来了解一下。
强制等待sleep
设置固定休眠时间,单位为秒
缺点:不智能,使用太多的sleep会影响脚本运行速度。
import time
time.sleep(3)
隐式等待implicitly_wait
driver.implicitly_wait(10)
由webdriver提供的方法,一旦设置,这个隐式等待会在WebDriver对象实例的整个生命周期起作用,它不针对某一个元素,是全局元素等待,即在定位元素时,需要等待页面全部元素加载完成,才会执行下一个语句。如果超出了设置时间的则抛出异常。
缺点:当页面某些js无法加载,但是想找的元素已经出来了,它还是会继续等待,直到页面加载完成(浏览器标签左上角圈圈不再转),才会执行下一句。某些情况下会影响脚本执行速度。
显式等待WebDriverWait
from selenium.webdriver.support.wait import WebDriverWait
WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)
driver:浏览器驱动
timeout:最长超时时间,默认以秒为单位
poll_frequency:检测的间隔步长,默认为0.5s
ignored_exceptions:超时后的抛出的异常信息,默认抛出NoSuchElementExeception异常。
上述内容,全是抄的,因为我认为我自己想出来的文案没人家牛逼。
接下来我们来看一下在实际调试中如何使用。
import os.path
import time
from appium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
server = 'http://localhost:4723/wd/hub'
caps = {
"platformName": "Android",
"deviceName": "JPF4C19123011893",
"platformVersion": "10.0",
"appPackage": "com.czb.webczbdemo",
"appActivity": "com.czb.webczbdemo.MainActivity",
"automationName": "uiautomator2",
"noReset": "true",
"unicodeKeyboard": "true",
"resetKeyboard": "true"
}
driver = webdriver.Remote(server, caps)
wait = WebDriverWait(driver, 30)
navigation_button = driver.find_element_by_id("com.czb.webczbdemo:id/webNavigation")
navigation_button.click()
time.sleep(3)
edit_text = driver.find_element_by_class_name("android.widget.EditText")
edit_text.clear()
time.sleep(3)
edit_text.send_keys("https://test-open.czb365.com/redirection/todo/?platformType=92611011&platformCode=18610899775")
commit_button = driver.find_element_by_class_name("android.widget.Button")
commit_button.click()
driver.implicitly_wait(10)
oilstation = driver.find_elements_by_class_name("android.view.View")
print(oilstation)
print(type(oilstation))
time.sleep(6)
stationone = driver.find_element_by_xpath("//*[@text='ZZ测试油站就将尽快尽快框架开卡']").click()
time.sleep(3)
driver.find_element_by_xpath("//*[@text='下一步']").click()
please = ("xpath", "//*[contains(@text,'请选择油枪')]")
def get_toast(toast_element):
wait_toast = WebDriverWait(driver, 10, 0.1).until(EC.presence_of_element_located(toast_element))
print(wait_toast.text)
get_toast(please)
|