Я хочу запустить тесты пользовательского интерфейса на моей чистой vanilla ES5 JS (не угловой, и никаких важных для остальных модулей, я полагаю) веб-странице, но для этого мне нужно ее на определеннойURL (укажите имя хоста, порт и т. Д.).
Я использую Jasmine и Karma для моего модульного теста и автоматически запускаю их на Travis CI .
Теперь я достигточка, где я хочу иметь функциональные тесты / тесты пользовательского интерфейса.Для этого был рекомендован транспортир в сочетании с селеном.Но я сталкиваюсь с различными проблемами (и я даже близко не пытаюсь включить его в Travis CI).
Короткая версия
У меня есть локальный файл index.html
и, вдля правильной инициализации требуется определенный URL ("<protocole, mostly http>://<some-host>:<port>/<some-path>/index.html?<some-query>
").
В настоящее время я могу получить доступ к index
, но только «локально» («file:///<path-to-local-project>/index.html?<query>
») и, следовательно, могу проверять только тот случай использования ошибки, когда URL искажен (эй, по крайней мере, это один изтесты).
Мне нужен способ разместить / сказать, что к «file:///<path-to-local-project>/index.html?<query>
» обращаются через «http://<some-host>:<port>/<some-path>/index.html?<query>
» , потому что при интеграции в полную программу страница будетразмещенный где-то, и URL содержит ценную информацию для динамического поведения (действительно не знаю, какое ключевое слово использовать там («хост», «маршрут» ...?), и я даже не уверен, что это должно быть настроено в транспортире илина самом деле нужно подготовить какой-то скрипт хостинга только для тестирования. И имейте в виду, что, в конце концов, я хочу иметь возможность запускать их и на Travis CI)
Что у меня есть
В protractor.conf.js
exports.config = {
framework: 'jasmine',
baseUrl: 'file:///' + __dirname,
onPrepare: function(){
/**
* If you are testing against a non-angular site - set ignoreSynchronization setting to true
*
* If true, Protractor will not attempt to synchronize with the page before
* performing actions. This can be harmful because Protractor will not wait
* until $timeouts and $http calls have been processed, which can cause
* tests to become flaky. This should be used only when necessary, such as
* when a page continuously polls an API using $timeout.
*
* @type {boolean}
*/
browser.ignoreSynchronization = true;
global.dv = browser.driver;
// By default, Protractor use data:text/html,<html></html> as resetUrl, but
// location.replace from the data: to the file: protocol is not allowed
// (we'll get ‘not allowed local resource’ error), so we replace resetUrl with one
// with the file: protocol (this particular one will open system's root folder)
browser.resetUrl = 'file://';
},
seleniumAddress: 'http://localhost:4444/wd/hub',
specs: [
'test/protractor/**/*.spec.js',
],
capabilities: {
browserName: 'chrome',
/*
proxy: {
proxyType: 'manual',
httpProxy: 'localhost:69/ID-420'
}, //*/
chromeOptions: {
// --allow-file-access-from-files - allow XHR from file://
args: ['allow-file-access-from-files']
}
}
};
В spec.js
describe('The main page', function () {
beforeEach(function () {
// jasmine.Ajax.install(); // how I intercept http requests in the unit tests. Here I may need another package apparently
console.log("browser", browser);
dv.ignoreSynchronization = true;
});
/*
afterEach(function () {
jasmine.Ajax.uninstall();
});
// */
it('should display an error message in the alert if no parameters are provided', function () {
browser.waitForAngularEnabled(false);
browser.get('/index.html');
element(by.className('ajs-content')).getText().then(console.log);
browser.sleep(5000);
expect(element(by.className('ajs-content')).getText()).toEqual("No ID or Host detected");
// expect(element(by.className('ajs-content')).getText()).toEqual(new EXCEPTIONS.NoHostOrIdInURI().description); // not working because unable to import scripts without **modules** (since ES5) but np, I can hard code the expected result
browser.getCurrentUrl().then(console.log);
});
});
Да, это работает, но если я не могу установить пользовательский URL для файла, яне могу проверить ни одного другого варианта использования ... А темы, которые я часто нахожу в Интернете, часто встречаются на Angular.
Предыдущие вопросыion (слишком расплывчато), но может содержать дополнительную информацию.