Tôi đang cố gắng chạy một tập lệnh trong selenium/python yêu cầu đăng nhập ở các điểm khác nhau trước khi phần còn lại của tập lệnh có thể chạy. Có cách nào để tôi nói với tập lệnh tạm dừng và đợi ở màn hình đăng nhập để người dùng nhập thủ công tên người dùng và mật khẩu [có thể là thứ gì đó chờ đợi tiêu đề trang thay đổi trước khi tiếp tục tập lệnh].
Đây là mã của tôi cho đến nay:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.keys import Keys
import unittest, time, re, getpass
driver = webdriver.Firefox[]
driver.get["//www.facebook.com/"]
someVariable = getpass.getpass["Press Enter after You are done logging in"]
driver.find_element_by_xpath['//*[@id="profile_pic_welcome_688052538"]'].click[]
Đã hỏi ngày 4 tháng 6 năm 2013 lúc 20:58Jun 4, 2013 at 20:58
JStewjStewJStew
4173 Huy hiệu vàng7 Huy hiệu bạc19 Huy hiệu đồng3 gold badges7 silver badges19 bronze badges
Sử dụng webdriverwait. Ví dụ: điều này thực hiện tìm kiếm Google và sau đó chờ một yếu tố nhất định có mặt trước khi in kết quả:
import contextlib
import selenium.webdriver as webdriver
import selenium.webdriver.support.ui as ui
with contextlib.closing[webdriver.Firefox[]] as driver:
driver.get['//www.google.com']
wait = ui.WebDriverWait[driver, 10] # timeout after 10 seconds
inputElement = driver.find_element_by_name['q']
inputElement.send_keys['python']
inputElement.submit[]
results = wait.until[lambda driver: driver.find_elements_by_class_name['g']]
for result in results:
print[result.text]
print['-'*80]
wait.until
sẽ trả về kết quả của hàm Lambda hoặc selenium.common.exceptions.TimeoutException
nếu hàm Lambda tiếp tục trả về giá trị Fisey sau 10 giây.
Bạn có thể tìm thấy thêm một chút thông tin về WebDriverWait
trong cuốn sách Selenium.
Đã trả lời ngày 4 tháng 6 năm 2013 lúc 21:11Jun 4, 2013 at 21:11
UnutbuUnutbuunutbu
803K173 Huy hiệu vàng1725 Huy hiệu bạc1626 Huy hiệu đồng173 gold badges1725 silver badges1626 bronze badges
6
from selenium import webdriver
import getpass # < -- IMPORT THIS
def loginUser[]:
# Open your browser, and point it to the login page
someVariable = getpass.getpass["Press Enter after You are done logging in"] #< THIS IS THE SECOND PART
#Here is where you put the rest of the code you want to execute
Sau đó, bất cứ khi nào bạn muốn chạy tập lệnh, bạn nhập
import contextlib
import selenium.webdriver as webdriver
import selenium.webdriver.support.ui as ui
with contextlib.closing[webdriver.Firefox[]] as driver:
driver.get['//www.google.com']
wait = ui.WebDriverWait[driver, 10] # timeout after 10 seconds
inputElement = driver.find_element_by_name['q']
inputElement.send_keys['python']
inputElement.submit[]
results = wait.until[lambda driver: driver.find_elements_by_class_name['g']]
for result in results:
print[result.text]
print['-'*80]
0 và nó làm điều của nóĐiều này hoạt động bởi vì
import contextlib
import selenium.webdriver as webdriver
import selenium.webdriver.support.ui as ui
with contextlib.closing[webdriver.Firefox[]] as driver:
driver.get['//www.google.com']
wait = ui.WebDriverWait[driver, 10] # timeout after 10 seconds
inputElement = driver.find_element_by_name['q']
inputElement.send_keys['python']
inputElement.submit[]
results = wait.until[lambda driver: driver.find_elements_by_class_name['g']]
for result in results:
print[result.text]
print['-'*80]
1 hoạt động chính xác như import contextlib
import selenium.webdriver as webdriver
import selenium.webdriver.support.ui as ui
with contextlib.closing[webdriver.Firefox[]] as driver:
driver.get['//www.google.com']
wait = ui.WebDriverWait[driver, 10] # timeout after 10 seconds
inputElement = driver.find_element_by_name['q']
inputElement.send_keys['python']
inputElement.submit[]
results = wait.until[lambda driver: driver.find_elements_by_class_name['g']]
for result in results:
print[result.text]
print['-'*80]
2, ngoại trừ nó không hiển thị bất kỳ characthers nào [nó để chấp nhận mật khẩu và ghi chú nó cho mọi người nhìn vào màn hình]Vì vậy, những gì xảy ra là trang của bạn tải lên. Sau đó, mọi thứ dừng lại, người dùng của bạn đăng nhập thủ công và sau đó quay lại Python CLI và truy cập vào.
Đã trả lời ngày 4 tháng 6 năm 2013 lúc 21:56Jun 4, 2013 at 21:56
TehtrisHtrisTehTris
3.0891 Huy hiệu vàng20 Huy hiệu bạc33 Huy hiệu đồng1 gold badge20 silver badges33 bronze badges
4
Ngày nay, hầu hết các ứng dụng web đang sử dụng các kỹ thuật AJAX. Khi một trang được tải bởi trình duyệt, 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 làm cho việc định vị các yếu tố khó khăn: nếu một phần tử chưa có trong DOM, hàm định vị sẽ tăng ngoại lệ phần tử. Sử dụng chờ đợi, chúng ta có thể giải quyết vấn đề này. Chờ đợi cung cấp một số sự chậm chạp 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ỳ hoạt động nào khác với phần tử.
Selenium WebDriver cung cấp hai loại chờ đợi - ngầm & rõ ràng. Một sự chờ đợi rõ ràng làm cho WebDriver chờ đợi một điều kiện nhất định xảy ra trước khi tiến hành thực hiện. Một sự chờ đợi ngầm làm cho WebDriver thăm dò DOM trong một khoảng thời gian nhất định khi cố gắng xác định vị trí một phần tử.
Chờ đợi trong Selenium Python là gì?
Chờ đợi ngầm là nói với WebDriver để thăm dò DOM trong một khoảng thời gian nhất định khi cố gắng tìm một yếu tố hoặc phần tử nếu chúng không có sẵn ngay lập tức. Cài đặt mặc định là 0, có nghĩa là bị vô hiệu hóa. Sau khi được đặt, sự chờ đợi ngầm được đặt cho cuộc sống của phiên. Java.
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Firefox[] driver.get["//somedomain/url_that_delays_loading"] try: element = WebDriverWait[driver, 10].until[ EC.presence_of_element_located[[By.ID, "myDynamicElement"]] ] finally: driver.quit[]
Ngày nay, hầu hết các ứng dụng web đang sử dụng các kỹ thuật AJAX. Khi một trang được tải bởi trình duyệt, 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 làm cho việc định vị các yếu tố khó khăn: nếu một phần tử chưa có trong DOM, hàm định vị sẽ tăng ngoại lệ phần tử. Sử dụng chờ đợi, chúng ta có thể giải quyết vấn đề này. Chờ đợi cung cấp một số sự chậm chạp 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ỳ hoạt động nào khác với phần tử.
5.1. Chờ đợi rõ ràng
Chờ đợi rõ ràng là một mã bạn xác định để chờ đợi một điều kiện nhất định xảy ra trước khi tiến hành thêm trong mã. Trường hợp cực đoan của điều này là thời gian.s ngủ [], đặt điều kiện ở một khoảng thời gian chính xác để chờ đợi. Có một số phương thức tiện lợi với điều kiện giúp bạn viết mã sẽ chỉ chờ đợi miễn là yêu cầu. WebDriverWait kết hợp với dự kiến là một cách này có thể được thực hiện.
- Trong mã trên, Selenium sẽ chờ tối đa 10 giây cho một yếu tố phù hợp với các tiêu chí đã cho được tìm thấy. Nếu không có yếu tố nào được tìm thấy trong thời gian đó, thời gian chờ được ném. Theo mặc định, WebDriverWait gọi điều kiện dự kiến cứ sau 500 mili giây cho đến khi nó trở lại thành công. Dự kiến sẽ trả về true [boolean] trong trường hợp thành công hoặc không vô hiệu nếu nó không xác định được một phần tử.
- title_contains
- presence_of_element_located
- visibility_of_element_located
- visibility_of
- presence_of_all_elements_located
- text_to_be_present_in_element
- text_to_be_present_in_element_value
- frame_to_be_available_and_switch_to_it
- invisibility_of_element_located
- element_to_be_clickable
- staleness_of
- element_to_be_selected
- element_located_to_be_selected
- element_selection_state_to_be
- Điều kiện mong đợi
- alert_is_present
from selenium.webdriver.support import expected_conditions as EC wait = WebDriverWait[driver, 10] element = wait.until[EC.element_to_be_clickable[[By.ID, 'someid']]]
Có một số điều kiện phổ biến thường được sử dụng khi tự động hóa các trình duyệt web. Được liệt kê dưới đây là tên của mỗi. Selenium Python Binding cung cấp một số phương thức tiện lợi để bạn không phải tự mình mã hóa một lớp dự kiến hoặc tạo gói tiện ích của riêng bạn cho chúng.
Tiêu đề_is
Element_located_selection_state_to_be
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"]]
Mô -đun dự kiến_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 thức tiện lợi nào trước đó phù hợp với yêu cầu của bạn. Một điều kiện chờ tùy chỉnh có thể được tạo bằng cách sử dụng một lớp với phương thức __call__ trả về sai khi điều kiện không khớp.
Ghi chú
Thư viện bỏ phiếu2
from selenium import webdriver driver = webdriver.Firefox[] driver.implicitly_wait[10] # seconds driver.get["//somedomain/url_that_delays_loading"] myDynamicElement = driver.find_element_by_id["myDynamicElement"]