2017-08-02 13 views
2

SafariDriver for Seleniumは、Webページが読み込まれるのを待っていないようです。あなたがChromeDriver、またはFirefoxDriverでこれを実行した場合、それはその後、結果ページに、「Hello World」のを検索すなわちSelenium SafariDriverはページが読み込まれるのを待っていませんか?

import org.junit.After; 
import org.junit.Before; 
import org.junit.Test; 
import org.openqa.selenium.By; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.chrome.ChromeDriver; 
import org.openqa.selenium.safari.SafariDriver; 

public class SafariTest { 

    private WebDriver driver; 

    @Before 
    public void setUp() throws Exception { 
     driver = new SafariDriver(); 
    } 

    @After 
    public void tearDown() throws Exception { 
     driver.close(); 
    } 

    @Test 
    public void testGoogleSearch() { 
     driver.get("http://duckduckgo.com"); 
     driver.findElement(By.id("search_form_input_homepage")).sendKeys("Hello World"); 
     driver.findElement(By.id("search_button_homepage")).click(); 
     driver.findElement(By.linkText("Images")).click(); 
    } 
} 

、それは、それが必要として機能し、それはイメージ結果になり、次のように私のテストです。

org.openqa.selenium.NoSuchElementException: An element could not be located on the page using the given search parameters. (WARNING: The server did not provide any stacktrace information) 

それはその文を実行する前に、ページがロードされていないため、「イメージ」で見つかりませんでした要素:SafariDriver

、それは失敗します。

この現象は予期しないものですか? Safariの特別なケースが必要ですか?

+0

サファリは、このページの問題の原因となる一部の点では遅くなる可能性があります。一般的に言えば、** [明示的な待ち時間](https://stackoverflow.com/questions/10404160/when-to-use-explicit-wait-vs-implicit-wait-in-selenium-webdriver)**を使用する必要があります。 。または、**明示的な待機**を使用する柔軟性を持たないことに自分自身を固定したい場合は**暗黙の待機をします**、セレンのドキュメントは予期しない待機時間のためそれらを混同しないよう警告します。 – mrfreester

+0

@mrfreesterなぜ明示的な待機が優先されるべきですか? – Roxy

+0

**暗黙の待機**は、使用する場合、テストスイートの最初に1回だけ設定する必要があります。しかし、多くの場合、テストスイートの途中で変更されることが多く、将来のテスト待ち時間や予測が難しい微妙なバグには予期せぬことが起こります。 **暗黙の待機**は、要素が__exist__まで待つだけであり、必ずしもその要素が対話する準備ができているとは限りません。** Explicit waits **を使用すると、**表示**、**クリック可能**、またはその他の必要なものを待っていると明確に言うことができ、テストをより明確かつ安定にします。 – mrfreester

答えて

0

基本的に、ページ上に存在しないものを「クリック」または「送信」しようとすると、セレンが爆発します。
(デフォルトの暗黙的な待機があると確信していますが、わかりません) 基本的に、テストが失敗する前に待機するためのテストの柔軟性を判断するのは、あなた次第です。私はこれが役立つことを願っています

明示的な待機例:

@Test 
public void testGoogleSearch() { 
    driver.get("http://duckduckgo.com"); 
    By searchInputBy = By.id("search_form_input_homepage"); 
    WebDriverWait wait = new WebDriverWait(driver, 10); 
    wait.until(ExpectedConditions.visibilityOfElementLocated(searchInputBy)); 
    driver.findElement(searchInputBy).sendKeys("Hello World"); 
    driver.findElement(By.id("search_button_homepage")).click(); 
    wait = new WebDriverWait(driver, 10); 
    By imagesBy = By.linkText("Images"); 
    wait.until(ExpectedConditions.elementToBeClickable(imagesBy)); 
    driver.findElement(imagesBy).click(); 
} 

暗黙の待機例:

@Test 
public void testGoogleSearch() { 
    driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS) ; 
    driver.get("http://duckduckgo.com"); 
    driver.findElement(By.id("search_form_input_homepage")).sendKeys("Hello World"); 
    driver.findElement(By.id("search_button_homepage")).click(); 
    driver.findElement(By.linkText("Images")).click(); 
} 

また、あなたは無視するように伝えることができますので、あなたの明示的な待機をより細かく制御流暢な待機を使用するオプションを持っていますいくつかの例外はありますが、より冗長です。

流暢な待ち時間を重くするための静的メソッドのライブラリを作成するほうが、読みやすく、バグが発生しにくく、テストを書くことができます。より詳細にまた

FluentWait Javadoc

great answer説明待ちます。

+0

あなたの事例を試しましたか?暗黙の待機はSafariでは機能しません。 Seleniumは各ステップの前にページの読み込みが完了するのを待つため、明示的な待機は必要ありません(また、すべてのブラウザ_except_ Safariでは必要ありません)。 – Roxy

+0

私はちょうど私のコードを見て、私はそれを待っているロケータのパラメータを渡すことを忘れていたことに気づいた。今すぐ働かなければならない。 –

0

根本原因は、コードが検索結果を待つことではありません。 リンクを待つ場合は、ExpectedConditionsと一緒にWebDriverWaitを使用してください。以下の例を参照してください。

@Test 
public void testGoogleSearch() { 
    driver.get("http://duckduckgo.com"); 
    driver.findElement(By.id("search_form_input_homepage")).sendKeys("Hello World"); 
    driver.findElement(By.id("search_button_homepage")).click(); 
    WebDriverWait waiter = new WebDriverWait(driver,20); 
    WebElement imagesLink = waiter.until(ExpectedConditions.elementToBeClickable(By.linkText("Images"))); 
    imagesLink.click(); 
} 
関連する問題