«разместить» файл по определенному URL для тестирования - PullRequest
0 голосов
/ 26 июня 2019

Я хочу запустить тесты пользовательского интерфейса на моей чистой 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 (слишком расплывчато), но может содержать дополнительную информацию.

...