The Story:
In Java selenium language bindings there is a FluentWait class, that allows to tightly control how the expected condition would be checke
Well, according to the docs which I read, there doesn't seem to be an actual method that mirrors the functionality of the FluentWait
. Instead, this snippet can be used to change poll frequency and it escapes almost all the exceptions (almost all).
def wait_until(predicate, timeout_seconds, period=0.25, show_log=True):
"""
@summary Call repeatedly the predicate until it returns true or timeout_seconds passed.
@param predicate: a condition, modelized as a callable, that will valued either as True or False
@param timeout_seconds: the timeout in second
@param period: the time to sleep between 2 calls to predicate. Defaults to 0.25s.
@return True if a call to predicate returned True before timeout_seconds passed, else False
"""
if show_log:
myLogger.logger.info("waiting until predicate is true for {end} seconds".format(end=timeout_seconds))
ultimatum = time.time() + timeout_seconds
while time.time() < ultimatum:
myLogger.logger.debug("checking predicate for wait until : {spent} / {end}".format(spent=str(time.time() - (ultimatum - timeout_seconds)), end=timeout_seconds))
try:
if predicate():
return True
time.sleep(period)
except Exception as e:
myLogger.logger.warn("Exception found: {}".format(e))
return False
Consequently, the predicate can be lambda
that you pass which validates the state of the WebElement under question.
With the help of @Kirill S., after the further research and inspecting the WebdriverJS source code, I can conclude that there is no such thing as "poll frequency" in javascript selenium bindings. The interval between subsequent condition check calls cannot be configured - it performs the check as quick as possible.
This is not the same as in, for instance Python or Java selenium bindings, where there is a configurable timeout between the expected condition state checks. By default, it would wait for 500ms before the next check:
WebDriverWait by default calls the ExpectedCondition every 500 milliseconds until it returns successfully. A successful return is for ExpectedCondition type is Boolean return true or not null return value for all other ExpectedCondition types.