最近部门在用 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 的回复,谢谢!


↙↙↙阅读原文可查看相关链接,并与作者交流