appium实现微信小程序自动化操作(二)
# 准备环境
准备运行环境
- appium server端
- Android sdk
- jdk
查看元素需要的环境
- appium desktop 可以查看手机内的元素
- 谷歌浏览器 输入
chrome://inspect/#devices
(需要翻墙)
我本人操作的时候是 appium desktop 和谷歌浏览器都是用的,appium desktop 本来是可以切换context的但是 我的不知道是哪里没有配置对,所以看小程序的页面元素就转战 谷歌浏览器啦。
# 找到活动应用
首先 确保运行环境已经安装正确,然后就可以接下来的步骤了
真机通过usb数据线连接pc(确保真机亮屏) ,然后先手动打开需要自动化的应用,再去shell窗口输入下面命令,查找应用的进程
adb shell dumpsys activity top | findstr ACTIVITY
1
根据pid 查询进程名
adb shell ps xxx
1
请先记下这个名称,后面写代码需要用到
# 利用appium 打开小程序
开启会话后,appium 会出现应用界面,可以通过录制拿到想要的代码
# 通过谷歌浏览器获取小程序页面信息
我们通过上面的步骤可以进入小程序,才能进行下一步,而且执行这一步的时候,保证手机已经打开了小程序
打开谷歌浏览器输入
chrome://inspect/#devices
1
会发现出现很多 可以点击的 inspect
字样,自己去试试点点看,看哪个是自己想要看的页面
到这里 就可以获取我们自己想要获取的元素的css 路径或者xpath路径了。
下面是实例代码
我认为可以分三个部分
配置DesiredCapabilities 信息,连接appium服务端。
打开应用,切换context,打开小程序
开始自动化操作
public static AndroidDriver<WebElement> driver;
/**
* 微信
*com.tencent.mm
* .ui.LauncherUI
*/
static {
// 创建配置对象
DesiredCapabilities desiredCapabilities = new DesiredCapabilities();
// 添加配置
// deviceName 可以找到我们测试的设备
desiredCapabilities.setCapability("deviceName", "Hisense_E77");
// platformName: 测试平台 Android or Ios
desiredCapabilities.setCapability("platformName", "Android");
desiredCapabilities.setCapability("platformVersion", "7.1.2");
desiredCapabilities.setCapability("appPackage", "com.tencent.mm");
// appActivity 测试App启动入口
desiredCapabilities.setCapability("appActivity", ".ui.LauncherUI");
// 跳过初始化操作
desiredCapabilities.setCapability("skipDeviceInitialization", true);
// 支持X5内核应用自动化配置
desiredCapabilities.setCapability("recreateChromeDriverSessions", true);
desiredCapabilities.setCapability("fastReset", "false");
desiredCapabilities.setCapability("fullReset", "false");
desiredCapabilities.setCapability("noReset", "true");
// 由于小程序是在一个单独的进程中,所以需要加上androidProcess: com.tencent.mm:appbrand0
ChromeOptions options = new ChromeOptions();
// 第二个参数要改成你查询到的小程序进程名--只需要改androidProcess对应的值-查询到的微信小程序的进程名
options.setExperimentalOption("androidProcess", "com.tencent.mm:appbrand0");
desiredCapabilities.setCapability(ChromeOptions.CAPABILITY, options);
// 初始化会默认将chrome浏览器打开,需要将Browser置为空
desiredCapabilities.setBrowserName("");
// 传入两个参数
//第一个参数: Appium通讯地址
//第二个参数:配置对象
try {
driver=new AndroidDriver<WebElement>(new URL("http://127.0.0.1:4723/wd/hub"),desiredCapabilities);
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}
}
public static void main(String[] args) throws InterruptedException {
testWeiXin();
}
public static void testWeiXin() throws InterruptedException {
Thread.sleep(15000);
(new TouchAction(driver)).tap(PointOption.point(682, 1718)).perform();
Thread.sleep(5000);
(new TouchAction(driver))
.press(PointOption.point(486, 996))
.moveTo( PointOption.point(495, 434))
.release()
.perform();
Thread.sleep(5000);
MobileElement el1 = (MobileElement) driver.findElementByXPath("//android.widget.FrameLayout[@content-desc=\"当前所在页面,与的聊天\"]/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[1]/android.widget.FrameLayout/android.widget.FrameLayout/com.tencent.mm.ui.mogic.WxViewPager/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.ListView/android.widget.LinearLayout[9]/android.widget.LinearLayout/android.widget.LinearLayout[1]/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.TextView");
el1.click();
Thread.sleep(5000);
MobileElement el2 = (MobileElement) driver.findElementByXPath("//android.widget.FrameLayout[@content-desc=\"当前所在页面,小程序\"]/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[2]/android.widget.FrameLayout[1]/android.support.v7.widget.RecyclerView/android.widget.RelativeLayout[1]/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.TextView");
el2.click();
//4、等待小程序加载完毕
Thread.sleep(10000);
//切换context -- 》 context名字:WEBVIEW_com.tencent.mm:appbrand0
// driver.context("WEBVIEW_com.tencent.mm:appbrand0");
// 获取到所有的contexts
System.out.println("所有的contexts:" + driver.getContextHandles());
// 切换到小程序webview对应的context中
driver.context("WEBVIEW_com.tencent.mm:appbrand0");
Thread.sleep(6000);
// 打开邻里活动
WebElement element = driver.findElement(By.xpath("/html/body/wx-view/wx-view/wx-h-mescroll-uni/wx-mescroll-uni/wx-view/wx-scroll-view/div/div[1]/div/wx-view/wx-view/wx-view[2]/wx-aplication-tabs/wx-view/wx-view/wx-view[2]/wx-view/wx-u-icon/wx-view/wx-image/div"));
element.click();
Thread.sleep(5000);
// 切换handle
switchHandle("金秋迎国庆");
// 点击活动
WebElement activity = driver.findElement(By.linkText("邻里活动"));
activity.click();
Thread.sleep(5000);
// 点击评论
switchHandle("超级管理员");
WebElement commentButton = driver.findElement(By.cssSelector("body > wx-view > wx-view.btn.data-v-b5c4fe52 > wx-u-button.btn-comment.data-v-b5c4fe52 > wx-button"));
commentButton.click();
Thread.sleep(5000);
// 切换handle
switchHandle("新增评论");
MobileElement commentTextArea = (MobileElement)driver.findElement(By.xpath("/html/body/wx-view/wx-view[1]/wx-u-field/wx-view/wx-view/wx-view[2]/wx-view[1]/wx-textarea"));
commentTextArea.setValue("111111");
WebElement sendButton = driver.findElement(By.xpath("/html/body/wx-view/wx-view[2]/wx-u-button[2]/wx-button"));
sendButton.click();
Thread.sleep(5000);
driver.quit();
}
public static void switchHandle(String keyWord) throws InterruptedException {
// 获取到所有的handles
Set<String> windowHandles = driver.getWindowHandles();
System.out.println("所有的windowsHandles" + windowHandles);
// 遍历所有的handles,找到当前页面所在的handle:如果pageSource有包含你想要的元素,就是所要找的handle
// 小程序的页面来回切换也需要:遍历所有的handles,切换到元素所在的handle
for (String windowHandle : windowHandles) {
Thread.sleep(100);
driver.switchTo().window(windowHandle);
if (driver.getPageSource().contains(keyWord)) {
System.out.println("切换到对应的windowHandle:" + windowHandle);
break;
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
上次更新: 2022/10/23, 22:52:26