Ищете способ дождаться только всех видимых элементов, используя Java Selenium WebDriver - PullRequest
0 голосов
/ 28 мая 2020

Я хочу разработать общий c метод для моей платформы, который будет щелкать кнопку с заданным текстом. В моем рабочем приложении есть страницы, на которых есть скрытые кнопки с тем же текстом, что и у цели. Мне нужно, чтобы было какое-то явное ожидание, поскольку некоторым страницам требуется несколько секунд для загрузки элементов. Текущая реализация не работает, потому что она ждет, пока все элементы станут видимыми, когда некоторые из них никогда не загрузят видимые элемент.

Мне нужен способ подождать некоторое время, пока элементы не станут видимыми, но не генерировать исключение, когда не все из них.

public void clickButtonByText(String buttonText) {
    WebDriverWait wait = new WebDriverWait(driver, PAGE_COMPONENT_LOADING_AVERAGE_TIME);
    String xpath = "//button[normalize-space(text())='" + buttonText + "']";
    WebElement button = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(xpath)));
    JavascriptExecutor executor = (JavascriptExecutor) driver;
    executor.executeScript("arguments[0].click();", button);}

1 Ответ

1 голос
/ 29 мая 2020

Всем спасибо за помощь. Это то, что я придумал, и, похоже, это работает.

public void clickButtonByText(String buttonText) {
    WebDriverWait wait = new WebDriverWait(driver, PAGE_COMPONENT_LOADING_AVERAGE_TIME);
    String xpath = "//button[normalize-space(text())='" + buttonText + "']";
    List<WebElement> elements = wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.xpath(xpath)));
    for (WebElement button : elements)  {
        if (button.isDisplayed())   {
            button = wait.until(ExpectedConditions.elementToBeClickable(button));
            clickWithJs(buttonText + " button clicked.", button, PAGE_COMPONENT_LOADING_MIN_TIME);
            break;
        }
    }
}
...