Как бороться с наследованием в шаблоне PageObjects WebDriver? - PullRequest
1 голос
/ 02 июня 2011

Может кто-нибудь предложить способ борьбы с наследованием в отношении шаблона объектов страницы?

Например, объекты страницы должны иметь общие свойства и методы.

public class LoginPage extends SuperPage
public class SuperPage extends LoadableComponent<SuperPage>

Это было бы хорошо. Но проблема в том, что ваши UnitTests не расширяют SuperPage, они расширяют TestCase, который содержит глобальные свойства и т. Д. Для тестов.

Я стараюсь избегать дублирования, потому что мне нужно поделиться одним и тем же материалом в TestCase и SuperPage ... Страницы и тесты могут расширять только один из них.

Например, мне нужны те же данные формы в доступных объектах PageObjects и Tests ...

Пример:

Если у вас есть PageObject для заполнения html-формы, вам нужны имена полей формы, но они нужны даже в других объектах pageObject. Так что вы расширяете SuperPage, где имена полей. Они не могут быть предоставлены из UnitTests, из-за этого, например:

@CacheLookup
@FindBy(how = How.ID, using = namespace + signifLvl)
private WebElement sigLvl;
@CacheLookup
@FindBy(how = How.ID, using = namespace + languageTo)
private WebElement langTo;  
@CacheLookup
@FindBy(how = How.ID, using = namespace + languageFrom)
private WebElement langFrom;
@CacheLookup
@FindBy(how = How.ID, using = namespace + description)
private WebElement desc;

Но, с другой стороны, вам необходимо использовать их в методах UnitTest, поскольку вы предоставляете разные значения из них для PageObjects.

В противном случае это будет всегда так, предварительно заполнить PageObjects переменными из TestCase:

@Test
public void doStuff() throws IOException {
    driver.navigate().refresh();
    FillOutFormPage fofp = new FillOutFormPage(driver);
    fofp.fill(some values from TestCase);
    fofp.get();
}

Ответы [ 2 ]

0 голосов
/ 06 июня 2011

Одним из ключевых аспектов шаблона Page Object является изоляция тестовых случаев и структуры страницы. Если ваши тесты вводятся в поля, вы, вероятно, делаете это неправильно. Вместо того, чтобы тесты заполняли переменные страниц, на ваших страницах должны быть методы, позволяющие тестам выполнять важные действия. Таким образом, вместо:

myPage.sigLvl = "10"; myPage.langTo = "en"; myPage.langFrom = "de";

вы делаете:

myPage.addTranslation("en", "de", 10);

Дело в том, что ваш тест должен заботиться не о структуре страницы (как называются поля, как они расположены на странице, и т. Д. ), а о поведении заявки.

0 голосов
/ 02 июня 2011

Я не так много сделал с WebDriver, но я помню, что большинство объектов PageOb, которые я создал и протестировал, не нужно было заполнять.Они просто содержали сценарий - последовательность тестируемых условий в форме методов тестирования, вызываемых из UnitTest.Единственное свойство, которое должно быть общим для PageObjects, было только несколькими полями или именами полей (очень редко - как кнопка отправки, при нажатии которой запускается проверка - она ​​должна быть доступна из всех компонентов, которые образуют всю страницу и что-то проверять) иНапример, пространство имен.

В случае создания PageObjects, которые должны быть заполнены различными данными.Он должен идти извне (UnitTests).Поэтому я предполагаю, что нужно заполнять или, скорее, конструировать объекты PageObject с данными в unitTests, но только если это «компонент, подобный сервису», который нужен другим и должен находиться в отличном от этого начальном состоянии.Если вы всегда делаете это так, не должно быть необходимости делить данные такого рода между TestCase и PageObjects.

Должна быть "граница" между PageObjects и UnitTests ... переменные данные должны поступать из unitTests в методы тестирования pageObjects, статические данные, касающиеся пребывания HTML в PageObjects ... ИМХО

Я не знаюне рекомендую иметь SuperPageObejct, потому что, как у вас есть.Метод SomePageObject.get () возвращает SuperObject вместо SomePageObject ... То, что вам нужно в object1, остается в объекте один.Там не должно быть наследства.В Object1 нет ничего, что вам нужно от object2.

...