Below is my current favorite method to wait for an element to appear or become useful on a dynamic web page. In this case, my example is avoiding the exception thrown when webdriver fails to find an element by using the ‘find_elements’(plural) method rather than a ‘find_element’(singular) The ‘find_elements’ methods always return a list, even if empty, rather than throw an exception. Both are useful, but in this case I like the more readable code without the try/except requirements. I also like to have a way to record wait times for specific events. Here I’m just printing that info out for example, but I often record this in a db for charting or analysis later.
SOME_CSS_SELECTOR = '#interesting_element_selector'
MAX_WAIT = 5 # my style, this is often defined as a class constant
.
.
.
waited = 0
while waited < self.MAX_WAIT:
# wait for something. I most often put 'sleep(0) just before the 'waited+=1'
# but put it here in cases where I know there is a slow element load
sleep(1)
elements = self.driver.find_elements_by_css_selector(self.SOME_CSS_SELECTOR)
if len(elements) > 1:
break
else:
loading_indicator_element = loading_indicator_elements[0]
waited += 1
print '[INFO] Waited %i seconds for %s' % (waited, str(self.SOME_CSS_SELECTOR))