java小程序测试_小程序测试 Appium 支持 Java-Client6+ 解决方案

入门踏坑

人类历史上第一篇小程序测试布道贴

异常调查

发生异常后,分别使用 Python 和 Java 用不同的版本做了测试分析。发现 Py 一直是可以的,用最新的 pyClient,和上一个版本都没有问题的。Java 的 Client 升级到 5.0.4 后就开始报错了。明明代码里没有设置 browserName 选项,但是程序运行时,会自动化启动谷歌浏览器,然后小程序测试就异常了。以下是 Java Client 不同版本的调查结果。

Java Client 5.0.0 --> selenium-java 3.5.2 --> OK

Java Client 5.0.1 --> selenium-java 3.5.2 --> OK

Java Client 5.0.2 --> selenium-java 3.5.3 --> OK

Java Client 5.0.3 --> selenium-java 3.5.3 --> OK

Java Client 5.0.4 --> selenium-java 3.6.0 --> Error

Java Client 6.0.0 --> selenium-java 3.12.0 --> Error

场外求助

经过调查,确定以及肯定不是我代码程序的问题,因为同样的设置 Py 和低版本的 Java-Client 都可以正常运行。只好跑去用撇脚的英语给 Appium 提 ISSUE 了

1f602.svg

dec61d9fe682597b89a7b9355711ef99.png

不得不说 Appium 的团队还是很热心的,提供 log 后,很快得到了回应。非常感谢他们开源贡献!

Selenium 的坑

Appium 的大神说这是 Selenium 的锅。已经有小伙伴去给 SeleniumHQ 提 Issue 了。不知道 SeleniumHQ 会不会认领这个锅,也不知道这个问题改正还需要多久。这里把大神给的方案贴一下,传递开源精神。

74654ba03ff1dc8fb874d89232d5fc9b.png

我的码,拿去不谢

环境:

1.Java-client : 6.1.0

2.Android System WebView : 57.0

3.chromedriver : 2.29

4.Appium server:1.8.1

5.Mobile : Android 6.0

package com.lvmama.testcase;

import io.appium.java_client.MobileElement;

import io.appium.java_client.android.AndroidDriver;

import io.appium.java_client.remote.AndroidMobileCapabilityType;

import io.appium.java_client.remote.MobileCapabilityType;

import java.net.MalformedURLException;

import java.net.URL;

import java.util.Set;

import org.openqa.selenium.chrome.ChromeOptions;

import org.openqa.selenium.remote.DesiredCapabilities;

public class WeXinTest {

static AndroidDriver driver = null;

public static void main(String[] args) throws Exception {

DesiredCapabilities desired_capabilities = new DesiredCapabilities();

ChromeOptions chrome_options = new ChromeOptions();

chrome_options.setExperimentalOption("androidProcess", "com.tencent.mm:tools");

desired_capabilities.setCapability(ChromeOptions.CAPABILITY, chrome_options);

desired_capabilities.setCapability(AndroidMobileCapabilityType.PLATFORM, "Android");

desired_capabilities.setCapability(AndroidMobileCapabilityType.VERSION, "6.0");

desired_capabilities.setCapability("deviceName", "a6990c40");

desired_capabilities.setCapability(MobileCapabilityType.FORCE_MJSONWP, true);

desired_capabilities.setCapability(AndroidMobileCapabilityType.APP_PACKAGE, "com.tencent.mm");

desired_capabilities.setCapability(AndroidMobileCapabilityType.APP_ACTIVITY, "ui.LauncherUI");

desired_capabilities.setCapability("showChromedriverLog", true);

desired_capabilities.setCapability(AndroidMobileCapabilityType.AUTO_GRANT_PERMISSIONS, true);

desired_capabilities.setCapability("noReset", true);

desired_capabilities.setCapability(MobileCapabilityType.BROWSER_NAME,"");

desired_capabilities.setCapability(MobileCapabilityType.AUTOMATION_NAME, "uiautomator2");

try {

driver = new AndroidDriver<>(new URL("http://127.0.0.1:4723/wd/hub"),desired_capabilities);

Thread.sleep(2000);

driver.findElementByXPath("//*[@text='发现']").click();

Thread.sleep(2000);

driver.findElementByXPath("//*[@text='小程序']").click();

Thread.sleep(2000);

driver.findElementByXPath("//*[@text='驴妈妈门票预订']").click();

Thread.sleep(5000);

Set contextNames = driver.getContextHandles();

for(String contextName : contextNames) {

lvmama:if(contextName.contains("tencent.mm:appbrand0")){

driver.context(contextName);

Set winHandles = driver.getWindowHandles();

for(String wid : winHandles) {

driver.switchTo().window(wid);

String source = driver.getPageSource();

if (source.contains("票")) {//好粗暴

break lvmama;

}

}

}

}

Thread.sleep(5000);

System.out.println(driver.getPageSource());

} catch (MalformedURLException e) {

e.printStackTrace();

}

}

}

心得

ChromeOptions 的设置:chrome_options.setExperimentalOption("androidProcess", "com.tencent.mm:tools");

这个"com.tencent.mm:tools"可以是 “com.tencent.mm:appbrand0” 但是设置成 “com.tencent.mm:appbrand1” 就不一定对了。

设置时一定要看 Webview 的进程名,这个蛋疼的 appbrandX 的 X 是会变的,切莫生搬套用。

当前 Webview 的进程名查看方法,详尽方法参考这个

c9d2def133e154b9c57dac0f1f1c5129.png

进入小程序页面时要切上下文,老规矩看上一步,查清楚自己 Webview 的进程名

if(contextName.contains("tencent.mm:appbrandX")){//appbrand0,appbrand1,appbrand2。。。都有可能。

driver.context(contextName);

}

切完上下文,注意要切换 WindowHandle,判断确实是自己的页面再退出循环。(我这个判断是否进入自己页面用的是 getPageSource() 有点挫,不知道大家有啥好方法,欢迎留言讨论,谢谢)

Set winHandles = driver.getWindowHandles();

for(String wid : winHandles) {

driver.switchTo().window(wid);

String source = driver.getPageSource();

if (source.contains("票")) {

break;

}

}

后记

现在各大门派都要搞小程序(BAT T..),我这还没入门就入坑了,大家有啥好方案,欢迎留言不吝赐教。最后感谢社区很多优秀的帖子给予参考,感谢 Appium 调查解决。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值