Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Combining implicit wait and explicit wait together results in unexpected wait times

My two scenarios -

1) First

@driver.manage.timeouts.implicit_wait = 30
@wait = Selenium::WebDriver::Wait.new(:timeout => 45) # Time greater than implicit
@wait.until {@driver.find_element(:tag_name => "body").text.include?("hey")}

Which gives the driver 45 seconds to search for the text(which is expected)

2) Second

@driver.manage.timeouts.implicit_wait = 30
@wait = Selenium::WebDriver::Wait.new(:timeout => 5) # Time less than implicit
@wait.until {@driver.find_element(:tag_name => "body").text.include?("hey")}

This now gives the driver 30 seconds to search for the text(not expected)

Is there a way to make selenium wait only for the explicit wait time and not for the greater of the two?

Note - Not declaring the implicit wait time is not an option, cause I cannot afford to let selenium hang each time the driver is unable to find something.

Using Selenium version 30, windows, ff

like image 560
Amey Avatar asked Mar 01 '13 18:03

Amey


People also ask

What happens if we mix implicit and explicit wait?

Warning: Do not mix implicit and explicit waits. Doing so can cause unpredictable wait times. For example, setting an implicit wait of 10 seconds and an explicit wait of 15 seconds could cause a timeout to occur after 20 seconds.

What happen if you mix both thread sleep and Webdriver waits in a Selenium script?

Thread. sleep() just holds the execution for specified time wherever you use this. If we use any other waits with sleep method, webdriver will just hold the execution for specified time and then will follow other wait. Sleep will not override any waits and vice-versa.

Why implicit wait is deprecated?

Method Summary Deprecated. Use implicitlyWait(Duration) Specifies the amount of time the driver should wait when searching for an element if it is not immediately present. Specifies the amount of time the driver should wait when searching for an element if it is not immediately present. Deprecated.

Is implicit Wait a global wait?

Note: Implicitly wait is applied globally which means it is always available for all the web elements throughout the driver instance.


1 Answers

Don't mix implicit and explicit waits. Part of the problem is that implicit waits are often (but may not always be!) implemented on the "remote" side of the WebDriver system. That means they're "baked in" to IEDriverServer.exe, chromedriver.exe, the WebDriver Firefox extension that gets installed into the anonymous Firefox profile, and the Java remote WebDriver server (selenium-server-standalone.jar). Explicit waits are implemented exclusively in the "local" language bindings. Things get much more complicated when using RemoteWebDriver, because you could be using both the local and remote sides of the system multiple times.

This is how that would work: local code -> Java remote server -> local Java language bindings on the remote server -> "remote" component like the Firefox extension, chromedriver.exe or IEDriverServer.exe. It's even more complex in the grid case, since there could be other hops in between.

Thus, when you try to mix implicit and explicit waits, you've strayed into "undefined behavior". You might be able to figure out what the rules of that behavior are, but they'll be subject to change as the implementation details of the drivers change. So don't do it.

You shouldn't be experiencing "hangs" when an element can't be found if you're not using implicit waits. The driver should throw a NoSuchElement exception immediately.

like image 179
JimEvans Avatar answered Sep 28 '22 03:09

JimEvans