Сеанс автоматизации тестирования гибридного приложения SauceLabs не запускается на устройствах iOS - PullRequest
1 голос
/ 23 апреля 2020

Я пытаюсь запустить тесты автоматизации для гибридного приложения на SauceLabs (SL) на Android и iOS. По какой-то странной причине, когда я начинаю выполнение на SL с iOS устройствами, я вижу только устройство с вращателем, которое пытается начать сеанс и оно работает в l oop в течение более 20 минут (это то, что я дал тестам время ожидания в прошлый раз, когда я пытался). Для android устройства работают отлично и заканчивают выполнение теста. Некоторые сведения об инструментах и ​​среде:

  1. Тестовые среды: Appium, WebdriverIO, Cucumber.
  2. Язык: JS
  3. Селекторы, используемые в коде (объекты страницы): HTML пользовательские селекторы для каждой кнопки / поля ввода и т. Д. c, от ioni c (гибрид) app
  4. Чтобы получить доступ к этим селекторам, в файле конфигурации appium для SL я добавил следующее ('appium:autoWebview': true), которое предлагается при работе с гибридными приложениями. Проверенный с другими проектами, которые тоже работают (проект, который использует приманки с appium), файл конфигурации написан в хорошем формате.
  5. Используемые артефакты: сборка приложения .ipa для iOS (построена правильно, я смог использовать его в ручном тестировании), .apk для Android (там тоже все хорошо).

Есть ли что-то, что мне не хватает для настройки на моей стороне, чтобы иметь возможность запускать iOS тесты на SL с использованием фреймворков и стратегии локатора / селектора, о которых я упоминал выше? Или это может быть какая-то ошибка на их стороне, которую я пропустил, чтобы найти? Я потратил несколько дней на изучение этой проблемы и не смог найти ничего полезного, кроме официальной документации, которой (я думаю) я следовал в хорошем смысле.

Я делюсь 3 файлами конфигурации, которые у меня есть для этого (1 общая конфигурация, 1 iOS и 1 для Android):

  1. Общий конфиг

    const { generate } = require('multiple-cucumber-html-reporter');
    const { removeSync } = require('fs-extra');
    
    exports.config = {
    // ====================
    // Runner and framework
    // Configuration
    // ====================
    runner: 'local',
    framework: 'cucumber',
    sync: false,
    logLevel: 'trace',
    deprecationWarnings: true,
    outputDir: './test-report/output',
    bail: 0,
    baseUrl: 'http://the-internet.herokuapp.com',
    waitforTimeout: 6000,
    connectionRetryTimeout: 90000,
    connectionRetryCount: 3,
    specs: ['tests/features/**/*.feature'],
    reporters: [
        'spec',
        [
            'cucumberjs-json',
            {
                jsonFolder: '.tmp/json/',
                language: 'en',
            },
        ],
    ],
    cucumberOpts: {
        requireModule: ['@babel/register'],
        backtrace: false,
        compiler: [],
        dryRun: false,
        failFast: false,
        format: ['pretty'],
        colors: true,
        snippets: true,
        source: true,
        profile: [],
        strict: false,
        tags: [],
        timeout: 100000,
        ignoreUndefinedDefinitions: false,
        tagExpression: 'not @skip',
    },
    
    // ====================
    // Appium Configuration
    // ====================
    services: ['appium'],
    appium: {
        // For options see
        // https://github.com/webdriverio/webdriverio/tree/master/packages/wdio-appium-service
        // If you need a logs from appium server, make log equal true.
        log: false,
        args: {
            // For arguments see
            // https://github.com/webdriverio/webdriverio/tree/master/packages/wdio-appium-service
        },
        command: 'appium',
    },
    
    port: 4723,
    // ====================
    // Some hooks
    // ====================
    /**
     * Gets executed once before all workers get launched.
     * @param {Object} config wdio configuration object
     * @param {Array.<Object>} capabilities list of capabilities details
     */
    onPrepare: function() {
        // Remove the `.tmp/` folder that holds the json and report files
        removeSync('.tmp/');
    },
    /**
     * Gets executed after all workers have shut down and the process is about to exit.
     * An error thrown in the `onComplete` hook will result in the test run failing.
     * @param {Object} exitCode 0 - success, 1 - fail
     * @param {Object} config wdio configuration object
     * @param {Array.<Object>} capabilities list of capabilities details
     * @param {<Object>} results object containing test results
     */
    onComplete: () => {
        // Generate the report when it all tests are done
        generate({
            // Required
            // This part needs to be the same path where you store the JSON files
            // default = '.tmp/json/'
            jsonDir: '.tmp/json/',
            reportPath: '.tmp/report/',
            saveCollectedJSON: true,
        });
    },
    //This code is responsible for taking the screenshot in case of error and attaching it to the report
    afterStep(uri, feature, scenario) {
        if (scenario.error) {
            driver.takeScreenshot();
        }
    },
    
    afterScenario() {
        driver.reset();
    },
    
    afterSession() {
        driver.closeApp();
    },
    };
    
    
  2. iOS SL config (я ставлю звезды к ключам API в целях конфиденциальности):

    const { config } = require('../wdio.shared.conf');
    
    // ============
    // Specs
    // ============
    config.cucumberOpts.require = ['./tests/steps/**/app*.steps.js'];
    
    // ============
    // Capabilities
    // ============
        config.capabilities = [
        {
            deviceName: 'iPhone XR',
            // The reference to the app
            testobject_app_id: '1',
            testobject_api_key: '00768686F013470CB81060**********',
            // The name of the test for in the cloud
            testobject_test_name: 'IOS run',
            // Some default settings
            platformName: 'iOS',
            idleTimeout: 180,
            maxInstances: 6,
            // testobject_cache_device: true,
            noReset: true,
            orientation: 'PORTRAIT',
            newCommandTimeout: 180,
            phoneOnly: true,
            tabletOnly: false,
            autoWebview: true
        },
    ];
    
    // =========================
    // Sauce RDC specific config
    // =========================
    config.services = ['sauce'];
    config.region = 'eu';
    
    // This port was defined in the `wdio.shared.conf.js`
    delete config.port;
    
    exports.config = config;
    
  3. Android SL config:

    const { config } = require('../wdio.shared.conf');
    
    // ============
    // Specs
    // ============
    config.cucumberOpts.require = ['./tests/steps/**/app*.steps.js'];
    
    // ============
    // Capabilities
    // ============
    config.capabilities = [
        {
            deviceName: 'Samsung Galaxy S9',
            // The reference to the app
            testobject_app_id: '1',
            testobject_api_key: '42724CEF3061453C9F45B1**********',
            // The name of the test for in the cloud
            testobject_test_name: 'Android run',
            // Some default settings
            platformName: 'Android',
            idleTimeout: 180,
            maxInstances: 6,
            testobject_cache_device: true,
            noReset: true,
            orientation: 'PORTRAIT',
            newCommandTimeout: 180,
            phoneOnly: true,
            tabletOnly: false,
            autoWebview: true
        },
    ];
    
    // =========================
    // Sauce RDC specific config
    // =========================
    config.services = ['sauce'];
    config.region = 'eu';
    // This port was defined in the `wdio.shared.conf.js`
    delete config.port;
    
    exports.config = config;
    

Caps Appium Desktop:

{
 "platformName": "iOS",
 "platformVersion": "13",
 "deviceName": "iPhone 11 Pro",
 "app": "path-to-ipa"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...