您的位置:首页 > 移动开发

Appium测试Android混合应用时,第二次切换到WebView时的定位问题

2017-06-06 16:37 831 查看
在混合应用中,经常会遇到切换Webview之后,页面还停留在上个页面的问题,当前页面的元素怎么也找不到,网上有说杀掉chromedriver进程来解决,杀进程方式适合Appium和代码在一台机器的情况,如果代码在一台机器上,appium安装在另一台机器上,呵呵,这样杀进程也是解决不了的。既然混合应用切换到webview下,应该和处理web页面一样的,直接使用driver.get(url)方法,url 就是你要跳转到的页面,需要跳转的页面可以通过chrome inspector 找到,或者去问开发。

下面这种方式是转自别人的一遍文章,改了源码,但是如果使用的是客户端的Appium,恐怕只改源码是不能生效的,需要通过编译才能生效。如果使用的是npm 安装的appium,改源码编译后是可以生效的。貌似最新的appium 的npm安装包已经不存在webview缓存的问题了。

转自:http://laocaixw.github.io/2016/11/01/Appium%E6%B5%8B%E8%AF%95Android%E6%B7%B7%E5%90%88%E5%BA%94%E7%94%A8%E6%97%B6,%E7%AC%AC%E4%BA%8C%E6%AC%A1%E5%88%87%E6%8D%A2%E5%88%B0WebView%E6%97%B6%E7%9A%84%E5%AE%9A%E4%BD%8D%E9%97%AE%E9%A2%98/?utm_source=tuicool&utm_medium=referral

在用Appium测试Android混合应用时,当程序第一次切换到WebView时,可以正常进行自动化测试。可是当程序第二次切换到WebView时,Appium会自动找到到第一次打开的Html页面,那么这时Appium就无法定位我们第二次打开的Html页面中的元素。

最近在做Android自动化测试开发,遇到了一个对我这种初学者来说非常棘手的难题,网上怎么找也找不到解决方案,不过最终还是被自己瞎猫碰到了死耗子~~在这里做个记录。废话就不多说,这里就直接提供我的解决方案。


解决方案:修改Appium源码

Appium安装目录下的文件

Appium\node_modules\appium\lib\devices\android\android-hybrid.js,文件中有这样一个函数:
123456789101112131415
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.setupExistingChromedriver(context, cb);  } else {    this.setupNewChromedriver(context, cb);  }};
改为:
12345678910111213141516
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.setupExistingChromedriver(context, cb);  // } else {  //   this.setupNewChromedriver(context, cb);  // }  this.setupNewChromedriver(context, cb);};
Appium第一次切换到Html页面时,会新生成一个Chromedriver;当第二次切换到Html时,会使用已经存在的Chromedriver。但其实在我们的应用里面每次打开一个Activity时一般都是会重新创建一个WebChromeClient,所以这里就把它改成无论如何都生成一个新的Chromedriver。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: