Appium Android 4.4.4 切换 Webview 后无法定位元素问题

Richard · 2016年03月04日 · 最后由 listtap 回复于 2017年01月15日 · 2531 次阅读

所有环境相同的情况下,刷机到安卓 4.4x 切换到 webview 就无法定位元素。

现在的项目是一个 Hybrid APP,包括 Android 和 iOS 版本。目前 Android 版本遇到一个问题 Google 了很多资料,一直找不到解决方案,在这次特此请教各位。

环境:

  • Mobile device:Google Nexus 4
  • IDE:IntelliJ 15
  • APP: Hybrid Native+Webview
  • Mac mini: OS X EI Capitan

现象:
以前使用 Google Nexus 4 5.1.1 api level 22 运行测试程序一切正常,app 的 WebView.SetWebContentsDebuggingEnable(true) 程序员也是打开的,在测试一些功能的时候需要切换到 webview,我的 webview switch 如下,安卓 5 版本下可以正常切换并且定位元素和操作元素:

public static boolean switchToWebview(){
        try {
            Set<String> contexts = driver.getContextHandles();
            for (String s : contexts) {
                if (s.contains("WEBVIEW")) {
                    driver.context(s);
                    return true;
                }
            }
            return false;
        } catch (WebDriverException e) {
            System.out.println("Error: catch WebDriverException.");
            e.printStackTrace();
            return false;
        }
    }

处理:
由于我们的 app 客户有很多是 Android 4.X,我特意把 Nexus 4 刷机到 Android 4.4.4,结果每次运行到 switch webview 就报错。同样的测试代码、手机(硬件)、mac mini 和 ide,只有 Android 版本不同,切换到 webview 就找不到元素了。在 chrome inspector 里面是可以定位元素的,而且在 android 5.x 下也可以找到元素并且对该元素进行操作。我花了好几天 Google,有人说 Chromedriver 要最新版本,以前的版本有 bug,在 2.13 以后修复了;有人说是 Chrome 核心版本(chromium)不能低于 33,但是 api level 19 就是 33 啊?!在 stackoverflow 论坛说什么的都有,就是不能解决问题。和国内几位做手机自动测试的网友请教,都不能解决问题,特此在这里求教,非常感谢!

共收到 23 条回复 时间 点赞

@lihuazhang 第一次在国内测试论坛发帖,哪里有问题还望指点,谢谢

#1 楼 @richard 发帖需要符合发帖规范,我帮你改了下,望下次遵守规则。

@richard appium 这边有日志吗?

#1 楼 @richard 如果 chrome inspector 可以定位到 webview 的话, 那 appium 一般也可以定位到 webview

LZ 用 uiautomatorviewer 看下是不是 webview 的元素能否被识别出来不,能识别出来就不需要做 Switch to,直接用 find_element_by_id 或者 find_element_by_name

是第一次切就报错还是后面才报错?

#5 楼 @hcc3352779 谢谢回复。我去试一下,因为在安卓 5 是切换并找到元素的。

#6 楼 @quqing 切换正常但是切换后找不到元素。在安卓 5 正常

#8 楼 @richard 你看看是不是 chromedriver 缓存问题导致的

#9 楼 @quqing 请问能说具体一点吗?我几次都是重启电脑、重启手机后运行的测试程序,也不行。

今天在办公室花了一些时间又试了一下,还是不行,具体如下:

  1. debugged 测试代码,for (String s : contexts) 是得到 2 个值,并且 driver.context(s) 在 android 4.4.4 得到和 5.0.1 一样的 webview 值(具体值忘了,在办公室电脑),并且最后返回值是 true,说明切换 webview 成功的。
  2. 在后面定位元素的时候每次都提示元素 galleryIndicator = null,所以无法走到下一步 click galleryIndicator 了
  3. 用 uiautomatorview 可以定位到元素,但是看到的 class name 和在 appium inspector 及 chrome inspector 上看到的不同,在 appium inspector 和 chrome inspector 可以查到正确的元素 id 和 class name。
  4. 在 Android 5.0.1 上可以切换到 webview,并且找到元素,然后点击元素,而在 4.4.4 可以切换 webview,但是无法找到元素 (元素=null),当然更不能操作元素了。

没有贴 log,因为 log 的结果都是我写的判断(assertion),而且通过 debug 已经定位出是可以切换 webview 而不能找到元素。等我定的 mac mini 到货就可以贴 log 了,因为公司 mac 不能输入中文,用 tablet 打字太慢。

该问题我 google 了很久没有找到解决方案,所以特此来请教,谢谢!

#5 楼 @hcc3352779 谢谢回复!我今天试着不切换到 webview,也无法定位元素。btw,我觉得 appium 不太严谨,有些 webview 页面不切换到 webview 反而能定位、操作,比如我这个 app 的 log in 界面就是,以前的测试开发写的注释里说无法获取元素,以后解决了再完成 log in 功能测试,我试了不用切换 webview 反而可以操作,这个测试反而完成了。

#10 楼 @richard 你是在 driver.context(s) 报错?还是定位元素?
如果可以切换到 webview,请把 pagesource 打印出来看看吧
我以前遇到过切换到 webview 后,pagesource 并不是我想要的内容,需清理缓存

#11 楼 @richard 和我之前遇到的情况,表现上很像,我的解决方案是:在进入 webview 前先把 chromedrive 的进程干掉(清理缓存的暴力手段)

学习一下。非常感谢

#4 楼 @lihuazhang 我在 iOS 上遇到类似问题,Safari 能看到当前页面是 webview,但 appium inspector 里面 context 显示是 no context,没有 native 和 webview 可以切换,用 driver.current context 抓出来的是 native,不是 webview,请问是要像 Android 一样,让开发同学设置一个 webview 的开关么?

—— 来自 TesterHome 官方 安卓客户端

#16 楼 @app_test 这里说的是 android…… iOS 的话要把 inspector 打开吧

#14 楼 @quqing 怎么干掉进程啊,在代码执行的过程中?

#19 楼 @quqing 我发现我这边不是进程的原因,是切换到 webview 后进入了预加载的页面,而没有进入我想要进入的页面。谢谢你提供思路

楼主最后问题怎么解决的?

我也是只显示 NATIVE_APP 但表面上还是可以进行元素操作,部分复杂页面就大红框,偶尔可以读到 WEBVIEW.com.xx.xxx。在小米 5.0 测试机还抓住过大红框的元素,再往深进入页面就识别不了,试过 Android4.4.4,5.0 版本兼容性还稍微好点

@quqing 侧男 我遇到一个问题就是能进入 webview 界面了 然后操作里面的元素点击 click 报错 知道什么情况吗 急

@richard 楼主 你成功进入 webview 界面 但是无法操作 webview 里面元素的问他解决了吗 我也是 mac 上
进入 webview 没问题 成功 print 页面内容 但是操作里面的元素就报错 也是用的谷歌的 inspector

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