私はajaxで動的コンテンツをロードし、一定の時間(固定ではない)後にリダイレクトするページを持っています。 Selenium Webdriverにページのリダイレクトを待機させ、直後に別のリンクに移動させるにはどうすればよいですか?
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")
URLを変更するためのカスタムの 待機する期待される条件 を作成できます。
_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")
_
期待される条件は基本的にcallableです クラスにそれをラップする__call__()
マジックを上書きする組み込み条件として実装されているメソッド。
ユニークな(新しいページの)要素が表示されるまで「待つ」ことをお勧めします。
モジュール expected_conditions を使用できます。
たとえば、ログイン時にユーザーのロゴを待つことができます。
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"
ExplicitWait とともに使用してページのリダイレクトを処理できるいくつかの ExpectedConditions があります。
_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)
_
title_is(title_name)
で新しいページのタイトルを待ちます:
_wait.until(EC.title_is('New page Title'))
_
現在のURLが url_changes(exact_url)
で他のURLに変更されるのを待ちます:
_wait.until(EC.url_changes('https://current_page.com'))
_
url_to_be(exact_url)
で正確なURLに移動するのを待ちます:
_wait.until(EC.url_to_be('https://new_page.com'))
_
また
url_contains(partial_url)
は、指定された部分文字列を含むURLを待機するために使用できます url_matches(pattern)
-渡された正規表現パターンに一致するURLを待機するために使用できますまたは title_contains(substring)
-指定された部分文字列を含む新しいタイトルを待つ