• Appium之测试微信小程序


    坚持原创输出,点击蓝字关注我吧

    作者:清菡

    博客:Oschina、云+社区、知乎等各大平台都有。

    目录

    • 一、往期回顾
    • 二、测试微信小程序
      • 1.准备工作
      • 2.操作步骤
      • 3.注意
      • 4.强制设置安卓的进程
      • 5.指定 BrowserName 等于空
    • 三、代码

    一、往期回顾

    如果用手机自带的浏览器去访问各种网页。自然而然都能获取到 WebView 的,不需要开启什么。用原生的、手机自带的浏览器去试下,也能得到对应的结果。

    首先,要确保 WebView 的出现,要识别什么是 WebView,WebView 一出现,就代表有 Html 页面。那么接下来的操作,可能就进入 WebView 里面操作了。

    但是看到了 WebView,要进入 WebView,你就面临了从原生控件的操作,进入了 Html 页面的操作。所以,第一件事情是必须切换,是上下文切换。

    1.要切换到这样的一个 WebView,必须保证我的代码当中能够得到 WebView 的名字。如何保证得到 WebView 的名字?开启 app 的 WebView debug 属性。

    代码中:cons=driver.contexts,能够识别到 WebView 的时候,我们才能够进入到切换阶段,否则你连它的名字是什么,你都得不到它,又如何切换呢?

    2.得到了之后再去切换,切换的时候有 chromedriver 的这个问题,进入 Web 自动化,没有它配合是做不了的。要确保 chromedriver 的版本要与 WebView 的版本匹配,也要放置在对应的位置。

    3.放置之后,你才可能切换成功。切换成功,就是再操作一个 html 页面了。html 页面中的元素该如何识别呢?

    --uc-devtool工具识别html页面,定位元素。

    二、测试微信小程序

    微信小程序和微信公众号的测试方法都是一样的。微信小程序和微信公众号也就是混合应用。

    公众号、小程序都是 WebView,它是个网页,但是是微信的网页,但是微信的网页是绝对不会对外开放 WebView Debug 的。即便这里看到了 WebView,也获取不到,获取不到就切换不了。

    重点是进入小程序里面,这个里面就是网页了。小程序基本是网页做的,点进来之后,就能看到 WebView。

    这种情况下这样测:

    由于腾讯系 qq、微信等都是基于腾讯自研 x5 内核,安卓是谷歌的 WebView 内核。腾讯系 qq、微信等相当于在谷歌的 WebView 内核上面做了个封装了,不是原生的 WebView 内核,所以用谷歌的 WebView 内核就有点问题了。

    微信小程序,用模拟器可能是搞不定的,模拟器确实很容易闪退,用真机测试比较靠谱。

    1.准备工作

    1. 微信最新版本。
    2. Uc-devtools 工具。
    3. 安卓手机(5.0+版本)。
    4. Chromedriver 针对自己的版本,通过 Uc-devtools 工具可以识别到 Chromedriver 应该是什么版本。(它跟 WebView 的版本是不一样的,但它同样也代表 Chrome 的版本,需要下载对应的 Chromedriver 驱动它,虽然他不是我们原生的 WebView,只是包装了下,骨子里还是 WebView。)
    5. Appium 版本-Server 最好在 1.7 以上。

    2.操作步骤

    想要调试微信的小程序或者公众号的时候:

    1. 必须开启它的调试模式,微信的调试功能。

    可以给任意一个聊天窗口(你玩的好的朋友)发送这个链接:debugx5.qq.com

    1. 平时用微信搜索一个小程序、公众号在主页面一搜就可以了。但是写自动化脚本不行哦,人家做了控制的。

    微信在新版本中对小程序调试入口加上了限制:在微信主窗口下打开小程序(顶部有个下拉,你曾经用过的小程序,只要往下拉一下,全部都能看得见),在这个地方打开小程序是识别不到的,所以自动化代码就会失效。

    1. 打开微信->发现->搜一搜,搜索必要商城,点击对应小程序进入到主页面。进入小程序后看到的是个 WebView 页面。

    显示的 webview 版本是 57.xxx,这里就是微信 X5 内核的版本,不是 android System webview 版本。同一台设备,自带的是 39.0,这里就变成 57.0 了。Chromedriver 是支持 57.0 的。这里要注意区别,要下载一个 Chromedriver,放在 Appium 启动的时候指定的对应路径就可以了。同样也可以点击 inspect 查看页面元素。

    3.注意

    页面空白加载不出来,需要 fq;

    还有,如果点击右上角关闭了小程序之后,一定要记得清理下对应的小程序进程(关闭之后小程序还在后台运行),再起点击重启小程序。

    如果没有走这个路径:在微信->发现->搜一搜搜索小程序,即可发现在inspect工具中可以将对应url显示出来。去找小程序,可能代码就出现一些问题。

    所以它这个比较麻烦。通过 Uc-devtools 工具识别了元素,得到了 chromedriver 的版本。

    切换的时候还有问题,问题较多:

    4.强制设置安卓的进程

    微信和 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。不能找成了别的进程,别的进程就是在别的页面了。

    5.指定 browserName 等于空

    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+原创文章,欢迎关注、交流,禁止第三方擅自转载。

  • 相关阅读:
    php获取真实ip地址原理及实现
    关于DateTime计算某个日期过后的多少天之后的日期
    关于get_include_path()和set_include_path()的问题
    LinQ In Action 学习第三章
    LinQ In Action 学习第二章
    LinQ in Action 学习第一章 例子。
    asp.net create windows application and setup service.
    JS alert()、confirm()、prompt()的区别
    php获取用户 地区 、ip地址
    购物车相关 js
  • 原文地址:https://www.cnblogs.com/qinghan123/p/14077949.html
Copyright © 2020-2023  润新知