前言 难点?Appium工具的坑太多了,一上百度搜索就是一箩筐各种解决方案,且不同人不同环境,实则静下心来分析,无非就是环境问题和使用者对框架的思考问题!为什么这么说呢?例如:app混合h5的自动化,操作时需要切换context上下文,才能继续操作,且操作完h5还需要切换回原生环境;分析环境问题:如果不是chromedriver驱动版本和模拟器或者真机不匹配,就是操作元素的方法需要改进即未等待元素出现操作无效;同时我也相信搜索此类问题的同学,想必对操作页面元素的方法和各种显示等待也了然于胸,却不知为何偏偏总有些不尽人意的事情出现。So,一堆搜索的答案也不知道哪个是对的,唯有不断实战才能总结出自己的问题在哪里! 再来说我的问题,问题有二: 1、app混合应用H5操作返回按钮无效? 2、app原生跳转操作返回按钮无效?excuseme!!! 在工作环境就这两个问题调试就是好几个小时,仍旧无解?于是乎开始百度搜索,第一个问题有说是开发需要将app支持debug啥模式,才能正确定位h5的元素?我将信将疑,先将博客发给Android同学看看,然后自己在家再试试,结果是实现了混合应用app切换context操作。至于第二个问题,我相信不是问题,而是我对方法封装得不够优秀,从而可能导致元素无法正确操作! 那么当元素无法正确工作的时候,我们该想什么办法来弥补呢? 第一想到了模拟键盘返回操作,appium是在继承了selenium框架封装了一些特殊的方法,所以想到了back、按键等操作。 下面开始分析下面的代码: importtime fromappiumimportwebdriver fromappium。webdriver。common。mobilebyimportMobileBy desiredcaps{platformName:Android, deviceName:127。0。0。1:21503device,设备名称 platformVersion:5。1。1,android系统版本号 appPackage:com。chutzpah。yasibro。test,app包名 appActivity:com。chutzpah。yasibro。main。view。MainActivity,启动launchActivity noReset:True,重置缓存,第一次安装启动app automationName:Uiautomator2,toast必须用Uiautomator2chromedriverExecutableDir:rC:UsersAdministratorodemodulesappiumodemodulesappiumchromedriverchromedriver24} driverwebdriver。Remote(http:127。0。0。1:4723wdhub,desiredcaps) time。sleep(15)启动时间等待,放长一点print(还没点h5广告吗?) try: contextsdriver。contextsprint(获取contexts上下文:scontexts) print(我是原生点击返回1) backbutton1(MobileBy。ANDROIDUIAUTOMATOR,newUiSelector()。className(android。widget。ImageView)。instance(1)) driver。findelement(backbutton1)。click() time。sleep(5)这个是原生定位元素的问题,没有操作正确 print(我是原生点击返回2) backbutton2(MobileBy。ANDROIDUIAUTOMATOR,newUiSelector()。className(android。widget。ImageView)。instance(1)) driver。findelement(backbutton2)。click() time。sleep(5)driver。switchto。context(contexts〔1〕) print(切换后context是:sdriver。currentcontext) print(我是webview点击返回) backh5(MobileBy。XPATH,p〔classnavigationbarleft〕) driver。findelement(backh5)。click()driver。switchto。context(NATIVEAPP) time。sleep(5) print(我是keyevent返回) driver。keyevent(4)back事件code4 time。sleep(5) print(我是presskeycode返回) driver。presskeycode(4) time。sleep(5) print(我是back返回) driver。back() time。sleep(5)driver。switchto。context(NATIVEAPP) examtab(MobileBy。XPATH,android。widget。TextView〔(text考试)〕) driver。findelement(examtab)。click()time。sleep(5) except: raise finally: driver。closeapp() driver。quit() 第一段返回操作的是原生返回按钮,毋须切换上下文context,只要元素定位准确及操作正确,即可正常返回上一页面。 第二段亦是如此! 第三段是切换上下,先由contexts得到上线问列表必须是点击了webview的控件之后获取,否则仍是nativeapp,切记操作完h5之后,需要切换回原生环境:switchto。context(NATIVEAPP); 也可以通过点击webview控件之后,由currentcontext当前上下文环境判断是否H5环境! 第四段是模拟设备键盘操作keyevent事件,百度有人说会容易报错。 第五段同第四段,建议使用presskeycode()方法模拟设备键盘操作。 第六段就是浏览器的返回操作,在app中不建议使用且不见的有效。 至此,整个功能到此为止,按需索取!