1.元素等待
如果页面还没有完全显示出来,进行页面自动化操作的时候,会报找不到元素的错误。
之前的解决方式是通过time.sleep() 暂停来实现等待,这种方式简单粗暴。设置等待多长时间,程序在运行的过程中就会等待这么长时间。
因为自动化本来就是要比手工测试快。通过使用这种方式进行等待,无形中会浪费很多时间。
2.隐式等待
创建好driver 之后可以设置全局的全局的元素等待时间。
比如说设置全局等待10秒,在代码执行的时候,查找元素,最长等待10秒,如果在第3秒的时候能够找到元素,那么剩下的7秒就不再等待。从而提高自动化的执行效率。
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_capabilities=desired_caps) # 设置全局最长的元素等待时间 driver.implicitly_wait(10)
3.显示等待
使用隐式等待,可以针对全局的元素进行设置最长等待时间。优点就是所有的元素等待都会使用最长的等待时间。但是缺点也很明显,假设设置的全局等待时间为10秒。那么如果开发工程师写的脚本中元素定位写错了,那么执行的时候肯定找不到这个元素,那么等待10秒。
显示等待可以设置针对单个元素设置最长等待时间,比如你在做自动化测试的过程中,根据经验某个元素需要等待比较长的时间才能出来,可以针对单个元素设置最长等待时间。其他元素不会受到影响。
from appium import webdriver from appium.webdriver.common.touch_action import TouchAction from selenium.webdriver.support.wait import WebDriverWait import selenium.webdriver.support.expected_conditions as EC from selenium.webdriver.common.by import By import time desired_caps = { 'platformName': 'Android', # 测试Android系统 'platformVersion': '7.1.2', # Android版本 可以在手机的设置中关于手机查看 'deviceName': '127.0.0.1:62001', # adb devices 命令查看 设置为自己的设备 'automationName': 'UiAutomator2', # 自动化引擎 'noReset': True, # 不要重置app的状态 'fullReset': False, # 不要清理app的缓存数据 'appPackage':"com.sina.weibo", # 应用的包名 'appActivity': ".SplashActivity" # 应用的活动页名称 } # 打开微博 driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_capabilities=desired_caps) # 每次打开都有广告加载界面 # 针对单个元素设置最长的等待时间 wait = WebDriverWait(driver,10) start_time = time.perf_counter() el1 = wait.until(EC.presence_of_element_located((By.ID,"com.sina.weibo:id/rightBtn_wrapper"))) end_time = time.perf_counter() print(f'查找元素使用时间: {end_time-start_time}s') # el1 = driver.find_element_by_id("") el1.click()