转载地址:http://blog.csdn.net/testman930/article/details/50799532

问题描述

在测APP的业务流,WebView和Native模式耦合在一起。例如:WebView >> Native >> WebView >> 。。。。。。 
Appium貌似有个问题,从WebView切换到NATIVE后,chromedriver可能会把第一个WebView的缓存驻留在内存中,即便用driver.close()方法关闭当前上下文,也无法清除。 
这样会导致进入其他的WebView,读取的还是第一个WebView的内容,导致页面元素无法识别。 
下面是发现问题到解决问题的一个过程,希望能帮助到遇到过同样问题的同行。

第一版代码:可能大多数人开始都会这么写,这样可能导致无法识别到其他窗口WebView的内容。

  1. public void testDemo() {
  2. try {
  3. Log.logInfo("开始切换到WebView模式");
  4. ((AppiumDriver) driver).context("WEBVIEW_com.xx.xx.xx.xx");
  5. Log.logInfo("成功切换到WebView模式,开始查找WebView元素");
  6. driver.findElement(By.cssSelector("#myWeidian > div.tpl_part > ul > li.second > span")).click();
  7. driver.findElement(By.cssSelector("#myWeidian > div.tpl_part > ul > li.last > span")).click();
  8. driver.findElement(By.cssSelector("#myWeidian > div.tpl_part > div")).click();
  9. Log.logInfo("开始切换到NATIVE模式");
  10. ((AppiumDriver) driver).context("NATIVE_APP");
  11. } catch (Exception e) {
  12. // anything
  13. }
  14. }

第二版代码:我的思路是想通过正常途径解决问题,把当前WebView的实例赋给临时对象,用完后调用close()方法(quit()会把整个Seesion关闭),还是以失败告终,有点发吼了。

  1. public void testDemo() {
  2. try {
  3. Log.logInfo("开始切换到WebView模式");
  4. AppiumDriver chromeDriver = (AppiumDriver) ((AppiumDriver) driver).context("WEBVIEW_com.xx.xx.xx.xx");
  5. Log.logInfo("成功切换到WebView模式,开始查找WebView元素");
  6. chromeDriver .findElement(By.cssSelector("#myWeidian > div.tpl_part > ul > li.second > span")).click();
  7. chromeDriver .findElement(By.cssSelector("#myWeidian > div.tpl_part > ul > li.last > span")).click();
  8. chromeDriver .findElement(By.cssSelector("#myWeidian > div.tpl_part > div")).click();
  9. chromeDriver.close();
  10. Log.logInfo("开始切换到NATIVE模式");
  11. ((AppiumDriver) driver).context("NATIVE_APP");
  12. } catch (Exception e) {
  13. // anything
  14. }
  15. }

第三版代码:软的不行来硬的,放了个绝招,杀chromedriver的进程,还真的成功了,有时候真的需要暴力。。

  1. public void testDemo() {
  2. try {
  3. Log.logInfo("开始切换到WebView模式");
  4. ((AppiumDriver) driver).context("WEBVIEW_com.xx.xx.xx.xx");
  5. Log.logInfo("成功切换到WebView模式,开始查找WebView元素");
  6. driver.findElement(By.cssSelector("#myWeidian > div.tpl_part > ul > li.second > span")).click();
  7. driver.findElement(By.cssSelector("#myWeidian > div.tpl_part > ul > li.last > span")).click();
  8. driver.findElement(By.cssSelector("#myWeidian > div.tpl_part > div")).click();
  9. Log.logInfo("开始切换到NATIVE模式");
  10. ((AppiumDriver) driver).context("NATIVE_APP");
  11. Tools.killProcess("chromedriver");
  12. } catch (Exception e) {
  13. Tools.killProcess("chromedriver");
  14. }
  15. }
  16. public static void killProcess(String processName) {
  17. try {
  18. String cmd = isWindows() ? "tskill " + processName : "killall \"" + processName + "\"";
  19. cmdInvoke(cmd);
  20. } catch (Exception e) {
  21. Log.logInfo(e.getMessage());
  22. }
  23. }
  24. public static String cmdInvoke(String cmd) {
  25. String cmdOut = "";
  26. BufferedReader br = null;
  27. try {
  28. Process p = Runtime.getRuntime().exec(cmd);
  29. br = new BufferedReader(new InputStreamReader(p.getInputStream()));
  30. String line = null;
  31. while ((line = br.readLine()) != null) {
  32. cmdOut = line;
  33. }
  34. } catch (Exception e) {
  35. e.printStackTrace();
  36. } finally {
  37. if (br != null) {
  38. try {
  39. br.close();
  40. } catch (Exception e) {
  41. e.printStackTrace();
  42. }
  43. }
  44. }
  45. return cmdOut;
  46. }

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

  1. [Android] 获取WebView的页面标题(Title)-----WebChromeClient.onReceivedTitle()方法的重写

    应用开发中需要获取WebView当前页面的标题,可能通过对WebChromeClient.onReceivedTitle()方法的重写来实现 效果图如下: 代码如下: public class Mai ...

  2. js在数组arr中随机获取count数量的元素

    // 在数组arr中随机获取count数量的元素; const getRandomArrayElements = (arr, num) => { // 新建一个数组,将传入的数组复制过来,用于运 ...

  3. 在js中获取到的页面元素为undefined

    在学习js的过程中发现了一个问题就是:在js代码中获取页面元素进行操作的时候发现怎么都没有效果,控制台也不报错,弹出获取的元素结果发现是undefined类型. 后来查找了资料发现:因为我的js是写在 ...

  4. chrome 获取移动端页面元素信息

    一:背景在使用appium进行app端自动化测试的时候,一般使用的是uiautomatorviewer来给页面元素做定位.但如果遇到页面元素类型是webview的时候,则只能定位整个页面,而不能更进一 ...

  5. Appium Inspector定位Webview/H5页面元素

    目录 操作步骤 Python操作该混合App代码 Appium在操作混合App或Android App的H5页面时, 常常需要定位H5页面中的元素, 传统方式是 翻墙 + 使用Chrome://ins ...

  6. Selenium_webdriver获取iframe子页面元素

    有时候我们在定位一个页面元素的时候发现一直定位不了,反复检查自己写的定位器没有任何问题,代码也没有任何问题.这时你就要看一下这个页面元素是否在一个iframe中,这可能就是找不到的原因之一.如果你在一 ...

  7. [bug] VUE 的 template 中使用 ES6 语法导致页面空白

    如果你在 template 中,使用了 es6 及以上的语法,那么,在部分ios.安卓.微信浏览器中,打开页面后显示一片空白内容.如下: <ul id="example-1" ...

  8. react中如何获取onclick事件调用元素的dom对象

    今天终于有时间写博客了, 前几天项目有个需求,我感觉用dom操作兄弟元素实现比较方便,但是前端用的react框架不能用jquery的$(this)获取当前元素,查了好多资料和尝试后写下总结: 在HTM ...

  9. Nginx下完美解决WordPress的伪静态 (wordpress 迁移后 导致 页面404)

    直奔主题 如何设置WordPress在 Nginx下的伪静态 第一步:按照文章名为例,登陆后台按照箭头顺序修改固定连接,点击保存更改 第二步:登陆宝塔面板后台,按照文件路径 找到属于要配置域名的con ...

随机推荐

  1. uinty实现玩家尾随鼠标位置平滑旋转角度

    首先我们要在场景中加入一个quad平面作为地板, 然后指定Layer为Floor,然后移除mesh renderer组件 然后加入脚本 脚本主要思想是从屏幕中心投出一条射线到地板, 然后获取相应坐标, ...

  2. Spring的核心机制——依赖注入(Dependency Inject)

    Spring不仅提供对象,还提供对象的属性值,而不是由使用该对象的程序所提供的. Java应用是由一些相互协作的对象所组成的,在Spring中这种相互协作的关系就叫依赖关系. 如果A组件调用了B组件的 ...

  3. ssd算法论文理解

    这篇博客主要是讲下我在阅读ssd论文时对论文的理解,并且自行使用pytorch实现了下论文的内容,并测试可以用. 开篇放下论文地址https://arxiv.org/abs/1512.02325,可以 ...

  4. 编写可维护的JavaScript----笔记(二)

    01.何时使用注释 添加注释的一般原则是,在需要让代码变得更清晰时添加注释 难于理解的代码 浏览器特性hack 注释声明: TODO 说明代码还没完成,应当包含下一步要做的事情 XXX 说明代码是有问 ...

  5. php 计算时间添加

    $Date_1=date("Y-m-d");$Date_2="2015-10-11";$d1=strtotime($Date_1);$d2=strtotime( ...

  6. python笔记-基础入门

    Python 特点 1.易于学习:Python有相对较少的关键字,结构简单,和一个明确定义的语法,学习起来更加简单. 2.易于阅读:Python代码定义的更清晰. 3.易于维护:Python的成功在于 ...

  7. jQuery DataTables添加自定义多个搜索条件

    效果如下: 一.在前台页面定义输入搜索条件的文本框 <div class="ibox-tools"> <span>年度</span> @Html ...

  8. .NET开发笔记--对config文件的操作(1)

    1先写一些常用的公共类: 在Web.config文件中的配置: <!-- appSettings网站信息配置--> <appSettings> <add key=&quo ...

  9. 微信小程序 事件

    事件详解 事件分类 事件分为冒泡事件和非冒泡事件: 冒泡事件:当一个组件上的事件被触发后,该事件会向父节点传递. 非冒泡事件:当一个组件上的事件被触发后,该事件不会向父节点传递. WXML的冒泡事件列 ...

  10. 蓝桥杯 第三届C/C++预赛真题(4) 奇怪的比赛(递归)

    某电视台举办了低碳生活大奖赛.题目的计分规则相当奇怪: 每位选手需要回答10个问题(其编号为1到10),越后面越有难度.答对的,当前分数翻倍:答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错 ...