Làm thế nào để bạn viết đợi cho đến khi trong python?

Ngày nay, hầu hết các ứng dụng web đều sử dụng kỹ thuật AJAX. Khi một trang được trình duyệt tải, các phần tử trong trang đó có thể tải ở các khoảng thời gian khác nhau. Điều này gây khó khăn cho việc định vị các phần tử. nếu một phần tử chưa có trong DOM, một hàm định vị sẽ đưa ra một ngoại lệ ElementNotVisibleException. Sử dụng waits, chúng ta có thể giải quyết vấn đề này. Chờ đợi cung cấp một số khoảng thời gian chờ giữa các hành động được thực hiện - chủ yếu là định vị một phần tử hoặc bất kỳ thao tác nào khác với phần tử

Selenium Webdriver cung cấp hai loại chờ đợi - ẩn & rõ ràng. Một sự chờ đợi rõ ràng làm cho WebDriver đợi một điều kiện nhất định xảy ra trước khi tiếp tục thực thi. Một sự chờ đợi ngầm khiến WebDriver thăm dò DOM trong một khoảng thời gian nhất định khi cố gắng định vị một phần tử

5. 1. chờ đợi rõ ràng

Chờ rõ ràng là mã bạn xác định để đợi một điều kiện nhất định xảy ra trước khi tiếp tục trong mã. Trường hợp cực đoan của điều này là thời gian. sleep(), đặt điều kiện thành một khoảng thời gian chính xác để chờ. Có một số phương thức tiện lợi được cung cấp giúp bạn viết mã sẽ chỉ chờ khi được yêu cầu. WebDriverWait kết hợp với ExpectCondition là một cách có thể thực hiện được điều này

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

driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "myDynamicElement"))
    )
finally:
    driver.quit()

Trong đoạn mã trên, Selenium sẽ đợi tối đa 10 giây để tìm thấy phần tử phù hợp với tiêu chí đã cho. Nếu không tìm thấy phần tử nào trong thời gian đó, một TimeoutException sẽ được ném ra. Theo mặc định, cứ sau 500 mili giây, WebDriverwait lại gọi tới điều kiện mong đợi cho đến khi trả về thành công. Dự kiếnCondition sẽ trả về true (Boolean) trong trường hợp thành công hoặc không null nếu không tìm được phần tử

Điều kiện dự kiến

Có một số điều kiện phổ biến thường được sử dụng khi tự động hóa trình duyệt web. Dưới đây là tên của từng. Liên kết Selenium Python cung cấp một số, do đó bạn không phải tự mình viết mã lớpexpected_condition hoặc tạo gói tiện ích của riêng bạn cho chúng

  • title_is
  • title_contains
  • hiện diện_of_element_location
  • visibility_of_element_location
  • khả năng hiển thị
  • hiện diện_of_all_elements_location
  • text_to_be_present_in_element
  • text_to_be_present_in_element_value
  • frame_to_be_available_and_switch_to_it
  • invisibility_of_element_location
  • phần tử_to_be_clickable
  • độ cứng_của
  • phần tử_to_be_đã chọn
  • phần tử_location_to_be_seded
  • phần tử_lựa chọn_trạng thái_to_be
  • phần tử_location_selection_state_to_be
  • cảnh báo_là_hiện tại

from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, 10)
element = wait.until(EC.element_to_be_clickable((By.ID, 'someid')))

Mô-đunexpected_conditions chứa một tập hợp các điều kiện được xác định trước để sử dụng với WebDriverWait

Điều kiện chờ tùy chỉnh

Bạn cũng có thể tạo các điều kiện chờ tùy chỉnh khi không có phương pháp tiện lợi nào trước đây phù hợp với yêu cầu của bạn. Có thể tạo điều kiện chờ tùy chỉnh bằng cách sử dụng lớp có phương thức __call__ trả về Sai khi điều kiện không khớp

class element_has_css_class(object):
  """An expectation for checking that an element has a particular css class.

  locator - used to find the element
  returns the WebElement once it has the particular css class
  """
  def __init__(self, locator, css_class):
    self.locator = locator
    self.css_class = css_class

  def __call__(self, driver):
    element = driver.find_element(*self.locator)   # Finding the referenced element
    if self.css_class in element.get_attribute("class"):
        return element
    else:
        return False

# Wait until an element with id='myNewInput' has class 'myCSSClass'
wait = WebDriverWait(driver, 10)
element = wait.until(element_has_css_class((By.ID, 'myNewInput'), "myCSSClass"))

Ghi chú

bỏ phiếu2 Thư viện

Bạn cũng có thể cân nhắc sử dụng thư viện mà bạn cần cài đặt riêng

5. 2. chờ đợi tiềm ẩn

Chờ đợi ngầm báo cho WebDriver thăm dò DOM trong một khoảng thời gian nhất định khi cố gắng tìm bất kỳ phần tử (hoặc các phần tử) nào không có sẵn ngay lập tức. Cài đặt mặc định là 0 (không). Sau khi được đặt, thời gian chờ ngầm được đặt cho vòng đời của đối tượng WebDriver