解决 hybird 应用中重复获取 WebView,导致页面元素无法识别的问题

问题描述

在测APP的业务流,WebView和Native模式耦合在一起。例如:WebView >> Native >> WebView >> 。。。。。。
Appium貌似有个问题,从WebView切换到NATIVE后,chromedriver可能会把第一个WebView的缓存驻留在内存中,即便用driver.close()方法关闭当前上下文,也无法清除。
这样会导致进入其他的WebView,读取的还是第一个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
        }
    }
第二版代码:我的思路是想通过正常途径解决问题,把当前WebView的实例赋给临时对象,用完后调用close()方法(quit()会把整个Seesion关闭),还是以失败告终,有点发吼了。
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
        }
    }
第三版代码:软的不行来硬的,放了个绝招,杀chromedriver的进程,还真的成功了,有时候真的需要暴力。。。
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;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值