自动化主要就是回归测试,回归测试的用例又不是完全覆盖所有大大小小功能。不需要人工这点提出来就应该可以说他并不了解自动化。你不提就只有背锅了
atx?这个是什么?
目前由于 ios 系统的更新,uiautomator2 不能用了
请问 xcuitest 原生测试怎么开始弄呢?大家有没有这个方向
LZ 的情况相信大家都有遇到,还有的是根本就不是应用的 crash 而是框架的问题导致的应用退出,这个整半天心焦虑。
还有就是 appium 普遍比其他框架要运作慢,今年打算研究一下其他框架做个对比
好的,正在尝试中
楼主,一定要用 java-client 5 以上版本?还是 Appium 版本已经是 1.7.2-beta2 版本了就不用特意升级 java-client?
发现 java-client 升级到 5.0 以上,原有的好多 api 没法用,原有的长按、点击、滑动等,修改太大了
/**
* 通过传坐标来执行滑动操作
* start(startX,startY)
* end(endX,endY)
*
* @param startX 起始X坐标
* @param startY 起始Y坐标
* @param endX 终点X坐标
* @param endY 终点Y坐标
*/
public void swipe(int startX, int startY, int endX, int endY) {
Map<String, Object> params = new HashMap<>();
params.put("duration", 0.5);
params.put("fromX", startX);
params.put("fromY", startY);
params.put("toX", endX);
params.put("toY", endY);
// params.put("element", swipeView.getId());
jse.executeScript("mobile: dragFromToForDuration", params);
}
/**
* 通过滑动元素和滑动方向来执行滑动操作
*
* @param swipeView 动元素
* @param toSwipe 滑动方向
* 1. up
* 2. down
* 3. left
* 4. right
*/
public void swipe(MobileElement swipeView, String toSwipe) {
Map<String, Object> params = new HashMap<>();
params.put("direction", toSwipe);
params.put("element", swipeView.getId());
params.put("duration", 500);
jse.executeScript("mobile: swipe", params);
}
这个是经过验证的,有效
java-client 5.0 并不只有 swipe 无效了,有很多 api 无效了,如果楼主升级完了,可以发个贴子全部归类出来就完美了
是的,目前大多采用appium+cucumber+testng
实现测试框架,使用 jenkins 集成
最终异常监控没有弄出来,但是整了一个 try-catch 时截屏
如果大家有好招,还请多多分享哟
目前没有再次遇到此问题,现使用的 Appium 版本v1.6.6-beta.3
谢谢你的建议,我尝试一下
@terrychow LZ 这两天我拼命的整 iOS 并发测试,想向 LZ 请教一下
通过iOS:idevice_id –l
获取到 Mac 链接的设备 UDID,但是如何自动获取哪一个设备的 UDID 呢?又如何知道该设备此时空闲呢?
这个应该如何实施呢?
第 8 个变更点没理清楚
跟WebDriverAgent Connection to WDA timed out
这个频繁出现的问题有没有关联?
测试运行个 4 到 5 个小时之后,就会出现连接失败。目前我们就是通过过了几个小时之后,重新启动一下 app 来绕过的
谢谢,明白了
初始化时 port 使用的是builder.usingAnyFreePort();
任意自由 port 应该没有关系,关键是 udid 这个参数并没有通过 TestNG.xml 传过来
可能在某个环节还是出了点儿问题
这种通过 testng.xml 文件传参,是不是就需要使用Selenium Grid
我一直很混乱这两个方式,这两个是作为一个方式一起使用,还是可单独使用的呢?
TestNG.xml 文件配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="suite" parallel="classes" thread-count="3">
<test verbose="2" name="Sales">
<parameter name="port" value="4788"/>
<parameter name="udid" value="9da82887884423f91840e4a4601862d2821de94a"/>
<classes>
<class name="rl.ipos.cucumberTest.CheckStoreCukesTest"/>
</classes>
</test>
<test verbose="2" name="CustomerManage">
<parameter name="port" value="4777"/>
<parameter name="udid" value="2600ede04135ffc36df6c6e57cf2b4ad34c52f96"/>
<classes>
<class name="rl.ipos.cucumberTest.OpenShopCukesTest"/>
</classes>
</test>
</suite>
iosDriver 初始化
public class Driver {
private int port;
private String udid;
protected static IOSDriver<IOSElement> iosDriver;
protected static AppiumDriverLocalService service;
@BeforeTest
@Parameters({"port", "udid"})
public void setPortUDID(int port, String udid) {
this.port = port;
this.udid = udid;
System.out.println("\nport:" + port + ",udid:" + udid + "\n");
}
private int getPort() {
return this.port;
}
private void setPort(int port) {
this.port = port;
}
private void setUdid(String udid) {
this.udid = udid;
}
private String getUdid() {
return this.udid;
}
public static AppiumDriver getDriver() {
Driver driver = null;
if (iosDriver == null) {
// File file = new File(IPOSConfigPath.DRIVER_CONFIG_FILE);
// ObjectMapper objectMapper = new ObjectMapper();
//
// try {
// driver = objectMapper.readValue(file, Driver.class);
//
// } catch (IOException e) {
// System.out.println("配置文件错误");
// }
AppiumServiceBuilder builder = new AppiumServiceBuilder();
builder.usingAnyFreePort();
builder.withIPAddress("127.0.0.1");
service = AppiumDriverLocalService.buildService(builder);
service.start();
if (service == null || !service.isRunning()) {
throw new AppiumServerHasNotBeenStartedLocallyException("An appium server node is not started!");
}
File appDir = new File(System.getProperty("user.dir"), "/apps/");
File app = new File(appDir, "rlterm3.app");
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(MobileCapabilityType.BROWSER_NAME, "");
capabilities.setCapability(MobileCapabilityType.PLATFORM_VERSION, "10.3.0");
capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "autotest");
capabilities.setCapability(MobileCapabilityType.UDID, driver.getUdid());
capabilities.setCapability(IOSMobileCapabilityType.LAUNCH_TIMEOUT, 500000);
capabilities.setCapability(MobileCapabilityType.AUTOMATION_NAME, AutomationName.IOS_XCUI_TEST);
capabilities.setCapability(MobileCapabilityType.APP, app.getAbsolutePath());
capabilities.setCapability(MobileCapabilityType.NO_RESET, true);
capabilities.setCapability("useNewWDA", true);
iosDriver = new IOSDriver<>(service.getUrl(), capabilities);
//每次Driver执行 找不到元素都会等待此处设置的时间
iosDriver.manage().timeouts().implicitlyWait(480, TimeUnit.SECONDS);
//如果在加载时间还不能加载完页面那会抛出超时异常
// iosDriver.manage().timeouts().pageLoadTimeout(15, TimeUnit.SECONDS);
}
return iosDriver;
}
}
Appium+cucumber
测试启动时,通过 cucumber 找到对应步骤,每一步骤实例化 driver
protected AppiumDriver driver = Driver.getDriver();
在这里实例化的时候报 driver 类这行代码空指针
capabilities.setCapability(MobileCapabilityType.UDID, driver.getUdid());
也就是说这个 udid 值并没有上传成功
我想尝试使用 TestNG.xml 传参实现调配多设备并行运行,但是目前并没有很多关于这方面的博文
传参失败!!
请问你有做过这方面的尝试吗?
并发运行ios目前还不支持
请问 Appium 暂时还不能并发运行多台 iOS 设备吗?
手动是完全可以唤醒键盘的,可就是运行自动化的时候不行
我去 github 也问过大神了,就说是 WDA 的问题
@songer 你好,看到你在帖子上的回复,你设置 capabilities 和创建 drvier 的代码使用了@Parameters
和@BeforeTest
请教你一个问题哈,我目前在思考多线程的问题,想要通过@Parameters
和@BeforeTest
将 testNG.xml 文件的参数传参创建 drvier,但是问题是,值一直没有传过去
难道还需要做其他配置?Grid?
请问楼主是啥原因呢?目前我们也在准备加上每个步骤截图的操作