其他测试框架 [求助] 使用 RobotFramework 的 AppiumLibrary 遇到《Hybrid 混合应用重复获取 WebView 的问题》应该怎么办?

silent · 2016年12月22日 · 最后由 silent 回复于 2017年01月03日 · 1438 次阅读

最近部门在用 RobotFramework 框架做自动化,所以安排我们研究 AppiumLibrary 的使用。

现在遇到个问题:我们 App 有内嵌 H5 页面,测试时发现若 Case 里操作 2 个 H5 页面时,第 1 次使用 GetContexts 和 SwitchToContext 关键字可以切换到第 1 个 H5 页面的 Context,操作 H5 页面内元素。但之后若再操作别的 H5 页面时(两个 H5 页面之间还有原生页面),再使用 GetContexts 和 SwitchToContext 关键字获取 Context ,发现就不能用了,因为此时获取的还是第 1 个页面的 WebView。

上论坛搜索,看到有 Appium/Java 编程解决的案例(https://testerhome.com/topics/4166),但我现在用的是 RobotFramework,没明白怎么干掉 AppiumLibrary 的 driver,因为 RobotFramework 不像自己编程时,会有 driver 这个对象啊。而且用 add shell 和 ps 在 AppiumLibrary 运行时查看进程,发现也只有 uiautomator,没看到 chromedriver。因此现在无头绪了。

所以想发帖请教有没有遇到相同问题的,经常用 RobotFramework 的 AppiumLibrary 的各位,这个问题是怎么解决的?

已解决

刚才查看了下,在公司的 Appium 是 AppiumForWindows_1_4_16_1,是 1.4 的版本。按照 @907305684 的回复,在修改 Appium 的 android-hybrid.js 脚本后,已可以正常获取到想要的 Webview 的 Context 了。

修改如下:
android-hybrid.js 文件路径: {appium 安装路径}\node_modules\appium\lib\devices\android\

androidHybrid.startChromedriverProxy = function (context, cb) {
  cb = _.once(cb);
  logger.debug("Connecting to chrome-backed webview");
  if (this.chromedriver !== null) {
    return cb(new Error("We already have a chromedriver instance running"));
  }

  if (this.sessionChromedrivers[context]) {
    // in the case where we've already set up a chromedriver for a context,
    // we want to reconnect to it, not create a whole new one
    this.setupNewChromedriver(context, cb);  // 替换了原来的this.setupExistingChromedriver(context, cb);
  } else {
    this.setupNewChromedriver(context, cb);
  }
};

特此记录,因 appium 版本不同、源码可能不一样,所以仅供大家参考。感谢 @907305684 的回复,谢谢!

共收到 5 条回复 时间 点赞
silent #11 · 2016年12月29日 Author

@jennifer @okokhihi @chenhengjie123
做过 RobotFramework 的各位,求助!有遇到过我这个问题吗?获取第 2 个 Webview 里的元素时,发现 Context 仍只有第 1 个 Webview,获取不到第 2 个 Webview。
看到过 Appium Java 代码处理的方法,AppiumLibrary 里怎么处理啊?

没遇到过这情况。建议去看 AppiumLibrary 源码,driver 肯定在里面。

PS:driver 是一个对象,不是一个进程。。。

#2 楼 @chenhengjie123 好吧,谢谢,我还是踏踏实实先去看看 python 好了,一直写的 java,所以不太会...

杀死 driver 是笔误了,本来是想着 chromedriver。看了 topics/4166 帖子,所以试着在运行 appiumlibrary 时,找到 chromedriver 杀死。结果只看到了 uiautomator。从头开始啃好了……

这个不是 robotframework 导致的,我估计你用的是 1.4 版本的 appium,这个是该版本 appium 独有的问题,问题代码在 android-hybrid.js 这个文件里面的 startChromedriverProxy,但是改这个治标不治本,你应该升级到 1.6 版本,因为 1.4 版本 Appium 还有会导致 chromedriver 奔溃的问题!

11楼 已删除
6楼 已删除

#4 楼 @907305684 非常感谢告知是 startChromedriverProxy 函数的问题。刚试了下,修改 server 端 的 startChromedriverProxy 函数,就成功获取到想要的 Webview Context 了。看来之前以为是 Client 端的问题的想法有误。而且这次也练习了一把从 log 和源码分析问题,真是不错的经验,谢谢!
(虽然还有点问题,不过慢慢调了。)

silent 关闭了讨论 01月03日 14:18
silent 重新开启了讨论 01月03日 14:28
silent 关闭了讨论 01月03日 14:44
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册