appium 如何调用 adb_appium之等待元素渲染完成

49c43cd269ea3b0fa48184262dce6b9b.png问题场景


不知道做自动化测试的你,是否遇见过下列的场景

  • 设备硬件差,在运行测试代码时,报元素找不到的错误

  • 服务器接口响应慢,导致页面渲染不及时,报元素找不到的错误

  • 你测试的应用突然加入启动广告,报元素找不到的错误

49c43cd269ea3b0fa48184262dce6b9b.png如何解决

在APP自动化测试中,有两种方式可以解决上述的问题.

  • 在查找元素时,通过调用selenium.webdriver.support.wait设置等待时间

  • 在webdriver初始化后,通过implicitly_wait函数,为每次查找元素设置等待时间

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 

ca42c27c46b62ad407ae9b3104e217e5.png

03 无等待
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,便可以看到代码连接.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值