Как вложить команды nightwatch.js в разделы страницы? - PullRequest
0 голосов
/ 02 июня 2018

У меня есть страница pages/login.js выглядит так:

function fillAndSubmitLogin(email, password) {
  return this
  .waitForElementVisible('@emailInput')
  .setValue('@emailInput', email)
  .setValue('@passwordInput', password)
  .waitForElementVisible('@loginSubmitButton')
  .click('@loginSubmitButton');
}


export default {
  commands: [
    fillAndSubmitLogin
  ],
  elements: {
    emailInput: 'input#email',
    passwordInput: 'input[type=password]',
    TFAInput: 'input#token',
    loginSubmitButton: '.form-actions button.btn.btn-danger'
  }
};

У меня есть другая страница pages/hompage.js homepage.js пытается включить pages/login.js в качестве раздела

import login from "./login.js";

module.exports = {
  url: 'http://localhost:2001',
  sections: {
    login: {
      selector: 'div.login-wrapper',
      ...login
    }
  }
};

Затем у меня есть тестовый случай, который пытается войти в раздел hompage

  'Homepage Users can login': (client) => {
    const homepage = client.page.homepage();
    homepage
    .navigate()
    .expect.section('@login').to.be.visible;


    const login = homepage.section.login;
    login
    .fillAndSubmitLogin('user@test.com', 'password');

    client.end();
  }

Этот тест завершается неудачно со следующей ошибкой

TypeError: login.fillAndSubmitLogin is not a function
       at Object.Homepage Users can login (/Users/kevzettler//frontend/test/nightwatch/specs/homepage.spec.js:32:6)
       at <anonymous>
       at process._tickCallback (internal/process/next_tick.js:182:7)

  login.fillAndSubmitLogin is not a function
       at Object.Homepage Users can login (/Users/kevzettler//frontend/test/nightwatch/specs/homepage.spec.js:32:6)
       at <anonymous>
       at process._tickCallback (internal/process/next_tick.js:182:7)

1 Ответ

0 голосов
/ 05 июня 2018

Согласно документации Nightwatch , любые команды, экспортируемые в объекты страницы, должны быть простыми объектами JavaScript, ключом которых является имя команды, а значением - функция.Например:

var googleCommands = {
  submit: function() {
    this.api.pause(1000);
    return this.waitForElementVisible('@submitButton', 1000)
      .click('@submitButton')
      .waitForElementNotPresent('@submitButton');
  }
};

module.exports = {
  commands: [googleCommands],
  elements: //...etc ...
  // etc...
}

В этом примере модуль экспортирует googleCommands, который является объектом команды с ключом ( submit ) и соответствующей функцией.Я считаю, что вы должны рефакторинг своего кода следующим образом:

function fillAndSubmitLogin = {
  fillAndSubmitLogin: function(email, password) {
    return this
    .waitForElementVisible('@emailInput')
    .setValue('@emailInput', email)
    .setValue('@passwordInput', password)
    .waitForElementVisible('@loginSubmitButton')
    .click('@loginSubmitButton');
  }
};

Конечно, вам не нужно указывать имя команды в обоих местах (как показано в примере (googleCommands / submit)). Это позволяет вам раскрыть множество функций в одном command. Надеюсь, что ответ на вопрос!

...