在测 APP 的业务流,WebView 和 Native 模式耦合在一起。例如:WebView >> Native >> WebView >> 。。。。。。
Appium 貌似有个问题,从 WebView 切换到 NATIVE 后,chromedriver 可能会把第一个 WebView 的缓存驻留在内存中,即便用 driver.close() 方法关闭当前上下文,也无法清除。
这样会导致进入其他的 WebView,读取的还是第一个 WebView 的内容,导致页面元素无法识别。
下面是发现问题到解决问题的一个过程,希望能帮助到遇到过同样问题的同行。
public void testDemo() {
try {
Log.logInfo("开始切换到WebView模式");
((AppiumDriver) driver).context("WEBVIEW_com.xx.xx.xx.xx");
Log.logInfo("成功切换到WebView模式,开始查找WebView元素");
driver.findElement(By.cssSelector("#myWeidian > div.tpl_part > ul > li.second > span")).click();
driver.findElement(By.cssSelector("#myWeidian > div.tpl_part > ul > li.last > span")).click();
driver.findElement(By.cssSelector("#myWeidian > div.tpl_part > div")).click();
Log.logInfo("开始切换到NATIVE模式");
((AppiumDriver) driver).context("NATIVE_APP");
} catch (Exception e) {
// anything
}
}
public void testDemo() {
try {
Log.logInfo("开始切换到WebView模式");
AppiumDriver chromeDriver = (AppiumDriver) ((AppiumDriver) driver).context("WEBVIEW_com.xx.xx.xx.xx");
Log.logInfo("成功切换到WebView模式,开始查找WebView元素");
chromeDriver .findElement(By.cssSelector("#myWeidian > div.tpl_part > ul > li.second > span")).click();
chromeDriver .findElement(By.cssSelector("#myWeidian > div.tpl_part > ul > li.last > span")).click();
chromeDriver .findElement(By.cssSelector("#myWeidian > div.tpl_part > div")).click();
chromeDriver.close();
Log.logInfo("开始切换到NATIVE模式");
((AppiumDriver) driver).context("NATIVE_APP");
} catch (Exception e) {
// anything
}
}
public void testDemo() {
try {
Log.logInfo("开始切换到WebView模式");
((AppiumDriver) driver).context("WEBVIEW_com.xx.xx.xx.xx");
Log.logInfo("成功切换到WebView模式,开始查找WebView元素");
driver.findElement(By.cssSelector("#myWeidian > div.tpl_part > ul > li.second > span")).click();
driver.findElement(By.cssSelector("#myWeidian > div.tpl_part > ul > li.last > span")).click();
driver.findElement(By.cssSelector("#myWeidian > div.tpl_part > div")).click();
Log.logInfo("开始切换到NATIVE模式");
((AppiumDriver) driver).context("NATIVE_APP");
Tools.killProcess("chromedriver");
} catch (Exception e) {
Tools.killProcess("chromedriver");
}
}
public static void killProcess(String processName) {
try {
String cmd = isWindows() ? "tskill " + processName : "killall \"" + processName + "\"";
cmdInvoke(cmd);
} catch (Exception e) {
Log.logInfo(e.getMessage());
}
}
public static String cmdInvoke(String cmd) {
String cmdOut = "";
BufferedReader br = null;
try {
Process p = Runtime.getRuntime().exec(cmd);
br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = null;
while ((line = br.readLine()) != null) {
cmdOut = line;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
return cmdOut;
}