Appium Appium1.10 多次切换 context,无法定位元素的问题

koma · 2019年02月20日 · 2462 次阅读

跟这个帖子里的问题类似 https://testerhome.com/topics/6836 ,我用的是 python 和 appium 1.10.0,在第一个用例中测试一个模块时,可以随意切换 WebView,
并成功定位元素;但是接着执行第二个用例测试另一个模块时,切换 WebView 后就无法定位到元素了,报错 NosuchElement,
不知道是不是 appium 版本的问题,我这里并没有找到上述帖子里的 android-hybrid.js 文件,
想请教一下各位有没有碰到过这个问题,或者有没有其他解决办法,在此谢过!

最佳回复
koma 回复

先说解决办法。
封装下切换 context 的方法,切换 context 到 webview 后,取 window_handle,超过 1 个的,切换 window_handle 到最后一个。

原因嘛,可以先思考下。

共收到 8 条回复 时间 点赞

输出一下 window_handle 看看吧

koma #2 · 2019年02月20日 Author

虽然没有找到 android-hybrid.js 文件,但是在{appium 安装路径}\node_modules\appium-android-driver\lib\commands 路径下有一个 conext.js 文件,里边有一段代码类似 android-hybrid.js 里边的代码,就试着修改了一下,但是貌似并没有起作用

koma #3 · 2019年02月20日 Author
大东 回复


如图,但是输出的 contexts 都是只有两个,不知道 contexts 跟 handels 有啥区别吗,为啥一个是两个,一个是三个呢....

koma 回复

他的意思是切换了窗口句柄,曾经碰到过类似问题端,Chrome 调试可以,但是脚本定位不到,既不是 disable 也不在 iframe 下,最后是因为切换了窗口句柄

koma 回复

先说解决办法。
封装下切换 context 的方法,切换 context 到 webview 后,取 window_handle,超过 1 个的,切换 window_handle 到最后一个。

原因嘛,可以先思考下。

大东 回复

搞了一上午,确实是句柄的问题,但还是有点问题,不知道是不是跟 app 有关,因为这是第一次测 APP
1.当测试 A 菜单时(第一个用例),切换到 H5 context 后,可以取到三个 window_handle,默认在第一个 handel,不用切换,可以正常定位操作元素
2.当测试 B 菜单时(第二个用例),切换到 H5 context 后,取到了四个 window_handle,前三个与第一个菜单一样,新增第四个,此时需要切换到第四个 handle,才能定位操作元素(我在 3 楼的那张图上边 handle 个数看错了......)
3.然后我又更改了这两个用例的执行顺序,先执行 B,再执行 A,发现执行 B 时可以取到三个 window_handle,默认在第一个 handel,不用切换正常定位;执行 A 时取到了四个 window_handle,需切换才能定位。。。。
也就是说在测试第一个菜单时切换 WebView 不用切换 handle,后边测试其他菜单就要将 handle 切换到最后一个了,所有就暂时这么写了..

def switch_context(self, context_name):
    """切换当前上下文"""
    time.sleep(1)
    self.driver.execute(MobileCommand.SWITCH_TO_CONTEXT, {"name": "{}".format(context_name)})
    # NATIVE_APP 不能获取window_handles,会报WebDriverException  404
    if context_name == 'NATIVE_APP':
        return

    hans = self.driver.window_handles
    if len(hans) > 3:
        hand_name = hans[-1]
        self.driver.switch_to.window(hand_name)
koma #7 · 2019年02月21日 Author

@Anikikun @cherish 非常感谢

匿名 #8 · 2020年07月15日

我这边在切换句柄就会报错,请问你那边有出现这种情况么

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