Как правильно использовать шаблоны локаторов в Selenide / Selenium?

Я пытаюсь использовать шаблон «Объекты страницы» при тестировании пользовательского интерфейса. Многие примеры предполагают сохранение By (Locator) в полях класса. Другие рекомендуют сохранять WebElement (или SelenideElement, если вы используете Selenide). Хотя оба они отлично подходят для жестко запрограммированных локаторов, я не понимаю, как использовать это для локаторов, в которых путь содержит переменные.

Например, как сохранить в поле класса этот локатор?

public SelenideElement getTotal(String type) {
   return $(By.xpath("//h4[contains(text(), '"+ type +"')]");
}

person Kyryl Havrylenko    schedule 21.02.2017    source источник


Ответы (2)


На мой взгляд, ваше решение правильное.

Я обычно помещаю их в верхнюю часть своего PageObject рядом с другими селекторами, как то, что вы сделали. Просто используйте этот метод, как если бы вы использовали одно из ваших SelenideElement полей. Что-то вроде:

private SelenideElement getTotalElementByType(String type) {
    return $(By.xpath("//h4[contains(text(), '"+ type +"')]");
}

Я бы сделал это private или protected, потому что с шаблоном объекта страницы ваши тестовые сценарии не должны знать о WebElements на объекте страницы.

Ваш общедоступный метод будет примерно таким:

public int getTotalByType(String type) {
    string totalString = getTotalElementByType(type).getText();
    int total = //convert to int or whatever
    return total;
}

Если вы хотите взаимодействовать с элементом вместо получения значений, вы должны вернуть PageObject, на который вы рассчитываете перейти, вместо того, чтобы следовать POPattern. :)

person mrfreester    schedule 21.02.2017

На самом деле вам не нужно сохранять локаторы в поле класса. Объект страницы не обязательно должен объявлять все элементы в полях класса. Объект страницы - это ОБЪЕКТ, что означает, что он должен предоставлять МЕТОДЫ для управления им.

Итак, ваше решение просто идеальное. :)

person Andrei Solntsev    schedule 21.02.2017