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

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


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

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

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

解决方案:修改Appium源码

Appium安装目录下的文件
Appium\node_modules\appium\lib\devices\android\android-hybrid.js,文件中有这样一个函数:

 
    
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
    
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);
}
};

改为:

 
    
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
    
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。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值