サーチ…


前書き

新しいSeleniumユーザーにとって最も一般的な障害の1つは、ページが完全に読み込まれるまで待っていることです。ヒューマン・ユーザは、ページが完全にロードされたかどうか、またはまだロードされているかどうかを簡単に知ることができます。しかし、セレンは、一定の時間だけ待っています。したがって、ページ内の要素を待つのに便利な方法が便利なことがよくあります。これをループとsleep()関数で行うことは可能ですが、既にSeleniumに組み込まれているよりクリーンな方法があります。

Pythonでの明示的な待機

ブラウザがダイナミックページ(一般的にAJAXベースのWebアプリケーション)にナビゲートすると、ページ上の要素が読み込まれるまでに時間がかかり、さらにいくつかの要素がいくつかのユーザーアクションに応答して読み込まれます。そのような場合、要素の直接検索が失敗する可能性があります。

# Don't do this: may fail on dynamic page with ElementNotVisibleException
element = driver.find_element_by_name('q') 

最も明らかな解決策は、要素を取得する前に待機を導入するようです:

# Don't do this: inefficient solution for ElementNotVisibleException 
time.sleep(5) # delays for 5 seconds  
element = driver.find_element_by_name('q') 

しかし、このようなソリューションは、ほとんどの場合、要素が1秒後に表示されても(わずか5秒までしか必要としない場合でも)、テストが常に5秒間待機するため、非効率的です。 1つの場所であれば見た目は良くありませんが、通常、各テストでは複数の要素が処理されますが、複数のテストがあり、全体的なテスト期間が増えます。

より良い解決策は、要素が最大5秒間表示されるのを待つことですが、要素が見つかるとすぐに待機状態から戻すことです。 WebDriverWait使用すると、それを行うことができます。

次の例では、www.google.comに移動し、検索バーが読み込まれるまで(最大5秒間)待機してから、「selenium」を検索します。

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By

# Create a new chromedriver instance
driver = webdriver.Chrome()

# Go to www.google.com
driver.get("https://www.google.com")

try:
    # Wait as long as required, or maximum of 5 sec for element to appear
    # If successful, retrieves the element
    element = WebDriverWait(driver,5).until(
         EC.presence_of_element_located((By.NAME, "q")))

    # Type "selenium"
    element.send_keys("selenium")
    
    #Type Enter
    element.send_keys(Keys.ENTER)

except TimeoutException:
    print("Failed to load search bar at www.google.com")
finally:
    driver.quit()

Javaでセレンを待つ

明示的な待機 :特定の条件が発生してからさらに進んでください。

WebDriver driver = new FirefoxDriver();
driver.get("http://google.com");
WebElement myElement = (new WebDriverWait(driver, 10))
  .until(ExpectedConditions.presenceOfElementLocated(By.id("myElement")));

暗黙の待機:要素または要素がすぐに利用できない場合は、その要素を検索しようとするときに一定の時間待機します。

WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("http://google.com");
WebElement myElement = driver.findElement(By.id("myElement"));


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow