Как использовать элементы HTML yandex qa tools Селеновая оболочка без фабрики страниц (используя @FindBy), но на динамических страницах - PullRequest
0 голосов
/ 03 сентября 2018

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

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

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

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

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-элементов следующим образом?

Ответы [ 2 ]

0 голосов
/ 04 сентября 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")
    }
}
0 голосов
/ 03 сентября 2018

Попробуйте

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