2014-12-22 17 views
9

Tôi tự hỏi, làm cách nào để trình duyệt chờ trước khi nhấp vào liên kết? Mục tiêu của tôi là tôi đang cạo từ một trang web động, nội dung động nhưng tôi quản lý để nhận được id biểu mẫu. Vấn đề duy nhất là nút gửi chỉ được hiển thị sau 2-3 giây. Tuy nhiên, trình điều khiển Firefox của tôi bắt đầu nhấp vào liên kết ngay lập tức khi trang được tải (không phải là phần động).Python Selenium cách chờ trước khi nhấp vào liên kết

Có cách nào để tôi có thể làm cho trình duyệt của mình đợi 2-3 giây cho đến khi nút gửi xuất hiện không? Tôi đã cố gắng sử dụng time.sleep() nhưng nó tạm dừng mọi thứ, nút gửi không xuất hiện trong thời gian time.sleep nhưng xuất hiện sau 2-3 giây khi kết thúc time.sleep.

Trả lời

13

Bạn có thể đặt đợi như sau:

Explicit chờ đợi:

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

Implicit chờ đợi:

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

Bạn có thể sử dụng bất kỳ trên. Cả hai đều hợp lệ.

+1

hoàn hảo, đó là những gì tôi cần, cảm ơn bạn. Chỉ cần làm rõ, chờ đợi rõ ràng sẽ được áp dụng cho phần tử đó chỉ trong khi chờ đợi ngầm sẽ áp dụng cho toàn bộ phiên, tôi có đúng không? – Kiddo

+0

Có bạn là đúng, Tuy nhiên nếu bạn muốn khác biệt chính. giữa chúng, vui lòng tham khảo: http://stackoverflow.com/questions/22656615/what-is-difference-between-implicit-wait-vs-explicit-wait-in-selenium-webdriver –

+1

@HelpingHands: Cả hai lần chờ đợi ở trên bạn đã sử dụng là infact [** 'Explicitwaits' **] (http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp#explicit-waits), chứ không phải [**' Implicit waits' **] (http: //docs.seleniumhq.org/docs/04_webdriver_advanced.jsp#implicit-waits). Vui lòng kiểm tra và chỉnh sửa mã của bạn cho phù hợp. – Subh

1

Bạn cần sử dụng Selenium Waits.

Đặc biệt, element_to_be_clickable điều kiện dự kiến ​​sẽ là những gì phù hợp hơn so với những người khác:

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

nơi driver là dụ webdriver của bạn, 10 là số giây để chờ đợi cho một phần tử. Với thiết lập này, selen sẽ cố định vị trí một phần tử sau mỗi 500 mili giây trong tổng số 10 giây. Nó sẽ ném TimeoutException sau 10 giây còn lại nếu không tìm thấy phần tử.

+4

Tôi đã học được điều gì đó mới mẻ, đó là element_to_be_clickable, cảm ơn – Kiddo

Các vấn đề liên quan