Как вы можете вернуть новый действительный объект страницы с помощью WebdriverIO?

Мы только начали внедрять фреймворк WebdriverIO-mocha-chai на работе, и, поскольку у меня есть опыт работы с Selenium/Java, мне немного сложно понять это.

Мои объекты страницы выглядят так:

**page.js**

export default class Page {

  get title() { return browser.getTitle() };
  get header() { return browser.element('.Header') }
  get logoutLink() { return browser.element('a.logout') }


  open(url) {
    browser.windowHandleFullscreen().url(`/#/${url}`);
  }
}


**page1.js**

import Page from './page'
import Page2 from './Page2'

class Page1 extends Page {

  get element1() { return browser.element('selector1') }
  get element2() { return browser.element('selector2') }

  clickElement1Page1() {
    this.element1.scroll();
    this.element1.waitForVisible();
    this.element1.click();
    return this;
  }
}

export default new Page1()

**page2.js**

import Page from './page'
import Page1 from './page1';

class Page2 extends Page {
  get element1() { return browser.element('selector1') }
  get element2() { return browser.element('selector2') }
  get element3() { return browser.element('selector3') }
  get element4() { return browser.element('selector4') }

  open() {
    super.open('page2')
  }

  clickElement1Page2() {
    this.element1.scroll();
    this.element1.waitForVisible();
    this.element1.click();
    return this;
  }

  fillForm(name, title) {
    this.element2.setValue(name);
    this.element3.setValue(title);
    this.element4.click();
    return new Page1();
  }
}

export default new Page2()

Разница между этой и рекомендуемой моделью на сайте WebdriverIO заключается в том, что я добавил операторы возврата, что приводит нас к проблеме, с которой мне нужна помощь. Я хочу, чтобы мои тесты выглядели как можно проще, например:

Page2.clickElement1Page2().fillForm("text", "text").clickElement1Page1();

expect(...).to.be.true;

Прямо сейчас я получаю «_page1.default не является конструктором» в строке return new Page1().

Принимая во внимание, что в этой парадигме элементы не инициализируются в конструкторе, возможна ли такая цепочка с WebdriverIO? Любые предложения или примеры надежного проекта webdriverIO POM приветствуются. Спасибо!


person Andrei S    schedule 17.01.2018    source источник


Ответы (1)


Во-первых, я думаю, вы сможете добиться того, чего хотите, изменив return new Page1() на return Page1.

Тем не менее, я не верю, что выгода от возврата Page1 из Page2 того стоит. На мой взгляд, объекты страницы полезны, потому что вы можете четко разделить страницы/разделы вашего приложения, в том числе в ваших тестовых примерах. Я бы определенно рекомендовал использовать return this, чтобы иметь возможность связывать команды в отдельных объектах страницы.

Письмо

Page2.clickElement1Page2().fillForm("text", "text")
Page1.clickElement1Page1()

Ясно означает, что ожидается навигация по страницам и что вы сейчас находитесь на странице 1. Отладка также намного проще, потому что вы можете перейти прямо на страницу 1, а не следовать длинной цепочке с других страниц.

person Mitchell McCulloch    schedule 25.01.2018