Использование запроса с относительными путями
У нас довольно большой набор сквозных тестов на Protractor. Мы следим за шаблоном Page Object, который помогает нам сохранять наши тесты чистыми и модульными. У нас также есть набор вспомогательных функций, которые помогают нам следовать принципу
Вы можете видеть, что у нас есть обход каталога в каждом заявлении require: ./../..
. Это связано с тем, что у нас есть каталог specs
, где мы сохраняем спецификации и несколько каталогов внутри сгруппированных по функциональности приложения.
Вопрос:
Каков канонический подход к проблеме относительного пути в Protractor?
Другими словами, мы бы хотели избежать перемещения дерева, перейдя на импорт модулей. Было бы намного проще спуститься с базового каталога приложений.
Попытки и мысли:
Существует большая статья о приближении этой проблемы: , но я не что какой вариант рекомендуется для разработки тестов с помощью Protractor.
Мы также попытались использовать , чтобы создать путь, но он указывает на каталог node_modules/protractor
вместо нашего приложения каталог.
Ответы
Ответ 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() везде