2016-10-12 20 views
5

Tôi có một trang tải nội dung động với ajax và sau đó chuyển hướng sau một khoảng thời gian nhất định (không cố định). Làm thế nào tôi có thể buộc Selenium Webdriver đợi trang chuyển hướng sau đó đi đến một liên kết khác ngay sau đó?Đợi chuyển hướng trang Selenium WebDriver (Python)

import time 
from selenium import webdriver 
from selenium.webdriver.common.keys import Keys 
from selenium.webdriver.chrome.options import Options 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.common.exceptions import TimeoutException 
from selenium.webdriver.support.ui import WebDriverWait 

driver = webdriver.Chrome(); 
driver.get("http://www.website.com/wait.php") 
+1

Nếu bạn biết url mong muốn, bạn có thể sử dụng 'driver.current_url' trong 'while' loop. –

+1

Bạn có thể đợi URL thay đổi với người phục vụ. –

Trả lời

5

Bạn có thể tạo tùy chỉnh Expected Condition to wait cho URL để thay đổi:

from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait 

wait = WebDriverWait(driver, 10) 
wait.until(lambda driver: driver.current_url != "http://www.website.com/wait.php") 

dự kiến ​​Điều kiện cơ bản là một callable- bạn có thể wrap it into a class ghi đè __call__() magic method như được xây dựng trong điều kiện được thực hiện.

+0

Tôi không chắc chắn nên đặt url chuyển hướng thứ hai ở đâu. Bạn có thể cho tôi một ví dụ về cách quấn nó trong một lớp học với các điều kiện được cung cấp không? – 7O07Y7

+0

@ 7O07Y7 trong điều kiện dự kiến ​​này, chúng tôi chỉ đang đợi url hiện tại thay đổi. Nếu bạn muốn thay đổi nó để chờ một url cụ thể hiện tại, bạn có thể sử dụng 'lambda driver: driver.current_url ==" url cụ thể "' .. – alecxe

2

Thực tiễn tốt là "chờ" phần tử duy nhất (cho trang mới) xuất hiện.

Bạn có thể sử dụng mô-đun expected_conditions.

Ví dụ, bạn có thể chờ đợi cho người dùng biểu tượng trên đăng nhập:

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

driver = webdriver.Firefox() 
driver.get('http://yourapp.url') 

timeout = 5 

    try: 
     logo_present = EC.presence_of_element_located((By.ID, 'logo_id')) 
     WebDriverWait(driver, timeout).until(logo_present) 
    except TimeoutException: 
     print "Timed out waiting for page to load" 
0

Có một số ExpectedConditions có thể được sử dụng cùng với ExplicitWait để xử lý trang chuyển hướng:

from selenium.webdriver.support import expected_conditions as EC 
from selenium import webdriver 
from selenium.webdriver.support.ui import WebDriverWait 

driver = webdriver.Chrome() 
wait = WebDriverWait(driver, 10) 
  1. Đợi tiêu đề trang mới với title_is(title_name):

    wait.until(EC.title_is('New page Title')) 
    
  2. Chờ URL hiện tại được thay đổi đến bất kỳ URL khác với url_changes(exact_url):

    wait.until(EC.url_changes('https://current_page.com')) 
    
  3. Chờ điều hướng đến URL chính xác với url_to_be(exact_url):

    wait.until(EC.url_to_be('https://new_page.com')) 
    

Cũng

url_contains(partial_url) có thể được sử dụng để wai t cho URL chứa chuỗi con được chỉ định hoặc url_matches(pattern) - để chờ URL khớp với mẫu regex đã vượt qua hoặc title_contains(substring) - để đợi tiêu đề mới có chứa chuỗi con được chỉ định

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