![49c43cd269ea3b0fa48184262dce6b9b.png](https://img-blog.csdnimg.cn/img_convert/49c43cd269ea3b0fa48184262dce6b9b.png)
不知道做自动化测试的你,是否遇见过下列的场景
设备硬件差,在运行测试代码时,报元素找不到的错误
服务器接口响应慢,导致页面渲染不及时,报元素找不到的错误
你测试的应用突然加入启动广告,报元素找不到的错误
![49c43cd269ea3b0fa48184262dce6b9b.png](https://img-blog.csdnimg.cn/img_convert/49c43cd269ea3b0fa48184262dce6b9b.png)
在APP自动化测试中,有两种方式可以解决上述的问题.
在查找元素时,通过调用selenium.webdriver.support.wait设置等待时间
在webdriver初始化后,通过implicitly_wait函数,为每次查找元素设置等待时间
![49c43cd269ea3b0fa48184262dce6b9b.png](https://img-blog.csdnimg.cn/img_convert/49c43cd269ea3b0fa48184262dce6b9b.png)
为了演示两种方式的区别,以启动腾讯微视,进入个人界面为例
01 前置准备PYCHARM
APP自动化测试环境
腾讯微视的APK
通常情况下,获取app的包名以及界面名,可以通过adb命令获取.
# 通过adb获取报名以及界面名adb shell dumpsys window | findstr mCurrentFocus# 下面是执行上面命令所打印的信息mCurrentFocus=Window{f71c92f u0 com.tencent.weishi/com.tencent.oscar.module.main.MainActivity}# com.tencent.weishi 为appium中的appPackage参数值# com.tencent.oscar.module.main.MainActivity 为appium中的appActivity参数值
在腾讯微视中,通过adb命令获取到的包名以及启动界面名是错误的.
倘若需要获取正确的包名以及启动界面名,需要借助aapt
# 通过adb获取报名以及界面名adb shell dumpsys window | findstr mCurrentFocus# 通过aapt获取包名以及界面名aapt dump badging .\WEISHI_6.8.1.588_313033022.apk# 下面是执行aapt命令之后,打印在屏幕上的关键信息package: name='com.tencent.weishi' versionCode='681' versionName='6.8.1.588' platformBuildVersionName='6.8.1.588' compileSdkVersion='28' compileSdkVersionCodename='9'sdkVersion:'19'targetSdkVersion:'28'........(避免篇幅过长,对此篇文章无意义的信息已经被省略)uses-library-not-required:'org.apache.http.legacy'launchable-activity: name='com.tencent.oscar.module.splash.SplashActivity' label='' icon=''........(避免篇幅过长,对此篇文章无意义的信息已经被省略)uses-library:'android.test.runner'native-code: 'armeabi'# package: name='com.tencent.weishi' 中的com.tencent.weishi为appium中的appPackage参数值# launchable-activity: name='com.tencent.oscar.module.splash.SplashActivity' # 中的com.tencent.oscar.module.splash.SplashActivity为appium中的appActivity值
02
定位元素
元素的定位,需要借助android-sdk中的UI Automator Viewer工具.
通过UI Automator Viewer工具,可以得到在 "我" 这个按钮出的resource-id为com.tencent.weishi:id/qim
import appium.webdriver as webdriverimport timefrom selenium.webdriver.support.wait import WebDriverWait# WSNoWait 在查找元素时,不设置等待def WSNoWait(): caps = dict() caps["platformName"] = "Android" caps["platformVersion"] = "10" caps["appPackage"] = "com.tencent.weishi" caps["appActivity"] = "com.tencent.oscar.module.splash.SplashActivity" caps["unicodeKeyboard"] = "True" caps["resetKeyboard"] = "True" caps["noReset"] = "True" driver = webdriver.Remote("http://localhost:4723/wd/hub", caps) maputo = driver.find_element_by_id("com.tencent.weishi:id/qim") maputo.click() time.sleep(10) driver.quit() pass
微视启动时,有个5秒时间的广告时间.直接导致应用没有立即进入appActivity,间接导致find_element_by_id函数没有找到resource_id,最终导致应用终止.
04 调用时等待import appium.webdriver as webdriverimport timefrom selenium.webdriver.support.wait import WebDriverWaitdef CallWait(): caps = dict() caps["platformName"] = "Android" caps["platformVersion"] = "10" caps["appPackage"] = "com.tencent.weishi" caps["appActivity"] = "com.tencent.oscar.module.splash.SplashActivity" caps["unicodeKeyboard"] = "True" caps["resetKeyboard"] = "True" caps["noReset"] = "True" driver = webdriver.Remote("http://localhost:4723/wd/hub", caps) # 调用时等待5秒 maputo = WebDriverWait(driver, 5).until(lambda ele: ele.find_element_by_id("com.tencent.weishi:id/qim")) maputo.click() time.sleep(10) pass
05
设置默认等待
import appium.webdriver as webdriverimport timefrom selenium.webdriver.support.wait import WebDriverWait# DefaultWait 默认等待def DefaultWait(): caps = dict() caps["platformName"] = "Android" caps["platformVersion"] = "10" caps["appPackage"] = "com.tencent.weishi" caps["appActivity"] = "com.tencent.oscar.module.splash.SplashActivity" caps["unicodeKeyboard"] = "True" caps["resetKeyboard"] = "True" caps["noReset"] = "True" driver = webdriver.Remote("http://localhost:4723/wd/hub", caps) driver.implicitly_wait(10) maputo = driver.find_element_by_id("com.tencent.weishi:id/qim") maputo.click() time.sleep(10) pass
06
两种方式如何抉择
默认等待,适合网络请求,设备较差的情景
调用时等待,适合那些在一定时长后被渲染出现的元素.
比如,看广告时,需要等待多少时间.
如果,超出等待时间,与没有设置等待时一样.
即程序会报出NoSuchElementException异常.
07 如何获取代码关注公众号,发送zidonghua_weishi,便可以看到代码连接.