Appium [已解决] 混合应用如何切换到 WEBVIEW

中年_Brain · 2014年05月13日 · 最后由 tangy567 回复于 2019年01月24日 · 7913 次阅读

找了很多例子,始终有报错,有谁能给一个例子吗?

org.openqa.selenium.WebDriverException: Not yet implemented. Please help us: http://appium.io/get-involved.html (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 3 milliseconds
Build info: version: '2.41.0', revision: '3192d8a6c4449dc285928ba024779344f5423c58', time: '2014-03-27 11:29:39'
System info: host: 'DST58593', ip: '172.16.171.211', os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.8.0_05'
Driver info: io.appium.java_client.AppiumDriver

// 切换到最新的 web 视图
driver.switchTo().window("WEBVIEW");

使用这个就报错

启动 APP

// new 1.0 vison
        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setCapability(CapabilityType.PLATFORM, "android");
        capabilities.setCapability("device", "Selendroid");
        capabilities.setCapability("app", app.getAbsolutePath());
        capabilities.setCapability("appPackage", "android.view");
        capabilities.setCapability("appActivity", ".home.BootActivity"); 
共收到 57 条回复 时间 点赞

使用 contexts 来切换

#1 楼 @seveniruby
//判断是否有 WEBVIEW
Set contextNames = driver.getContextHandles();
for (String contextName : contextNames) {
System.out.println(contextName);
if (contextName.contains("WEBVIEW")){
driver.context(contextName);
}else
{
System.out.println("no WEBVIEW");
}
}


NATIVE_APP
no WEBVIEW

其实这个应用里面有 WEBVIEW,这怎么处理?

4.3 以上才支持在 android 模式下切换到 webview, 如果是之前的版本, 需要使用 selendroid 模式
这是官方的说法

我的手机是 4.3 的系统,我用的参数 也是
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.PLATFORM, "android");
capabilities.setCapability("device", "Selendroid");

#3 楼 @seveniruby 能不能贴一个类似的例子,其实我这个 APP 就是 NATIVE_APP 里面嵌入了一个 WEBVIEW

#5 楼 @bxc168 官网有测试用例和例子. 你在 4.4 的机器上验证下试试. 我这边还没进行完全测试.

#6 楼 @seveniruby 官网的例子,我尝试过了,都失败了。。。

#7 楼 @bxc168 你是在 4.4 的机器上运行的吗. 我看官方的测试用例是通过的. 4.4 以下你得使用 selendroid

#8 楼 @seveniruby URL 发我看看~谢谢

#9 楼 @bxc168 github 里面直接搜索 contexts

#10 楼 @seveniruby
driver.context("WEBVIEW"); 用这个方法报错

io.appium.java_client.NoSuchContextException: No such context found. (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 51 milliseconds
Build info: version: '2.41.0', revision: '3192d8a6c4449dc285928ba024779344f5423c58', time: '2014-03-27 11:29:39'
System info: host: 'DST58593', ip: '172.16.171.211', os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.8.0_05'
Driver info: io.appium.java_client.AppiumDriver
Capabilities [{app=D:\workspace\appiumdome\apps\ContactManager\ctrip.5.5.1.apk, appPackage=ctrip.android.view, warnings={}, databaseEnabled=false, platform=ANDROID, appActivity=.home.CtripBootActivity, desired={app=D:\workspace\appiumdome\apps\ContactManager\ctrip.5.5.1.apk, appPackage=ctrip.android.view, appActivity=.home.CtripBootActivity, device=Selendroid, platform=android}, platformVersion=4.1, webStorageEnabled=false, browserName=Android, takesScreenshot=true, javascriptEnabled=true, device=Selendroid}]
Session ID: 5d515902-ea21-4851-869a-e40b3c8e556c
Build info: version: '2.41.0', revision: '3192d8a6c4449dc285928ba024779344f5423c58', time: '2014-03-27 11:29:39'
System info: host: 'DST58593', ip: '172.16.171.211', os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.8.0_05'
Driver info: driver.version: AppiumDriver
at io.appium.java_client.MobileErrorHandler.createThrowable(MobileErrorHandler.java:68)
at io.appium.java_client.MobileErrorHandler.throwIfMobileError(MobileErrorHandler.java:45)
at io.appium.java_client.AppiumDriver.execute(AppiumDriver.java:78)
at io.appium.java_client.AppiumDriver.context(AppiumDriver.java:465)
at appiumdome.appiumdome.AndroidCtripTest.addContact(AndroidCtripTest.java:182)
... Removed 28 stack frames

#11 楼 @bxc168 你用官方提供的 app 和他的测试用例代码验证下, 平台也必须是 4.4.
我最近刚开始整理这些测试用例, 可能要到下个月才能放出来视频. 我目前还没搞相应的环境.

#12 楼 @seveniruby
你说的太对了。。在模拟器 4.4 上,运行成功了....这个也太坑爹了

#13 楼 @bxc168 这个官方早就说明了 只是大家没看到. 这是 android 自身的限制. 除非使用 selendroid 模式.

@bxc168 @seveniruby android 4.3 以下混合应用,必须使用 automationName="selendroid"在你的 capabilities 里面,而且对于 webview 的 switch,不是想当然的 driver.context("WEBVIEW"),你必须用 driver.contexts 返回的 list 例如 ["Native_APP","WEBVIEW_1"] 里面看到当前 app 到底有什么 contexts 然后选择对应的进行 switch。

#15 楼 @luis 能给一个参数例子么,这个 automationName="selendroid" 在 java 里面设置总报错

@bxc168 我是 python 直接设置没啥问题,至于 java 的话我估计个对应的 appium library client 有关

#17 楼 @luis 唉,这个东西 java 例子没有人更新...完全不知道应该放那些参数了

info: Available contexts: NATIVE_APP

4.3 的手机,只看见这个属性。。在 4.4 模拟器里面,有 2 个。。

在这个例子里 automationName 是否一定得是 “Selendroid”? 换成 Appium 的话,getContextHandles() 方法就能拿到一个 Context: NATIVE_APP.
文档有这样的描述 “Appium comes with built-in hybrid support via Chromedriver.”,我的理解是 appium 能通过 Chromedriver 去支持 hybrid 中的 webview 的, 但用 appium+chromedriver 总没能跑通。 不知有没高手跑通过,教下?

#20 楼 @pajack 可以运行成功,你是哪里有问题?

@bxc168 谢谢。确实可以。 我用的是公司的真机试的,到最近拿到一个 4.4 三星 S5 才跑通,其他 nexus 5 或者三星 Note 3 升级到 4.4 版本的都没跑通。

@pajack 那有没找到根本原因呢,我在 nexus 7 上系统 4.4.2 也没跑通。模拟器 4.4.2 可以

那是因为你用了 4.4.2 的版本有点问题,还原到一个原生的 4.4.2 应该没有这个问题
#23 楼 @wuligengche

@bxc168 你好,我最近也遇到跟你一样的问题了?你最后总结出结论了吗?具体是怎么做的?

学习了,谢谢分享。

#14 楼 @seveniruby 我机器是 4.4.4 的,打印出的 driver.content 是 [u'NATIVE_APP', u'WEBVIEW_com.android.browser', u'WEBVIEW_com.oumg, u'WEBVIEW_com.qihoo.appstore'],但是为什么我执行 driver.switch_to.context('WEBVIEW_0'),为什么还是报 NoSuchContextException: Message: u'No such context found.' ?

#27 楼 @gaoxing200851 你试试用 WEBVIEW_com.android.browser 等名字. 你的情况的确比较特殊.

#28 楼 @seveniruby 谢谢了 已经解决了,直接用 WEBVIEW 或者 WEBVIEW_com....就可以,用 WEBVIEW_0 就不行。

有没有遇到过它明明是个 hybird 但是 self.driver.contexts 打印出来的只有 native_app 没有 webview 呢???
真机 4.4.2 一个 hybird app 没有问题 另外一个 hybird 的 app 就有问题没有 webview context 返回

#13 楼 @bxc168 能把你的 webview 操作例子发下嘛?我这老是不成功,谢谢

appium1.3.4,安卓测试机 htc 4.4.2 的系统
native_app 中嵌入了 webview,但检测不到 webview,怎么办?
UI Automator Viewer 中 webview 显示为 view

@seveniruby 安卓真机 meizu,5.0.1 的系统,native_app 中嵌入了 webview,能够用 uiautomator 检测到 webview,但是使用 driver.context 获取,只能获取到 NATIVE_APP,怎么办?

#33 楼 @jinfanghua 5.x 的系统我没用过, 没做过测试.

35楼 已删除

#32 楼 @kaixinguo 请问你这个问题解决了吗?我现在也遇到了这样的问题。。取不到 webview 的信息。。

#33 楼 @jinfanghua 我也有这个问题,请问你解决了吗?

@xiaote 你解决了吗,求方案。。。

#27 楼 @gaoxing200851 是因为每次的 contexts 里面 webview 的名字都会变的,所以直接用变量代替 driver.switch_to.context(变量)

这个解决了吗..我的 一直卡在 driver.context("WEBVIEW");

如何解决呀,get contexts 结果只有 native_app, 没有 webview

#41 楼 @moon16 我也是这样,webview 没有名字,不知道如何处理

我启动 app 后 driver.close() 报这个错,什么原因呢

新手报到

self.driver.contexts 打印出来只有 NATIVE_APP 但是确实有 webview

如果是真机只有 NATIVE_APP,😳 试试在应用的代码里加上:

webView.setWebContentsDebuggingEnabled(true);

#46 楼 @jellyBananas 直接添加会报错编译器不知道代码里的 webview 是哪里来的

已解决

请问各位 getContextHandles() 方法就能拿到一个 Context: NATIVE_APP,没有 WEBVIEW,这个问题最终是怎么解决的呢,我看了大家的回复最终也没有看到是怎么解决的,我的测试机是 MEIZU MX Android 6.0.. 打开手机浏览器访问百度,页只有 NATIVE_APP

中年_Brain 回复

可以帮您成功的 代码 贴出来看看吗

中年_Brain 回复

大神,把你成功运行的代码,分享出来好吗

大神,你有成功的代码模板分享一下吗,我用的是 Python,资料好少啊,我都折腾一个星期了,也没搞出来,怎么切换到 webview,万分感激

大神您好~我这 appium1.6.3+ios10,用 driver.contexts 时,提示我 Webdriver 没有 contexts,这是为啥呀~

请成功的贴下代码,或者发我源代码也行;374477598;我的是 java+appuim,用的是安卓模拟器夜神 4.4.2,app 是 uc 浏览器,getContextHandles() 这个函数一直输出的只有 native_APP,我都不知道怎么办

123456 回复

我也遇到这个问题了,能告诉我怎么解决的吗

打开 app 中 webview 的调试功能,才可以识别出来 webview。参考:http://www.cnblogs.com/sao-fox/p/6396984.html

jinfanghua 回复

解决了吗?我也有这个问题,想请教一下

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册