准备环境
准备运行环境
- 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

根据pid 查询进程名
adb shell ps xxx

请先记下这个名称,后面写代码需要用到
利用appium 打开小程序
开启会话后,appium 会出现应用界面,可以通过录制拿到想要的代码

通过谷歌浏览器获取小程序页面信息
我们通过上面的步骤可以进入小程序,才能进行下一步,而且执行这一步的时候,保证手机已经打开了小程序
打开谷歌浏览器输入
chrome://inspect/#devices

会发现出现很多 可以点击的 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;
}
}
}