Добрый день!
В связи с не очень большим опытом тестирования используя selenide, прошу подсказки, какую “архитектуру” будет правильней выбрать для тестирования.
В коде, прошу не обращать внимание на код тестов, а только на архитектуру.
В первом случае используется так называемый XPathRepository, который, как я понимаю так же является и PageObject ом:
XPathRepository:
Код класса
public final class XPathRepository {
public static final class Header {
public static final AttributeEntry LOGO = createAttributeEntry("data-qa","header_logo");
public static final AttributeEntry COMPLEXES = createAttributeEntry("data-qa","header_complexes");
public static final class Footer {
public static final AttributeEntry EXPAND = createAttributeEntry("data-qa","footer_expand");
public static final AttributeEntry COMPLEXES = createAttributeEntry("data-qa","footer_complexes");
public static final AttributeEntry EXPERTS = createAttributeEntry("data-qa","footer_experts");
public static final AttributeEntry KNOWS = createAttributeEntry("data-qa","footer_knows");
//Другие внутренние классы страниц
//Получение элемента/ов - код находится в этом же классе
public static AttributeEntry createAttributeEntry(String attributeName, String attributeValue){
return new AttributeEntry(attributeName,attributeValue);
}
public static CSSSelectorEntry createCSSSelectorEntry(String cssSelector){
return new CSSSelectorEntry(cssSelector);
}
public static class AttributeEntry implements IEntry{
private final String attributeName;
private final String attributeValue;
private AttributeEntry(String attributeName, String attributeValue) {
this.attributeName = attributeName;
this.attributeValue = attributeValue;
}
public String getAttributeName() {
return attributeName;
}
public String getAttributeValue() {
return attributeValue;
}
public ElementsCollection getElementsCollection() {
return $$(byAttribute(attributeName,attributeValue));
}
public SelenideElement getSelenideElement() {
return $(byAttribute(attributeName,attributeValue));
}
}
public static class CSSSelectorEntry implements IEntry{
private final String cssSelector;
public String getCssSelector() {
return cssSelector;
}
private CSSSelectorEntry(String cssSelector) {
this.cssSelector = cssSelector;
}
public ElementsCollection getElementsCollection() {
return $$(cssSelector);
}
public SelenideElement getSelenideElement() {
return $(cssSelector);
}
}
interface IEntry{
ElementsCollection getElementsCollection();
SelenideElement getSelenideElement();
}
}
Обращение к элементам происходит так:
Код теста
@Test
public void ClickFooterElements(){
Selenide.open("");
XPathRepository.Footer.EXPAND.getSelenideElement().click();
XPathRepository.Footer.COMPLEXES.getSelenideElement().click();
XPathRepository.ComplexesFilter.WISHES.APARTMENT_BTN.getSelenideElement().click();
}
Во втором случае имеется общий класс SiteFactory (не прикреплен), а также стандартная реализация паттерна PageObject, что можно заметить из тестов.
Код класса
public class FooterBlock {
public SelenideElement getFooterExpand() {
return $("[data-qa=footer_expand]");
}
public SelenideElement getFooterComplexes() {
return $("[data-qa=footer_complexes]");
}
public SelenideElement getFooterExperts() {
return $("[data-qa=footer_experts]");
}
public SelenideElement getFooterKnows() {
return $("[data-qa=footer_knows]");
}
public SelenideElement getFooterJournal() {
return $("[data-qa=footer_journal]");
}
}
Код теста
@Test(enabled = true)
public void footerTestDataQa() {
open(domain);
siteFactory.footerBlock().getFooterExpand().scrollIntoView(true);
siteFactory.footerBlock().getFooterExpand().click();
siteFactory.footerBlock().getFooterKnows().click();
}
Буду благодарен, если подскажете, какую структуру использовать наиболее правильно, и если возможно, уточнить, какие могут быть подводные камни в первом случае?