解决 hybird 应用中重复获取 WebView,导致页面元素无法识别的问题
转载地址:http://blog.csdn.net/testman930/article/details/50799532
问题描述
在测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;
- }
解决 hybird 应用中重复获取 WebView,导致页面元素无法识别的问题的更多相关文章
- [Android] 获取WebView的页面标题(Title)-----WebChromeClient.onReceivedTitle()方法的重写
应用开发中需要获取WebView当前页面的标题,可能通过对WebChromeClient.onReceivedTitle()方法的重写来实现 效果图如下: 代码如下: public class Mai ...
- js在数组arr中随机获取count数量的元素
// 在数组arr中随机获取count数量的元素; const getRandomArrayElements = (arr, num) => { // 新建一个数组,将传入的数组复制过来,用于运 ...
- 在js中获取到的页面元素为undefined
在学习js的过程中发现了一个问题就是:在js代码中获取页面元素进行操作的时候发现怎么都没有效果,控制台也不报错,弹出获取的元素结果发现是undefined类型. 后来查找了资料发现:因为我的js是写在 ...
- chrome 获取移动端页面元素信息
一:背景在使用appium进行app端自动化测试的时候,一般使用的是uiautomatorviewer来给页面元素做定位.但如果遇到页面元素类型是webview的时候,则只能定位整个页面,而不能更进一 ...
- Appium Inspector定位Webview/H5页面元素
目录 操作步骤 Python操作该混合App代码 Appium在操作混合App或Android App的H5页面时, 常常需要定位H5页面中的元素, 传统方式是 翻墙 + 使用Chrome://ins ...
- Selenium_webdriver获取iframe子页面元素
有时候我们在定位一个页面元素的时候发现一直定位不了,反复检查自己写的定位器没有任何问题,代码也没有任何问题.这时你就要看一下这个页面元素是否在一个iframe中,这可能就是找不到的原因之一.如果你在一 ...
- [bug] VUE 的 template 中使用 ES6 语法导致页面空白
如果你在 template 中,使用了 es6 及以上的语法,那么,在部分ios.安卓.微信浏览器中,打开页面后显示一片空白内容.如下: <ul id="example-1" ...
- react中如何获取onclick事件调用元素的dom对象
今天终于有时间写博客了, 前几天项目有个需求,我感觉用dom操作兄弟元素实现比较方便,但是前端用的react框架不能用jquery的$(this)获取当前元素,查了好多资料和尝试后写下总结: 在HTM ...
- Nginx下完美解决WordPress的伪静态 (wordpress 迁移后 导致 页面404)
直奔主题 如何设置WordPress在 Nginx下的伪静态 第一步:按照文章名为例,登陆后台按照箭头顺序修改固定连接,点击保存更改 第二步:登陆宝塔面板后台,按照文件路径 找到属于要配置域名的con ...
随机推荐
- Supervisord常见用法和介绍
Supervisord是用Python实现的一款非常实用的进程管理工具.supervisord会帮你把管理的应用程序转成daemon程序,而且可以方便的通过命令开启.关闭.重启等操作,而且它管理的进程 ...
- 原生javascript 实现的文本编辑器
直接来干活上代码.就一个函数execCommand():自己百度一下. 在线预览 <!doctype html> <html> <head> <title&g ...
- vSphere Web Client使用指南之安装配置
vSphere Web Client使用指南之安装配置 vSphere Web Client是为忙碌的管理员提供的一款通用的.基于浏览器的VMware管理工具,能够监控并管理VMware基础设施.在摆 ...
- 微信小程序上传一或多张图片
一.要点 1.选取图片 wx.chooseImage({ sizeType: [], // original 原图,compressed 压缩图,默认二者都有 sourceType: [], // a ...
- php ocket通信机制
php 实例说明 socket通信机制 一,socket是什么 什么是socket 所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通 ...
- java需要掌握内容、核心不断更新中
1.你需要精通面向对象分析与设计(OOA/OOD).涉及模式(GOF,J2EEDP)以及综合模式.你应该十分了解UML,尤其是class,object,interaction以及statediagra ...
- 第一百五十九节,封装库--JavaScript,表单序列化结合ajax提交数据
封装库--JavaScript,表单序列化结合ajax提交数据 封装库,表单序列化方法 /** xu_lie_biao_dan()方法,表单序列化方法,将自动获取指定表单里面的各项字段name值和va ...
- jdk与jre的区别(转)
很多程序员已经干了一段时间java了依然不明白jdk与jre的区别.JDK就是Java Development Kit.简单的说JDK是面向开发人员使用的SDK,它提供了Java的开发环境和运行环境. ...
- TortoiseGit上传项目代码到github方法(超简单)
Github是咱广大开发者用的非常多的项目代码版本管理网站,项目托管可以是私人的(private)或者公开的(public),私人的收费,一个月7美金.咱这里就只说我们个人使用的,一般都是代码对外开放 ...
- ORACLE 10g RAC [ CSSCLNT][1]clsssInitNative: connect failed, rc 9
"[ CSSCLNT][1]clsssInitNative: connect failed, rc 9“是Oracle RAC中经常遇到的问题,主要出现在安装过程和启动过程中.经常在$ORA ...