11

I just wonder, how to have the browser wait before clicking on a link? My goal is that I'm scraping from a dynamic webpage, the content is dynamic but I manage to get the form id. The only problem is that the submit button is only displayed after 2-3 seconds. However, my Firefox driver start clicking on the link immediately when the page is loaded (not the dynamic part).

Is there any way that I can make my browser wait 2-3 seconds until the submit button appears? I tried to use time.sleep() but it pauses everything, the submit button doesn't appear during time.sleep but appears after 2-3 seconds when time.sleep ends.

2 Answers 2

18

You can set wait like following :

Explicit wait :

    element = WebDriverWait(driver, 20).until(
    EC.presence_of_element_located((By.ID, "myElement"))

Implicit wait :

 driver.implicitly_wait(20) # seconds
 driver.get("Your-URL")
 myElement = driver.find_element_by_id("myElement")

You can use any of above. Both are valid.

Sign up to request clarification or add additional context in comments.

3 Comments

perfect that,s what i need, thank you. Just to clarify, explicit wait will applied for that element only while implicit wait will apply for the whole session, am i correct?
Yes you are right , Still if you want main diff. between them then please refer : stackoverflow.com/questions/22656615/…
@HelpingHands : Both of the above waits you have used are infact Explicitwaits, not Implicit waits. Please check and edit your code accordingly.
9

You need to use Selenium Waits.

In particular, element_to_be_clickable expected condition is what fits better than others:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

element = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.ID, "myDynamicElement"))
)
element.click()

where driver is your webdriver instance, 10 is the amount of seconds to wait for an element. With this setup, selenium would try to locate an element every 500 milliseconds for 10 seconds in total. It would throw TimeoutException after 10 seconds left if element would not be found.

2 Comments

i've learnt something new to day, which is the element_to_be_clickable , thanks
Thanks solved my purpose as well, in my case first the button was disabled and based on some event get becomes clickable.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.