目前主流应用程序大体分为三类:web APP(网页应用)、hybrid APP(混合应用)、native APP(原生应用)。
native:
优点:直接依托于操作系统,交互性最强,性能最好;功能最为强大,特别是在与系统交互中,几乎所有功能都能实现。
缺点:开发成本高,无法跨平台,不同平台Android和iOS上都要各自独立开发;门槛较高,原生人员有一定的入门门槛,相比广大的前端人员而言较少;更新缓慢,特别是发布应用商店后,需要等到审核周期;维护成本高。
web:
优点:开发成本低,可以款平台,调用方便;维护成本低;更新无需通知用户,不需要手动升级;无需安装APP,不会占用手机内存。
缺点:无法获取系统级别的通知,提醒,动效等等,用户存留率低;设计受限制诸多;体验较差。
hybrid:
优点:在应用程序中嵌入了webview,通过webview访问网页;开发成本较低,可以跨平台,调试方便;维护成本低,功能可服用;功能更加完善,性能和体验要比起web APP好太多;更新较为自由。
缺点:相比原生,性能仍然有较大损耗;不适用于交互性较强的APP。
在手机/模拟器中点击关于手机中的版本号5下,出来开发者选项。
在开发者选项中勾选上显示布局边界再返回到APP界面。
如果APP是web页面,那界面不会有布局边界显示,如有则说明是native的界面。
在就通过定位工具:
我们之前所使用的API都是针对于原生的应用而言的,如果是web页面就不能采取这些API来定位元素,而且很多的应用都是hybrid混合应用了。
识别webview视图
我们可以根据上面描述的方法,进行判断。
获取所有的contexts:driver.contexts
理解context:
context上下文,疑问这一个场景,一个场景就是用户和操作系统交互的过程,native界面和webview界面分属于不用的context,native默认是“NATIVE_APP”,webview则默认是“WEBVIEW_被测进程名称”。
通过切换context对象,可以让appium认识到自己当前处于哪一个状态里面。
示例:
# 2、切换-Window窗口
# context - 混合应用 native_app
time.sleep(5)
# 1、获取所有的context 确保你的APP能够让代码识别到webview
cons = driver.contexts
print(cons)
# 2、根据context名字,切换到webview # WEBVIEW_com.lemon.lemonban
# driver.switch_to.context(cons[-1])
driver.switch_to.context('WEBVIEW_com.lemon.lemonban')
# 打印web内容
webinfo = driver.page_source
已经切换到HTML,那后续就是web自动化操作 --- 原生webview,基本上都是Chromedriver。
(1)Chrome浏览器中输入:chrome://inspect
该方法操作inspect后需要才可以使用(不推荐)。
(2)使用uc - devtools
具体参考官方文档:https://dev.ucweb.com/docs/pwa/docs-zh/xy3whu
driver.switch_to.context(None)
结论:
1、要让APP当中的webview能够被识别,并且要操作的元素在webview当中。
2、利用appium的context切换,从NATIVE_APP切换到webview网页。
3、利用uc - devtools来定位网页元素并操作。
4、web网页,需要下载与Android系统webview版本匹配的Chromedriver