Подтвердить что ты не робот

Использование запроса с относительными путями

У нас довольно большой набор сквозных тестов на Protractor. Мы следим за шаблоном Page Object, который помогает нам сохранять наши тесты чистыми и модульными. У нас также есть набор вспомогательных функций, которые помогают нам следовать принципу

Вы можете видеть, что у нас есть обход каталога в каждом заявлении require: ./../... Это связано с тем, что у нас есть каталог specs, где мы сохраняем спецификации и несколько каталогов внутри сгруппированных по функциональности приложения.

Вопрос:

Каков канонический подход к проблеме относительного пути в Protractor?

Другими словами, мы бы хотели избежать перемещения дерева, перейдя на импорт модулей. Было бы намного проще спуститься с базового каталога приложений.

Попытки и мысли:

Существует большая статья о приближении этой проблемы: , но я не что какой вариант рекомендуется для разработки тестов с помощью Protractor.

Мы также попытались использовать , чтобы создать путь, но он указывает на каталог node_modules/protractor вместо нашего приложения каталог.

4b9b3361

Ответ 1

У меня была та же проблема, и у меня получилось следующее решение. В моем конфигурационном файле Protractor у меня есть переменная, которая хранит путь к базовой папке моих тестов e2e. Кроме того, конфигуратор Protractor предоставляет обратный вызов onPrepare, где вы можете использовать переменную с именем global для создания глобальных переменных для ваших тестов. Вы определяете их как свойства этой переменной global и используете то же самое, что и в тестах, используя глобальные переменные browser или element. Я использовал его для создания настраиваемых глобальных функций для загрузки различных типов объектов:

// __dirname retuns a path of this particular config file
// assuming that protractor.conf.js is in the root of the project
var basePath = __dirname + '/test/e2e/';
// /path/to/project/test/e2e/

exports.config = {

    onPrepare: function () {

        // "relativePath" - path, relative to "basePath" variable

        // If your entity files have suffixes - you can also keep them here
        // not to mention them in test files every time

        global.requirePO = function (relativePath) {
            return require(basePath + 'po/' + relativePath + '.po.js');
        };

        global.requireHelper = function (relativePath) {
            return require(basePath + 'helpers/' + relativePath + '.js');
        };

    }

};

И затем вы можете сразу использовать эти методы глобальной утилиты в тестовых файлах:

"use strict";    

var localStorageHelper = requireHelper('localStorage');
// /path/to/project/test/e2e/helpers/localStorage.js 

var loginPage = requirePO('login');
// /path/to/project/test/e2e/po/login.po.js

var productShowPage = requirePO('product/show');
// /path/to/project/test/e2e/po/product/show.po.js


describe("Login functionality", function () {

    beforeEach(function () {
        browser.get("/#login");

        localStorageHelper.clear();
    });

    // ...

});

Ответ 2

Мы столкнулись с той же проблемой и решили превратить все объекты страницы и вспомогательные файлы в пакеты node. Требовать их в тестах теперь так же просто, как var Header = require('header-po'). Другим преимуществом конвертации в пакеты является то, что вы можете использовать правильное управление версиями.

Вот простой пример:

./страница-объекты/заголовок-ро/index.js

//page-objects/header-po/index.js

'use strict';

var Header = function () {
    this.goHome = function () {
        $('#logo a').click();
    };
  };

module.exports = Header;

./страница-объекты/заголовок-ро/package.json

{
    "name": "header-po",
    "version": "0.1.1",
    "description": "Header page object",
    "main": "index.js",
    "dependencies": {}
}

./package.json

{
    "name": "e2e-test-framework",
    "version": "0.1.0",
    "description": "Test framework",
    "dependencies": {
        "jasmine": "^2.1.1",
        "header-po": "./page-objects/header-po/",
    }
}

./тесты/заголовков test.js

'use strict';

var Header = require('header-po');

var header = new Header();

describe('Header Test', function () {
    it('clicking logo in header bar should open homepage', function () {
        browser.get(browser.baseUrl + '/testpage');
        header.goHome();
        expect(browser.getCurrentUrl()).toBe(browser.baseUrl);
    });
});

Ответ 3

У меня была такая же проблема. Аналогичное решение сделал Майкл Радионов, но не установил глобальную функцию, но установил свойство самому транспортиру.

protractor.conf.js

onPrepare: function() {
  protractor.basePath = __dirname;
}

тест-e2e.js

require(protractor.basePath+'/helpers.js');

describe('test', function() {
   .......
});

Ответ 4

Я думаю, что метод, который мы используем, где я работаю, может быть хорошим решением для вас. Я опубликовал краткий пример того, как мы все обрабатываем. Это довольно хорошо b/c, вы можете просто вызвать функции объекта страницы в любом файле spec, и вам не нужно использовать require в спецификации.

Вызвать модуль node из другого модуля без использования require() везде