I'm looking for something similar to waitForElementPresent
to check whether element is displayed before I click it. I thought this can be done by implicitWait
, so I used the following:
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
and then click by
driver.findElement(By.id(prop.getProperty(vName))).click();
Unfortunately, sometimes it waits for the element and sometimes not. I looked for a while and found this solution :
for (int second = 0;; second++) {
Thread.sleep(sleepTime);
if (second >= 10)
fail("timeout : " + vName);
try {
if (driver.findElement(By.id(prop.getProperty(vName)))
.isDisplayed())
break;
} catch (Exception e) {
writeToExcel("data.xls", e.toString(),
parameters.currentTestRow, 46);
}
}
driver.findElement(By.id(prop.getProperty(vName))).click();
And it waited all right, but before timing out it had to wait 10 times 5, 50 seconds. A bit much. So I set the implicitly wait to 1sec and all seemed fine until now. Because now some things wait 10s before timeout but some other things time out after 1s.
How do you cover the waiting for element present/visible in your code? Any hint is appreciable.
We're having a lot of race conditions with
elementToBeClickable
. See https://github.com/angular/protractor/issues/2313. Something along these lines worked reasonably well even if a little brute forceYou can use Explicit wait or Fluent Wait
Example of Explicit Wait -
Example of Fluent Wait -
Check this TUTORIAL for more details.
Above wait statement is a nice example of Explicit wait.
As Explicit waits are intelligent waits that are confined to a particular web element(as mentioned in above x-path).
By Using explicit waits you are basically telling WebDriver at the max it is to wait for X units(whatever you have given as timeoutInSeconds) of time before it gives up.
This is how I do it in my code.
or
to be precise.
See also: