KnightMove
KnightMove

Reputation: 23

Wait until text of a webelement IS an exact, given text

In Java, Selenium, you can wait until a text is present in a webelement (with a WebDriverWait):

wait.until(ExpectedConditions.textToBePresentInElement(webelement, expectedMessage));

However, what do you do when you don't want just expectedMessage to be present in the element (= expectedMessage being a substring of webelement.getText()), but to be the exact text of the webelement (=expectedMessage being the same string as webelement.getText())?

Selenium does provide the function:

wait.until(ExpectedConditions.textToBe(locator, expectedMessage));

but when you have gathered webelements by the locators with @FindBy in your page class, it's awkward to make the locators again directly accessible to test classes.

How can this be solved?

Upvotes: 0

Views: 3219

Answers (2)

There's another simpler solution:

WebDriverWait wait = new WebDriverWait(webdriver, waitForElementTimeout).until(ExpectedConditions.attributeToBe(webelement, "text", expected));

Tested with selenium 3.8.1.

Upvotes: 0

Camarde
Camarde

Reputation: 11

You can create your own ExpectedCondition:

public static ExpectedCondition<Boolean> waitForTextInElementEquals(WebElement elm, String text) {
    return new ExpectedCondition<Boolean>() {
        public Boolean apply(WebDriver driver) {
            try {
                String elementText = elm.getText();
                return elementText.equals(text);
            } catch (StaleElementReferenceException var3) {
                return null;
            }
        }

        public String toString() {
            return String.format("text ('%s') to be present in element %s", text, elm);
        }
    };
}

Which you can use just like the ExpectedConditions already in WebDriverWait:

    WebDriverWait wait = new WebDriverWait(WebDriver, 30, 1000);
    wait.until(waitForTextInElementEquals(foo, bar));

Upvotes: 1

Related Questions