2014-12-22 3 views
9

Мне просто интересно, как заставить браузер ждать, прежде чем нажимать на ссылку? Моя цель состоит в том, что я соскабливаю с динамической веб-страницы, контент динамический, но мне удается получить идентификатор формы. Единственная проблема заключается в том, что кнопка отправки отображается только через 2-3 секунды. Тем не менее, мой драйвер Firefox начинает нажимать на ссылку сразу, когда страница загружается (а не динамическая часть).Python Selenium как подождать, прежде чем нажимать на ссылку

Есть ли способ заставить мой браузер ждать 2-3 секунды, пока не появится кнопка отправки? Я пытался использовать time.sleep(), но он останавливает все, кнопка отправки не появляется во время time.sleep, но появляется через 2-3 секунды, когда заканчивается time.sleep.

ответ

13

Вы можете установить ждать, как следующее:

Явное ожидание:

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

Неявные ожидания:

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

Вы можете использовать любой из выше. Оба действительны.

+1

отлично, что мне нужно, спасибо. Чтобы уточнить, явное ожидание будет применяться для этого элемента, только если неявное ожидание будет применяться для всего сеанса, я прав? – Kiddo

+0

Да, вы правы, Тем не менее, если вам нужен основной diff. между ними, пожалуйста, обратитесь: http://stackoverflow.com/questions/22656615/what-is-difference-between-implicit-wait-vs-explicit-wait-in-selenium-webdriver –

+1

@HelpingHands: Оба вышеуказанных ожидания вы использовали infact [** 'Explicitwaits' **] (http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp#explicit-waits), а не [**' Implicit waits' **] (http: //docs.seleniumhq.org/docs/04_webdriver_advanced.jsp#implicit-waits). Проверьте и отредактируйте свой код соответствующим образом. – Subh

1

Вам необходимо использовать Selenium Waits.

В частности, element_to_be_clickable ожидается условие, что подходит лучше, чем другие:

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() 

где driver ваш экземпляр WebDriver, 10 это количество секунд ожидания элемента. С помощью этой установки селен попытается найти элемент каждые 500 миллисекунд в течение 10 секунд. Он выкинет TimeoutException через 10 секунд, если элемент не будет найден.

+4

Я узнал что-то новое для дня, которое является element_to_be_clickable, спасибо – Kiddo

Смежные вопросы