Appium 求助:python 测试 APP 如何切换到 webview,可以分享一下吗

123456 · 2017年03月01日 · 最后由 gaomengsuijia 回复于 2019年05月14日 · 5119 次阅读

Python 语言测试测试手机 APP,如何切换到 webview,让程序跑起来呢,在官网查到的资料,根本跑不起,大家可以分享一下成功的代码吗

共收到 24 条回复 时间 点赞

先看是不是 webview,有些 APP 用了自己的 view,而不是标准 webview,所以 appium 对这种情况无能为力

123456 #15 · 2017年03月01日 Author

是 webview,只是我第一次搞这块,没有模板,不知道 Python 切换到 webview 的代码,您可以分享一下吗

这是我切换的代码,可以都报错

大神,您看一下

先获取全部的 contexts:

const contexts = yield driver.contexts();

contexts 是个数组,第一个是原生,例如是:NATIVE_APP。每打开一个 webview,contexts 数组就会插进来一个值,contexts[contexts.length -1]就是当前的 context 了,然后切换一下:

yield driver.context(contexts[contexts.length -1];
CNO 回复

大神,刚才我跑了一下,还是报错,您可以说的详细一些吗,因为我真的第一次做这块

我写的例子是用 Node 的。错误日志,最好看 Appium 的 log。
切换到 APP 中的 webview,首先要得到这个 webview 对应的上下文(context),wd 中有个方法可以获取当前全部的 contexts,一般 APP 里面每个 webview 对应的 context 都不同,在不同机器上也不会相同,你不能写死了,要先把 contexts 取到。
比方你刚刚打开了一个 webview,这个时候 contexts 的最后一个字符串就是这个 webview 的 context。

123456 #24 · 2017年03月01日 Author

大神这是我写的切换的代码,你具体的指导一下吧,或者把您的成功的发给看看,研究下好吗,您这样说,我还不是很明白

😂 我感觉 node 和 python 写法应该差不多 (就两行):

contexts = yield driver.contexts();
yield driver.context(contexts[contexts.length - 1]);

你上面的切换写死了 context:WEBVIEW_com.sina.book,你咋能确定当前手机当前 APP 当前 WebView 的 context 是这个呢?不是这个 Appium 会报错,你需要先用 Appium 自己取读取这个值,具体方法你得查 WD 的 API。

driver.switch_to.context('WEBVIEW') # 切换到 webview
driver.find_element_by_class_name('goods1').click() # 点击 webview 里边的元素,一个 m 站的网页元素。
driver.switch_to.context('NATIVE_APP') # 切换到原生 app

我代码就是这样的,亲测可用。

lbw 回复

大神,我刚才跑了一下,还是报错啊,您能把您上下文的代码也分享一下吗,我觉得是不是在切换到 webview 之后,还要 list 一下元素

这是我定位的图,根本找不到定位的元素啊

lbw 回复

大神,这就是我之前完整的代码,请您具体指导下,自己实在是研究不明白了,具体怎么切换,怎么定位元素,执行上下操作啊

#coding=utf-8
from appium import webdriver
from selenium.webdriver.common.keys import Keys
from appium.webdriver.webdriver import WebDriverWait
from appium.webdriver.common.mobileby import MobileBy
from appium.webdriver.switch_to import MobileSwitchTo
from appium.webdriver.common.touch_action import TouchAction
from selenium.webdriver.support import expected_conditions as EC
from time import sleep

op = {}
op['platformName'] = 'Android'
op['deviceName'] = 'Android Emulator'
op['appPackage'] = 'com.sina.book'
op['appActivity'] = '.ui.activity.splash.SplashActivity'
op['unicodeKeyboard'] = True
op['resetKeyboard'] = True
op['newCommandTimeout'] = 10
op['noReset'] = True
driver = webdriver.Remote('http://localhost:4723/wd/hub,op')
WebDriverWait(driver, 10).until(EC.presence_of_element_located((MobileBy.XPATH,'//android.widget.TextView[@text="书城"]')))
driver.find_element_by_xpath('//android.widget.TextView[@text="书城"]').click()
driver.switch_to.context('WEBVIEW')
driver.find_element_by_css_selector('.main-nav > a:nth-child(1)').click()

lbw 回复

大神,真心感谢,您这么负责任,可是我整体复制跑完之后,还是报错了,您看看,还学要哪里改动吗
手机和 chrome 需要做什么改动吗

很无语了,下边报错提示都说明了,google 翻译一下。

lbw 回复

大神,我知道下面提示的报错,但也确实是找了很多地方,不知道该怎么改,我真的是第一次做这块,一点经验也没有

123456 #16 · 2017年03月03日 Author
lbw 回复

大神,我已经跑成功了,谢谢您,但是就是还不是很清楚,我跑成功之后,我该怎么通过 Xpath 的方式去定位元素,测试 H5

怎么我的 dirver 里面没有 switch_to.context() 方法 只有 switch_to.default_content() 求大神帮助

123456 回复

怎么定位 H5 页面的元素呢?

wuhao 回复

谷歌浏览器、猎豹、qq 浏览器 输入下面的地址 就可以直接看了 chrome://inspect/#devices

wangrui 回复

你的 webdriver 不对,你用 appium 的就可以了,我之前也忘记换了

wangrui 回复

你的问题解决了么?我的 driver 里面也是没有 switch_to.context() 方法 只有 switch_to.default_content()

CNO 回复

用你的这个会报错呢

用你的这个会报错呢

只能获取到原生的 NATIVE_APP,该怎么办?

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