It is a helper technique we use in lots of locations in our Selenium Java assessments. The intent is to click on a button after which detect that the browser has navigated away from the web page by detecting the staleness of the HTML component:
protected static WebDriverWait wdWait;
public static void clickAndWaitForBrowserToLeavePage(WebElement elementToClick) {
WebElement htmlTag = wdWait.till(ExpectedConditions.presenceOfElementLocated(By.tagName("html")));
// click on on the WebElement
elementToClick.click on();
// wait till the tag turns into stale
wdWait.till(ExpectedConditions.stalenessOf(htmlTag));
}
we even have this generalized model:
public static void clickAndWaitForElementToBecomeStale(WebElement elementToClick, WebElement elementToBecomeStale) {
// click on on the WebElement to click on
elementToClick.click on();
// wait till the previous WebElement turns into stale
wdWait.till(ExpectedConditions.stalenessOf(elementToBecomeStale));
}
The issue is that generally this script seems to not detect the staleness of the component it is ready to develop into stale, in all probability as a result of it is already stale earlier than wdwait.till begins, and at that time it detects the identical component on the following web page, and clearly that is not going to go stale as a result of we do not do something on the brand new web page earlier than we completed this test.
Is there a technique to keep away from this “we’re ready a component on the following web page as a substitute of a component on the web page we simply navigated away from” race situation whereas nonetheless retaining the “test we have truly refreshed the web page”?