在混合应用中,经常会遇到切换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。