Как использовать элементы HTML yandex qa tools selenium wrapper без фабрики страниц (с помощью @FindBy), но на динамических страницах

HTML-элементы yandex qa tools selenium wrapper хорошо работает и инициализирует элементы, когда элементы находятся на объекте страницы, помеченном аннотацией @FindBy и HtmlElementLoader.populatePageObject(this, ((WebDriverBrowser)Browser.getDriver()).getWebDriver()); в конструкторе объекта страницы

Но если содержимое страницы изменяется динамически, я хочу создать HtmlElement в пути, например, без озера @FindBy:

public static void openNavigator(String navigatorName) {
    String navigatorPath = String.format(MENU_OBJ_XPATH_PATTERN, navigatorItemMenuName);
    Element navigatorMenu = new Element(By.xpath(navigatorXpath));
    navigatorMenu.waitForVisible();
}

В этом случае конструктор Element выглядит так:

public Element(By locator) {        
    this.locator = locator;
}

Получена ошибка: no such element: Unable to locate element

И даже если я напрямую попытаюсь запустить элемент

HtmlElementLoader.createHtmlElement(Element.class, Browser.getBrowser().getWebDriver().findElement(By.xpath("//td[contains(text(),'Navigator')]")))

Есть ошибка

no such element: Unable to locate element: {"method":"xpath","selector":"//td[contains(@id,'cnt-start')]//*[contains(text(),'Navigator')]"}
  (Session info: chrome=68.0.3440.106)
  (Driver info: chromedriver=2.41.578737 (49da6702b16031c40d63e5618de03a32ff6c197e),platform=Windows NT 10.0.16299 x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 0 milliseconds

Можно ли использовать такую ​​обертку элементов Html?


person Yuliya Hancharenka    schedule 03.09.2018    source источник


Ответы (2)


Пытаться

  WebDriverWait wait = new WebDriverWait(webDriver, timeoutInSeconds);
  wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(navigatorXpath)));
person GiorgosDev    schedule 03.09.2018

Недостаточно контекста, чтобы предложить лучшее решение, но вот одно: определите свои элементы как массив элементов. Затем вы можете перебрать, чтобы найти конкретный:

@FindBy(xpath = "./menu_locator")
public class SiteMenu extends HtmlElement {
    @FindBy(xpath = "./generic_item_locator")
    List<HtmlElement> items

    public clickOn(String navigatorName) {
        for (HtmlElement item: items) {
            if (item.getText() == "navigatorName") {
                item.click();
            }
        }
        throw new ElementNotFoundException("Navigator item not found")
    }
}
person artkoshelev    schedule 03.09.2018
comment
Спасибо, но дело в том, как инициализировать HtmlElement не с аннотацией @FindBy в случае динамической загрузки страницы. Но с ленивой инициализацией, например, с использованием конструктора HtmlElement с аргументом By - person Yuliya Hancharenka; 04.09.2018
comment
Невозможно сделать это динамически с помощью HtmlElements. Это сделано специально, чтобы избежать ненужного усложнения ваших тестов. Я никогда не видел случая, чтобы тесты выиграли от использования динамических локаторов. Итак, в чем ваше дело? - person artkoshelev; 05.09.2018
comment
Понятно. Мой случай - CMS, основная функция которой - создание страниц с разными элементами. Например, я создаю страницу со списком некоторых элементов. И у меня много случаев, когда элементы могут отличаться при составлении страницы, поэтому я получаю разные блоки страниц результатов. И если я использую HtmlElements, мне нужно создать большое количество разных блоков, что не является подходящим решением. - person Yuliya Hancharenka; 04.10.2018
comment
Или, например, как я могу обработать блок страницы внутри страницы, если блок динамический (он может появляться и исчезать в случае условия)? - person Yuliya Hancharenka; 10.10.2018
comment
Вы можете просто определить этот блок, а затем проверить его видимость в своем тесте перед его обработкой. - person artkoshelev; 11.10.2018