目录
Step1:准备android 4.4+版本以上的手机/模拟器
Step3:安装UC开发者工具 UC-devtools 识别webview版本 识别web页面元素
Step2:切换到webview context——driver.context(webview context)
Step3:定位webview中的元素,并执行操作:web网页元素定位和操作。
step1:打开微信小程序webview调试开关(微信小程序页面的元素)
step2:UC开发者工具识别小程序的web元素信息—UCdevtools
Android系统的控件,android是google开发的 用来展示web页面 在系统中作为单独的系统应用存在(特殊)
基于UIAutomator+ChromeDriver 、native元生部分走UIAutomator,web部分走Chromedriver,两者结合混搭,从而实现Hybrid自动化
下载UC-devtools中webview对应匹配的chromedriver chromeDriver下载地址:CNPM Binaries Mirrorhttps://npm.taobao.org/mirrors/chromedriver/
CNPM Binaries Mirrorhttps://registry.npmmirror.com/binary.html?path=chromedriver/
替换Appium自带的chromeDriver:
WINDOWS:Appium.exe所在路径\resources\app\node_modules\appium\node_modules\appiumchromedriver\chromedriver\win
MAC:/Applications/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/appium-chromedriver/chromedriver/mac
- Set
contextHandles = driver.getContextHandles(); - System.out.println(contextHandles);//NATIVE_APP、WEBVIEW_com.lemon.lemonban
- //NATIVE_APP,表示原生app
- //WEBVIEW_com.lemon.lemonban,表示WEBVIEW控件
当driver切换context ,底层存在把AndroidDriver转换成WebDriver, 他们都是remoteWebDriver的子类, 接下来的操作都是web操作
- //知道WEBVIEW控件名字的前提下,可以这样切换:
- driver.context("WEBVIEW_com.XXXX");
- //一般情况下一个页面嵌入一个webview网页,如果嵌了多个webview网页,只能通过不同的名字
- //如果一个页面只嵌入了一个webview网页 可以用遍历的形式 只要包含webview 就切换到想要的webview
- //这种情况不需要查询
- for(String contextHandle:contextHandles){
- if(contextHandle.contains("WEBVIEW")){
- driver.context("WEBVIEW_com.XXX");
- }
- }
当driver切回到 NATIVE_APP,WebDriver -> AndroidDriver
- driver.context(native context)
-
- //切换回原生app
- //⚠️一般就像下面一样用NATIVE_APP,因为大家命名基本上都是这个
- driver.context("NATIVE_APP");
比如,滑动
滑动可以退回到native用页面的滑动api——SlideUp(2)
也可以在退出之前在webview里面用web的js滑动
由于腾讯系QQ、微信是基于腾讯自研X5内核,不是谷歌原生webview,所以调试会有些许差异(有很多 app厂商也开始采用X5内核) 微信小程序只能够支持手机,模拟器是不行的
微信小程序自动化 模拟器应用——显示系统进程——可以看到Android System Webview
聊天窗口输入如下URL: http://debugmm.qq.com/?forcex5=true http://debugx5.qq.com
打开X5调试页面,勾选中【打开TBS内核Inspector调试功能】
相当于进行了【在app源码中将webview调试模式打开】
微信有很多的进程,微信和小程序的进程是分开的,我们要确定当前小程序是位于哪个进程中:(⚠️最好只开一个小程序,保证只有一个小程序进程)
- adb shell dumpsys activity top | grep/findstr ACTIVITY
-
- 找到ACTIVITY com.tencent.mm/.plugin.appbrand.ui.AppBrandUI 868fc95 pid=7989 的PID
-
- adb shell ps PID
- //不清除app数据 !!!!一定要加!!!!
- capabilities.setCapability("noReset", true);
-
- //支持X5内核应用自动化配置
- //支持小程序自动化测试
- capabilities.setCapability("recreateChromeDriverSessions", true);
-
- //ChromeOptions使用来定制启动选项,因为在appium中切换context识别webview的时候,
- //把com.tencent.mm:appbrand0的webview识别成com.tencent.mm的webview. 所以为了避免这个问题,加上androidProcess: com.tencent.mm:appbrand0
- ChromeOptions options = new ChromeOptions();
- //设置小程序进程
- options.setExperimentalOption("androidProcess", "com.tencent.mm:appbrand0");
- capabilities.setCapability(ChromeOptions.CAPABILITY, options);
- //初始化会默认将chrome浏览器打开,需要将Browser置为空
- capabilities.setBrowserName("");
- //每次启动时覆盖session,否则第二次后运行会报错不能新建session
- //capabilities.setCapability("sessionOverride", true);
注意:小程序X5内核(webview)版本和chromeDriver版本匹配的时候不能按照常规的chromeDriver版本对照,使用V2.40 chromeDriver
- //微信向下滑动,找到小程序
- SlideDown(2);
-
- //小程序本质上也是web页面 所以我们也需要切换webview 获取context
- System.out.println(driver.getContextHandles());
-
- //切换小程序webview(X5内核)
- //driver.context("WEBVIEW_com.tencent.mm:appbrand0");
- //driver.context("WEBVIEW_com.tencent.mm:toolsmp");
-
- //进入到web模式,定位小程序页面的元素
-
- //driver.findElementByXPath("//a[contains(text(),'课程')]").click();
-
- //直接定位报错:NoSuchElementException --->因为小程序打开之后会有三个web窗口
- //System.out.println(driver.getWindowHandles());显示有三个window句柄
-
- //需要找到正确的web窗口--- 需要切换句柄
-
- //这个API是用来获取所有的窗口句柄
- Set
windowHandles = driver.getWindowHandles(); - for (String windowHandle : windowHandles) {
- System.out.println(driver.getCurrentUrl());
- //通过窗口的标题来判断
- if(driver.getTitle().equals("XXX")) {
- //如果是所需页面的title,不再切换,并且退出
- break;
- }else {
- //继续来切换句柄
- driver.switchTo().window(windowHandle);
- }
- }