Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Selenium WebDriver JS - Explicit Wait

Tags:

I am using the selenium-webdriverjs. I want to wait for a certain element to be displayed for which I have created an explicit wait as follows and it works just fine,

var displayed = false; driver.wait(function(){     driver.findElement(locator).isDisplayed().then(function(value){         displayed = value;     });     return displayed; }, timeout); 

Is this the best I can do or is there a better way to do this? The reason I ask is that the first time ever the wait callback is called (in my case) it will always return false. Only subsequently when the isDisplayed promise is executed will the value of displayed change.

like image 816
Moiz Raja Avatar asked Jun 02 '13 12:06

Moiz Raja


People also ask

How do you wait for a specific element in Selenium?

We can wait until an element is present in Selenium webdriver. This can be done with the help of synchronization concept. We have an explicit wait condition where we can pause or wait for an element before proceeding to the next step. The explicit wait waits for a specific amount of time before throwing an exception.

Which Selenium wait is better?

The best practice to wait for a change in Selenium is to use the synchronization concept. The implicit and explicit waits can be used to handle a wait. The implicit is a global wait applied to every element on the page. The default value of implicit wait is 0.

What is default wait time for implicit wait in Selenium WebDriver?

WebDriver Implicit Wait Implicit waits are used to provide a default waiting time (say 30 seconds) between each consecutive test step/command across the entire test script. Thus, the subsequent test step would only execute when the 30 seconds have elapsed after executing the previous test step/command.


1 Answers

Your code is mixing a synchronous return with asynchronous callbacks, the following code should do the right thing:

return driver.wait(function() {     return driver.findElement(locator).isDisplayed(); }, timeout); 

The inner function will return a promise that driver.wait will wait for and will take its value (true/false) as the waiting condition.

like image 138
coudy Avatar answered Feb 20 '23 13:02

coudy