• 自动化主要就是回归测试,回归测试的用例又不是完全覆盖所有大大小小功能。不需要人工这点提出来就应该可以说他并不了解自动化。你不提就只有背锅了

  • 👍

  • atx?这个是什么?

    目前由于 ios 系统的更新,uiautomator2 不能用了

    请问 xcuitest 原生测试怎么开始弄呢?大家有没有这个方向

  • LZ 的情况相信大家都有遇到,还有的是根本就不是应用的 crash 而是框架的问题导致的应用退出,这个整半天心焦虑。
    还有就是 appium 普遍比其他框架要运作慢,今年打算研究一下其他框架做个对比

  • 好的,正在尝试中

  • 楼主,一定要用 java-client 5 以上版本?还是 Appium 版本已经是 1.7.2-beta2 版本了就不用特意升级 java-client?

    发现 java-client 升级到 5.0 以上,原有的好多 api 没法用,原有的长按、点击、滑动等,修改太大了

  • appium swipe 的问题 at 2018年01月17日
    
        /**
         * 通过传坐标来执行滑动操作
         * 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 呢?又如何知道该设备此时空闲呢?

  • 这个应该如何实施呢?

  • iOS - XCUITest

    第 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?

  • 请问楼主是啥原因呢?目前我们也在准备加上每个步骤截图的操作