Appium [总结] appium+ios/android Native 切换 WebView 遇到的问题 (java)

Zsea · 2017年11月23日 · 最后由 雨过天晴 回复于 2021年10月27日 · 6836 次阅读

很多 apk 会在原生的 app 中内嵌如 web 页面,以减小开发工作量,增加兼容性,所以当我们使用 appium 对此类 apk 进行自动化测试时,就不可避免的会遇到需要在原生应用和 h5 界面中进行切换的操作,下面对这一过程中遇到的问题分别从 android 应用和 ios 应用两个方面进行总结。

appium 如何切换 Native 和 WebView

方法一:

Set<String>contexts=driver.getContextHandles();
driver.context((String)contexts.toArray()[1]);  //选取webview开头的context

方法二(官方示例):

driver.getContextHandles().forEach((handle) -> {
                if (handle.contains("WEBVIEW")) {
                    driver.context(handle);
                }
            });

android 设备切换 Native 和 WebView 时遇到的问题

问题一:无法获取 webView 上下文

使用方法一获取 contexts 时,发现只能获取到原生的 context,不能获取到 WebView 的 context。如下:

经过在网上查找方法,发现 android4.4 以上需要开启 webView 的远程调试开关。方法如下:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        WebView.setWebContentsDebuggingEnabled(true);}

一般情况下 RD 会将上述开关设置在 apk 包中,作为一个 debug 的总开关,此时我们只需要找 RD 要一个开启 debug 模式的 aok 安装包就可以了。

问题二:ChromeDriver 版本问题

解决了 WebView 上下文的问题之后,以为就可以顺利运行了,没想到还是报错,内容如下:

错误内容是:Chrom version must be >=60.0.3112.0。提示我们谷歌浏览器的版本比较低。
看到这个提示的时候我也很疑惑,我也没有用到 Chrome,为什么会提示这样的错误呢?原因是 android 系统底层是通过 ChromeDriver 来调用 WebView 的。
所以上述错误的原因是因为 ChromeDriver 的版本不匹配导致。那么应该是什么和什么匹配,又应该如何匹配呢?
答案:
需要 android 系统的 Android Sysytem WebView 版本和 ChromeDriver 的版本相匹配。其中 Android Sysytem WebView 是指 android 系统的 web 应用,可以在手机上查看气其当前版本(如果在系统应用中找不到,可以在手机的应用市场上搜索)。
匹配规则如下:其中 “支持的 Chrome 版本” 就是指 Android Sysytem WebView 的版本
相同问题:https://testerhome.com/topics/8493
https://www.cnblogs.com/sao-fox/p/6396984.html
版本匹配:http://blog.csdn.net/cz9025/article/details/70160273

解决方法
既然知道了问题出现的原因,那么就有方法解决。解决方法如下:
查看当前 Android Sysytem WebView 的版本,下载对应的 ChromeDriver,放到如下目录 (mac):
/Applications/Appium 2.app/Contents/Resources/app/node_modules/appium/node_modules/appium-xcuitest-driver/

ios 设备切换 Native 和 WebView 时遇到的问题

问题一:无法获取 webView 上下文

在进行 ios 设备的上下文切换时,也出现了无法获取 WebView 的现象(同 android)。一开始也以为 ios 可以通过带代码中设置 webview 的 debug 开关来解决此问题,但是后来和几个 RD 沟通过后发现 ios 并没有类似的支持,所以只能另寻他法。
通过查看 log,发现 ios_webkit_debug_proxy 没有被调起,如果想要真机调试 WebView,就必须通过 ios_webkit_debug_proxy。
通过如下命令进行安装

brew install ios-webkit-debug-proxy

安装之后运行如下命令查看是否能够调起 ios-webkit-debug-proxy

ios_webkit_debug_proxy -c XXXXXXXXXX:27753 -d            XXXXXXXXXX表示设备UDID

运行上述命令发现报错如下:

Could not connect to lockdownd. Exiting.: Permission denied

通过查找资料,发现网上大部分的解决方案是执行如下命令:

sudo chmod -R 777 /var/db/lockdown/

但是,执行该命令之后还有可能出现其他问题,并且该命令只能在本期启动 ios-webkit-debug-proxy 时起作用,不能永久生效。
解决方案如下:

brew uninstall ideviceinstaller
brew uninstall libimobiledevice
brew install --HEAD libimobiledevice
brew link --overwrite libimobiledevice
brew install ideviceinstaller
brew link --overwrite ideviceinstaller

过程中如果出现失败的现象,可以根据 log 的提示进行处理。

问题二:appium 如何启动 ios-webkit-debug-proxy

经过上述处理,已经解决了 ios-webkit-debug-proxy 无法启动的问题,但是 appium 如何获取 WebView 上下文的问题仍然存在。
解决方法就是先启动 ios-webkit-debug-proxy,在调用 appium 的自动化脚本,就可以获取 WebView 了。
注意:ios 真机需要启动 web 检查器
位置:设置—》Safari—》高级—》web 检查器
注意:在获取 WebView 之前,最后先 Thread.sleep(1000) 几秒,保证 apk 中内嵌的 WKWebView 已经加载出来。
解决上述问题之后,如果直接运行测试脚本会报出如下错误:

是因为我没没有开启 ios-webkit-debug-proxy。而每次手动开启 ios-webkit-debug-proxy 是一件很麻烦的事情,我们作自动化的目的就是解放双手嘛。
后来阅读了官方的解释之后,发现 ios-webkit-debug-proxy 可以通过设置 DesiredCapabilities 来调起,代码如下:

cap.setCapability("startIWDP",true); 

好啦,至此,我的 ios 设备和 android 设备都能够完美兼容 WebView 啦

共收到 12 条回复 时间 点赞

您好,我有两个手机,装我们公司同样的 app,但是现在有一部手机,连上电脑怎么都看不到 app 的 webview,就没法调试,电脑 chrome 版本是 62.0.3202.94
a 手机:5.1,Android Sysytem WebView 版本:42.0.2311.129
b 手机:7.1.2,Android Sysytem WebView 版本:60.0.3112.78
现在 a 手机连上 pc,pc 的 chrome 浏览器输入 chrome://inspect/#devices ,可以看到我们 app 的 webview 出来,
但是 b 手机,就是看不到,而且 b 手机用自带的浏览器打开如百度网页,看不到需要调试的 webview;安装的 chrome 浏览器打开百度是可以调试的,但不管怎么样,我们 app 的 webveiw 页面就是无法看到要调试的 webview,现在卡在这里找不到原因,实在是搞不懂

Zsea #3 · 2017年12月04日 Author
cheng 回复

1、你可以先看一下 b 手机的 Android Sysytem WebView 的版本是否和电脑中/Applications/Appium 2.app/Contents/Resources/app/node_modules/appium/node_modules/appium-xcuitest-driver/目录下的 chromedriver 的版本相匹配(注意,因为你的两个手机的 Android Sysytem WebView 的版本所对应的 chromedriver 版本不一致,所以不能同时驱动两部手机)
2、因为 webview 的功能是通过 chromedriver 进行驱动的,所以手机自带的浏览器是不支持的

感谢楼主,这个总结分享太棒了,完美解决了我遇到的问题,送花~🌺 🌺

有个问题

ios 的测试包你们打的是 app 还是 ipa,我这里使用 ios-webkit-debug-proxy 看不到 app 内的 web page(但可以看到 safari 中的 page),官方 issue 说是要用开发证书,我这边使用开发证书后仍然看不到,楼主有没有遇到类似的问题?

robin-xl 回复

我也碰到这个问题了,你解决没

robin-xl 回复

请问楼主是否解决了这个问题,我的 iOS 也是获取不到

楼主,请问 iOS 真机 webview 是否获取成功呢,我这边适用的 ipa 包,按照方法,无法获取 webView 上下文

楼主请教一下 IOS 切换 Webview 你是怎么解决的?已按照你给出的方法配置了,但是还是没法切换到 webview 中去

问题一,没有看懂,那行代码是啥意思?

同问,iOS 没有解决

您好,对照你的文章,ios_webkit_debug_proxy 正常启动也连接 app 成功,但仍然只获取到了原生 app 没有获取到 WKWebView 的 context,求指导

@ 黑凤梨 您好,我也遇到相同问题,问下问题解决了吗?

雨过天晴 appium+ios Native 无法切换 WebView(python) 中提及了此贴 11月03日 12:10
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册