做者:清菡
博客:Oschina、云+社区、知乎等各大平台都有。html
若是用手机自带的浏览器去访问各类网页。天然而然都能获取到 WebView 的,不须要开启什么。用原生的、手机自带的浏览器去试下,也能获得对应的结果。python
首先,要确保 WebView 的出现,要识别什么是 WebView,WebView 一出现,就表明有 Html 页面。那么接下来的操做,可能就进入 WebView 里面操做了。android
可是看到了 WebView,要进入 WebView,你就面临了从原生控件的操做,进入了 Html 页面的操做。因此,第一件事情是必须切换,是上下文切换。web
1.要切换到这样的一个 WebView,必须保证个人代码当中可以获得 WebView 的名字。如何保证获得 WebView 的名字?开启 app 的 WebView debug 属性。chrome
代码中:cons=driver.contexts
,可以识别到 WebView 的时候,咱们才可以进入到切换阶段,不然你连它的名字是什么,你都得不到它,又如何切换呢?shell
2.获得了以后再去切换,切换的时候有 chromedriver 的这个问题,进入 Web 自动化,没有它配合是作不了的。要确保 chromedriver 的版本要与 WebView 的版本匹配,也要放置在对应的位置。小程序
3.放置以后,你才可能切换成功。切换成功,就是再操做一个 html 页面了。html 页面中的元素该如何识别呢?windows
--uc-devtool工具识别html页面,定位元素。
微信小程序
微信小程序和微信公众号的测试方法都是同样的。微信小程序和微信公众号也就是混合应用。浏览器
公众号、小程序都是 WebView,它是个网页,可是是微信的网页,可是微信的网页是绝对不会对外开放 WebView Debug 的。即使这里看到了 WebView,也获取不到,获取不到就切换不了。
重点是进入小程序里面,这个里面就是网页了。小程序基本是网页作的,点进来以后,就能看到 WebView。
这种状况下这样测:
因为腾讯系 qq、微信等都是基于腾讯自研 x5 内核,安卓是谷歌的 WebView 内核。腾讯系 qq、微信等至关于在谷歌的 WebView 内核上面作了个封装了,不是原生的 WebView 内核,因此用谷歌的 WebView 内核就有点问题了。
微信小程序,用模拟器多是搞不定的,模拟器确实很容易闪退,用真机测试比较靠谱。
想要调试微信的小程序或者公众号的时候:
能够给任意一个聊天窗口(你玩的好的朋友)发送这个连接:debugx5.qq.com
微信在新版本中对小程序调试入口加上了限制:在微信主窗口下打开小程序(顶部有个下拉,你曾经用过的小程序,只要往下拉一下,所有都能看得见),在这个地方打开小程序是识别不到的,因此自动化代码就会失效。
显示的 webview 版本是 57.xxx,这里就是微信 X5 内核的版本,不是 android System webview 版本。同一台设备,自带的是 39.0,这里就变成 57.0 了。Chromedriver 是支持 57.0 的。这里要注意区别,要下载一个 Chromedriver,放在 Appium 启动的时候指定的对应路径就能够了。一样也能够点击 inspect 查看页面元素。
页面空白加载不出来,须要 fq;
还有,若是点击右上角关闭了小程序以后,必定要记得清理下对应的小程序进程(关闭以后小程序还在后台运行),再起点击重启小程序。
若是没有走这个路径:在微信->发现->搜一搜搜索小程序,便可发如今inspect工具中能够将对应url显示出来
。去找小程序,可能代码就出现一些问题。
因此它这个比较麻烦。经过 Uc-devtools 工具识别了元素,获得了 chromedriver 的版本。
切换的时候还有问题,问题较多:
微信和 qq 不少进程,须要肯定当前的 web 网页,当前的操做是处于哪一个进程当中。
官方文档中的描述是这样的:
如今确实不是内核 WebView,是腾讯封装的。因此这个地方须要将这个东西开启出来:desired_caps[“recreateChromeDriverSessions”]=True
,支持 X5 内核应用的自动化配置。
由于腾讯的 qq,微信有不少的进程,进程容易搞混切错了。因此强制设置了下安卓的进程:desired_caps["chromeOptions"]={"androidProcess":"com.tencent.mm:toolsmp"}
在 cmd 能够看出,操做的网页在com.tencent.mm:toolsmp
里面,12042 对应的进程是com.tencent.mm:toolsmp
。不能找成了别的进程,别的进程就是在别的页面了。
Web 自动化能够设置参数,这里也是能够设置参数的。
H5 操做、驱动浏览器的时候,是 Web 网页,有一些 Web 应用。Web 应用的时候就须要制定浏览器是 Chrome 仍是别的浏览器。desired_caps["browserName"]=""
不是真的在一个浏览器当中打开一个应用,只是一个应用当中带着小程序,小程序中带着浏览器性质的。因此指定 browserName 等于空。
如下代码片断只提供思路,请根据实际状况修改。
// 支持X5内核应用自动化配置 desiredCapabilities.setCapability("recreateChromeDriverSessions", true); // ChromeOptions使用来定制启动选项,由于在appium中切换context识别webview的时候, // 把com.tencent.mm:toolsmp的webview识别成com.tencent.mm的webview. // 因此为了不这个问题,加上androidProcess: com.tencent.mm:toolsmp ChromeOptions options = new ChromeOptions(); options.setExperimentalOption("androidProcess", "com.tencent.mm:toolsmp"); desiredCapabilities.setCapability(ChromeOptions.CAPABILITY, options); // 初始化会默认将chrome浏览器打开,须要将Browser置为空 desiredCapabilities.setBrowserName("");
// 休眠一下 Thread.sleep(5000); // 找到微信的发现并点击 androidDriver.findElementByAndroidUIAutomator("new UiSelector().text(\"发现\")").click(); // 点击发现里面搜一搜 androidDriver.findElementByAndroidUIAutomator("new UiSelector().text(\"搜一搜\")").click(); Thread.sleep(2000); // 点击搜索框 androidDriver.findElement(By.id("com.tencent.mm:id/jd")).click(); androidDriver.findElement(By.id("com.tencent.mm:id/jd")).sendKeys("xxx软件测试"); Thread.sleep(2000); // 点击搜索结果中的xxx软件测试(采用adb命令坐标点击的方式) execAdb("adb shell input tap 300 200"); Thread.sleep(4000); // 点击xxx软件测试小程序 execAdb("adb shell input tap 300 500"); // 等待小程序加载完成 Thread.sleep(10000); // 获取到全部的contexts System.out.println("全部的contexts:" + androidDriver.getContextHandles()); // 切换到小程序webview对应的context中 androidDriver.context("WEBVIEW_com.tencent.mm:toolsmp"); Thread.sleep(2000); // 获取到全部的handles Set<String> windowHandles = androidDriver.getWindowHandles(); System.out.println("全部的windowsHandles" + windowHandles); // 遍历全部的handles,找到当前页面所在的handle:若是pageSource有包含你想要的元素,就是所要找的handle // 小程序的页面来回切换也须要:遍历全部的handles,切换到元素所在的handle for (String windowHandle : windowHandles) { System.out.println("切换到对应的windowHandle:" + windowHandle); androidDriver.switchTo().window(windowHandle); Thread.sleep(2000); if (androidDriver.getPageSource().contains("xxx")) { break; } } // 点击xx androidDriver.findElement(By.xpath("//*[@id=\"js-tab-bar\"]/li[3]")).click(); // 经过js滚动到指定的元素 (这个元素已经在文档中间已经存在,可是仍是不可见的) WebElement ele=androidDriver.findElement(By.xpath("//em[text()='xx']")); Thread.sleep(2000); // 将Driver实例化为js对象 JavascriptExecutor jExecutor=(JavascriptExecutor)androidDriver; // 滑动到上面定位到的元素的位置 jExecutor.executeScript("arguments[0].scrollIntoViewIfNeeded(true);", ele); Thread.sleep(2000);
公众号 「清菡软件测试」 首发,更多原创文章:清菡软件测试 100+原创文章,欢迎关注、交流,禁止第三方擅自转载。