Appium 使用 appium 进行微信小程序的自动化测试

seveniruby · 发布于 2017年01月10日 · 最后由 zttaltai 回复于 2017年11月24日 · 10308 次阅读
本帖已被设为精华帖!

微信小程序结构

其实微信小程序不过是正常的webview而已. 只是产品概念上的不同. 本质还是h5.
所以用appium是可以进行自动化的.

以我们美团外卖为例. 查看结构就可以看到小程序的dom结构.

欢迎大家使用美团外卖小程序(此处应有广告词)

自动化用例的调整

  • webview的进程名是com.tencent.mm:appbrand1
  • webview的element需要通过devtool等工具进行分析

具体的细节可参考我之前写过 微信 webview 的自动化技术

示例代码

简单写个demo给大家. 我本地是测试通过的. 代码是scala. 大家自行用自己的语言去实现吧.
关键就是那句

val options = new ChromeOptions()
options.setExperimentalOption("androidProcess", "com.tencent.mm:appbrand1")
capability.setCapability(ChromeOptions.CAPABILITY, options)

测试用例代码

test("测试微信小程序") {
  val capability = new DesiredCapabilities()
  capability.setCapability("app", "")
  capability.setCapability("appPackage", "com.tencent.mm")
  capability.setCapability("appActivity", ".ui.LauncherUI")
  capability.setCapability("deviceName", "emulator-5554")
  capability.setCapability("fastReset", "false")
  capability.setCapability("fullReset", "false")
  capability.setCapability("noReset", "true")
  capability.setCapability("automationName", "appium")
  capability.setCapability("platformName", "android")

  val options = new ChromeOptions()
  options.setExperimentalOption("androidProcess", "com.tencent.mm:appbrand1")
  capability.setCapability(ChromeOptions.CAPABILITY, options)

  val url = "http://127.0.0.1:4723/wd/hub"
  val driver = new AndroidDriver[WebElement](new URL(url), capability)
  driver.findElementByXPath("//*[@text='发现']").click
  driver.findElementByXPath("//*[@text='小程序']").click
  driver.findElementByXPath("//*[contains(@text, '美团外卖')]").click
  println(driver.getContextHandles)
  driver.context("WEBVIEW_com.tencent.mm:tools")
  Thread.sleep(5000)
  println(driver.getPageSource)
  driver.findElementByXPath("//*[contains(@url, '美食')]").click()
  driver.findElementByXPath("//*[contains(., '金百万')]").click()
}

后记

这是行业第一篇用appium进行微信小程序的自动化测试的例子.
转载请注明出自testerhome测试社区和原链 https://testerhome.com/topics/7053

TesterHome微信小助手

TesterHome微信公众号

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 36 条回复
7551

谢谢思寒分享,果断收藏

1511

感谢思寒分享,神速啊👍

96

神速呐,👍

6504

刚刚我还留言,说思寒分享过微信的测试,对小程序应该是没有问题的,没想到这么快就出成果了。。

104

#4楼 @lose 抢个首发帮社区宣传下. 😀

Ec2d77

666,刚打算写个~~

110

#6楼 @joe_blue 写一个玩玩,用macaca可以不?

104

谁打赏的20啊, 谢谢啦. 告诉我小数点后的数字让我认识下土豪

4181

#8楼 @seveniruby 手工赞一个。 话说我上次打赏了一篇你的文章,是不是没收到提示啊

104
seveniruby · #11 · 2017年01月10日 作者

#10楼 @jet 收到了. 目前不知道是谁打赏的. 所以只能问. 年后和恒温改进下. 正式支持下微信支付就好了

1317

#6楼 @joe_blue 你可以试试,尝试了2小时发现macaca 不支持chromeoptions自定义参数,或许是我没整对,提了个issue给macaca

96

这个真心要点赞

—— 来自TesterHome官方 安卓客户端

96

@seveniruby 楼主 appbrand1 和 appbrand2 appbrand3 这个是解释一下么 做微信自动化的时候MAC 端需要启动 chrmedriver吗 端口不设置要紧吗 ?

5158

@seveniruby
代码如下:driver.find_element_by_xpath("//android.widget.TextView[contains(@text,'美团外卖+')]").click()
print driver.contexts

driver.execute(MobileCommand.SWITCH_TO_CONTEXT, {'name': 'WEBVIEW_com.tencent.mm.tools'})

driver.context('WEBVIEW_com.tencent.mm:tools')
driver.find_element_by_xpath("//span[text() = '我的']").click()
报错:
[u'NATIVE_APP', u'WEBVIEW_com.tencent.mm:appbrand1', u'WEBVIEW_com.tencent.mm:tools']
Traceback (most recent call last):
File "D:/AutoTestStudy/pythonstudy/H5Test.py", line 90, in
driver.context('WEBVIEW_com.tencent.mm:tools')
TypeError: 'unicode' object is not callable

104
seveniruby · #16 · 2017年01月11日 作者

#15楼 @si509429 python编程的问题, 你自己查吧

96

今天按照@seveniruby 的方式尝试了一下,发现:
options.setExperimentalOption("androidProcess", "com.tencent.mm:appbrand2");//小程序
这里的appbrand2好像不是固定的,是不是和微信上添加了几个小程序有关呢?
另外,切换context的时候,是不是要使用:
driver.context("WEBVIEW_com.tencent.mm:appbrand2");
而不是:
driver.context("WEBVIEW_com.tencent.mm:tools");

在我的一个酷派手机上,这样操作才能执行成功

96

切换过去就没反应了,webvies的东西操作不了,连System.out.println("2222222"); 也打印不出来.用的是java
代码:
dr.findElementByXPath("//[@text='小程序']").click();
dr.findElementByXPath("//
[contains(@text, 'money计算器')]").click();
Thread.sleep(5000);
Set contexts = dr.getContextHandles();
for (String contextName : contexts) {
System.out.println(contextName);
}
dr.context("WEBVIEW_com.tencent.mm:appbrand0");
System.out.println("2222222");

96

#17楼 @levinzhang1981 appbrand2确实跟添加小程序的个数有关

20楼 已删除
104
seveniruby · #21 · 2017年01月12日 作者

#20楼 @knight80829 广告内容, 删除

96

#18楼 @ort886 已解决,chromedriver的问题

104 seveniruby 将本帖设为了精华贴 01月12日 19:24
13790

@ort886 chromedriver的什么问题,如何解决的?

96

@ort886 我chromedriver 提示 chrome not reachable是什么情况?

96

@ort886 我chrome not reachable的问题解决了 现在就是跟你一样 切进去了 没任何反应 一会后元素点击报错... 我的chromedriver2.25 chrome版本54 请问你怎么解决了?

96

@seveniruby 楼主 有个疑问 你 androidProcess配置 填的是"com.tencent.mm:appbrand1" 为什么driver.context("WEBVIEW_com.tencent.mm:tools") 而不是 driver.context(“com.tencent.mm:appbrand1”)?

798276

我切换成功
[debug] [JSONWP Proxy] Proxying [GET /status] to [GET http://127.0.0.1:8000/wd/hub/status] with no b
ody
[debug] [JSONWP Proxy] Got response with status 200: "{\"sessionId\":\"\",\"status\":0,\"value\":{\"
build\":{\"version\":\"alpha\"},\"os\":{\"arch\":\"x86_64\",\"name\":\"Windows NT\",\"version\":\"6.
1.7601 SP1\"}}}"
[debug] [JSONWP Proxy] Proxying [POST /session] to [POST http://127.0.0.1:8000/wd/hub/session] with
body: {"desiredCapabilities":{"chromeOptions":{"androidPackage":"com.tencent.mm","androidUseRunningA
pp":true,"args":[],"androidProcess":"com.tencent.mm:appbrand0","extensions":[],"androidDeviceSerial"
:"ZX1G4294SH"}}}
[debug] [JSONWP Proxy] Got response with status 200: {"sessionId":"83a43f95f4d58aaa08c13278d617eb15"
,"status":0,"value":{"acceptSslCerts":true,"applicationCacheEnabled":false,"browserConnectionEnabled
":false,"browserName":"chrome","chrome":{"chromedriverVersion":"2.26.436362 (5476ec6bf7ccbada1734a0c
dec7d570bb042aa30)"},"cssSelectorsEnabled":true,"databaseEnabled":false,"handlesAlerts":true,"hasTou
chScreen":false,"javascriptEnabled":true,"locationContextEnabled":true,"mobileEmulationEnabled":fals
e,"nativeEvents":true,"pageLoadStrategy":"normal","platform":"ANDROID","rotatable":false,"takesHeapS
napshot":true,"takesScreenshot":true,"unexpectedAlertBehaviour":"","version":"37.0.0.0","webStorageE
nabled":true}}
[debug] [Chromedriver] Changed state to 'online'
[debug] [MJSONWP] Responding to client with driver.setContext() result: null
[HTTP] <-- POST /wd/hub/session/9a81663a-b01d-4846-90e0-779e160c4644/context 200 5078 ms - 76、

但是找元素时候提示这个

[debug] [JSONWP Proxy] Got response with status 200: {"sessionId":"83a43f95f4d58aaa08c13278d617eb15"
,"status":7,"value":{"message":"no such element: Unable to locate element: {\"method\":\"xpath\",\"s
elector\":\"//*[text()='机票']\"}\n (Session info: webview=37.0.0.0)\n (Driver info: chromedriver=
2.26.436362 (5476ec6bf7ccbada1734a0cdec7d570bb042aa30),platform=Windows NT 6.1.7601 SP1 x86_64)"}}

原因大概知道了,去哪儿出行页面显示很丰富,但是 getsource 看到body是空的
😂 😂 😂 😂 😂 😂 😂 😂 ,所以xpath什么也找不到
**


798276

@seveniruby

楼主的例子能成功执行?还是只是提供一个思路

美团外卖首页,getsource ,也是


楼主是如何定位元素的
chrome://inspect/#devices 显示的元素能定位么

我试了这么多,source的数据都是

形式的,这样的话不能支持自动化,还是我的方式错了

1317 adfghzhang Macaca 微信公众号、小程序实践 中提及了此贴 01月17日 11:44
3759 fir_im CI Weekly #12 | 微信小程序的自动化测试进阶 中提及了此贴 01月19日 10:57
96

#22楼 @ort886 ChromeDriver换成什么版本了?

388ccc

我使用 contextNames = driver.getContextHandles(); 获取的只有NATIVE_APP一个,没有WebView相关的成员, 这个问题各位是怎么解决的,@seveniruby

3727


请问楼主,这两种写法的区别是什么?

37楼 已删除
4442
3727ping_sky 回复

contains是包含的意思,这样‘美团外卖’ 四个字前或末尾有图标或字符时也可以被找到

3bae02
798276utopia 回复

我也遇到了和你一样的问题,切是切过去了,但获取元素的时候就报错,不知道你解决了没?

90a5a8

请教下,已经切换到webview,但是找不到元素,是怎么回事啊,谢谢

package com.demo;

import io.appium.java_client.AppiumDriver;
import io.appium.java_client.NoSuchContextException;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.remote.AndroidMobileCapabilityType;
import io.appium.java_client.remote.MobileCapabilityType;

import java.io.File;
import java.net.URL;
import java.util.Set;

import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.Assert;
import org.testng.annotations.Test;

public class Demo {

@Test
public static void startapp() throws Exception{
AppiumDriver driver;

DesiredCapabilities capabilities=new DesiredCapabilities();
capabilities.setCapability(CapabilityType.BROWSER_NAME, "");

capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "127.0.0.1:21503");
// capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "192.168.154.101:5555");

capabilities.setCapability(MobileCapabilityType.PLATFORM_VERSION, "5.1.1");
capabilities.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android");

//启动应用的包名
capabilities.setCapability(AndroidMobileCapabilityType.APP_PACKAGE, "com.tencent.mm");
//启动应用的起始ACTIVITY
capabilities.setCapability(AndroidMobileCapabilityType.APP_ACTIVITY,".ui.LauncherUI");
//支持中文输入
capabilities.setCapability("unicodeKeyboard", "True");
//重置输入法为系统默认
capabilities.setCapability("resetKeyboard", "True");

ChromeOptions options = new ChromeOptions();
// options.setExperimentalOption("androidProcess", "com.tencent.mm:tools");
options.setExperimentalOption("androidProcess", "com.tencent.mm:appbrand0");
capabilities.setCapability(ChromeOptions.CAPABILITY, options);

// DesiredCapabilities option = new DesiredCapabilities();
// option.setCapability("androidProcess", "com.tencent.mm:appbrand0");
// capabilities.setCapability(ChromeOptions.CAPABILITY, option);

driver=new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
Thread.sleep(5000);
System.out.println("启动app成功");
Thread.sleep(5000);

driver.findElementByXPath("//[@text='发现']").click();
driver.findElementByXPath("//
[@text='小程序']").click();
Thread.sleep(2000);

// driver.findElementByXPath("//*[contains(@text, '京东购物')]").click();
// Thread.sleep(5000);
//

// try{
// Set contexts = driver.getContextHandles();
// for (String context : contexts) {
// //打印出来看看有哪些context
// System.out.println(context);
// }
// driver.context("WEBVIEW_com.tencent.mm:appbrand0");
// }catch(NoSuchContextException nce){
// Assert.fail("没有这个context:");
// }
// Thread.sleep(5000);
// driver.findElementByXPath("//span[contains(text(), '领优惠券')]").click();

// ---------------------------------------------------------------------------------------
driver.findElementByXPath("//*[contains(@text, '美团外卖')]").click();
Thread.sleep(5000);

try{
Set contexts = driver.getContextHandles();
for (String context : contexts) {
//打印出来看看有哪些context
System.out.println(context);
}
driver.context("WEBVIEW_com.tencent.mm:appbrand0");
}catch(NoSuchContextException nce){
Assert.fail("没有这个context:");
}

Thread.sleep(5000);
driver.findElementByXPath("//[contains(@url, '美食')]").click();
driver.findElementByXPath("//
[contains(., '金百万')]").click();

Thread.sleep(2000);
driver.quit();

}
}

E6bfb0

App更换了腾讯的X5浏览器内核,获取不到元素,该怎么解决呢

53fd44

@chenxin 获取不到元素的问题 你解决了么

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册