如果页面还没有完全显示出来,进行页面自动化操作的时候,会报找不到元素的错误。
之前的解决方式是通过time.sleep() 暂停来实现等待,这种方式简单粗暴。设置等待多长时间,程序在运行的过程中就会等待这么长时间。
因为自动化本来就是要比手工测试快。通过使用这种方式进行等待,无形中会浪费很多时间。
隐式等待
创建好driver 之后可以设置全局的全局的元素等待时间。比如说设置全局等待10秒,在代码执行的时候,查找元素,最长等待10秒,如果在第3秒的时候能够找到元素,那么剩下的7秒就不再等待。从而提高自动化的执行效率。
使用的语法是在成功创建driver之后,设置最长元素等待时间。
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_capabilities=desired_caps)# 设置全局最长的元素等待时间driver.implicitly_wait(10)
分别对这个脚本进行运行时间对比。
在使用 time.sleep 运行程序
from appium import webdriverfrom appium.webdriver.common.touch_action import TouchActionimport timedesired_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" # 应用的活动页名称}start_time = time.perf_counter()driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_capabilities=desired_caps)# 等待页面加载成功time.sleep(10)# This sample code uses the Appium python client# pip install Appium-Python-Client# Then you can paste this into a file and simply run with Pythonel1 = driver.find_element_by_id("com.sina.weibo:id/rightBtn_wrapper")el1.click()time.sleep(1)el2 = driver.find_element_by_accessibility_id("写微博")el2.click()# 等待发微博页面加载成功time.sleep(1)el3 = driver.find_element_by_id("com.sina.weibo:id/edit_view")el3.send_keys("Hi 我在使用自动化方式发布微博")driver.find_element_by_accessibility_id("插入图片").click()time.sleep(3)# 选择图片xpath_img1 = '//*[@resource-id="com.sina.weibo:id/photo_album_gridview"]/android.widget.RelativeLayout[2]'xpath_img2 = '//*[@resource-id="com.sina.weibo:id/photo_album_gridview"]/android.widget.RelativeLayout[3]'driver.find_element_by_xpath(xpath_img1).click()time.sleep(2)# 选中driver.find_element_by_id('com.sina.weibo:id/btn_num_check').click()# 返回上一层driver.back()time.sleep(2)driver.find_element_by_xpath(xpath_img2).click()time.sleep(1)driver.find_element_by_id('com.sina.weibo:id/btn_num_check').click()# 点击下一步driver.find_element_by_id('com.sina.weibo:id/btn_confirm_edit').click()time.sleep(1)driver.find_element_by_id('com.sina.weibo:id/btn_confirm_edit').click()time.sleep(1)el4 = driver.find_element_by_accessibility_id("发送")el4.click()# TouchAction(driver).press(x=390, y=200).move_to(x=390, y=1323).release().perform()end_time = time.perf_counter()print(f'程序执行花费了{end_time-start_time}s')# driver.quit()
运行完成之后,总共使用了 36s的时间
使用隐式等待
from appium import webdriverfrom appium.webdriver.common.touch_action import TouchActionimport timedesired_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" # 应用的活动页名称}start_time = time.perf_counter()driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_capabilities=desired_caps)# 设置全局最长的元素等待时间driver.implicitly_wait(10)# This sample code uses the Appium python client# pip install Appium-Python-Client# Then you can paste this into a file and simply run with Pythonel1 = driver.find_element_by_id("com.sina.weibo:id/rightBtn_wrapper")el1.click()el2 = driver.find_element_by_accessibility_id("写微博")el2.click()# 等待发微博页面加载成功el3 = driver.find_element_by_id("com.sina.weibo:id/edit_view")el3.send_keys("Hi 我在使用自动化方式发布微博")driver.find_element_by_accessibility_id("插入图片").click()# 选择图片xpath_img1 = '//*[@resource-id="com.sina.weibo:id/photo_album_gridview"]/android.widget.RelativeLayout[2]'xpath_img2 = '//*[@resource-id="com.sina.weibo:id/photo_album_gridview"]/android.widget.RelativeLayout[3]'driver.find_element_by_xpath(xpath_img1).click()# 选中driver.find_element_by_id('com.sina.weibo:id/btn_num_check').click()# 返回上一层driver.back()driver.find_element_by_xpath(xpath_img2).click()driver.find_element_by_id('com.sina.weibo:id/btn_num_check').click()# 点击下一步driver.find_element_by_id('com.sina.weibo:id/btn_confirm_edit').click()time.sleep(1)driver.find_element_by_id('com.sina.weibo:id/btn_confirm_edit').click()el4 = driver.find_element_by_accessibility_id("发送")el4.click()# TouchAction(driver).press(x=390, y=200).move_to(x=390, y=1323).release().perform()end_time = time.perf_counter()print(f'程序执行花费了{end_time-start_time}s')# driver.quit()
显式等待
使用隐式等待,可以针对全局的元素进行设置最长等待时间。优点就是所有的元素等待都会使用最长的等待时间。但是缺点也很明显,假设设置的全局等待时间为10秒。那么如果开发工程师写的脚本中元素定位写错了,那么执行的时候肯定找不到这个元素,那么等待10秒。
显示等待可以设置针对单个元素设置最长等待时间,比如你在做自动化测试的过程中,根据经验某个元素需要等待比较长的时间才能出来,可以针对单个元素设置最长等待时间。其他元素不会受到影响。
from appium import webdriverfrom appium.webdriver.common.touch_action import TouchActionfrom selenium.webdriver.support.wait import WebDriverWaitimport selenium.webdriver.support.expected_conditions as ECfrom selenium.webdriver.common.by import Byimport timedesired_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()
