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の特別なケースが必要ですか?
サファリは、このページの問題の原因となる一部の点では遅くなる可能性があります。一般的に言えば、** [明示的な待ち時間](https://stackoverflow.com/questions/10404160/when-to-use-explicit-wait-vs-implicit-wait-in-selenium-webdriver)**を使用する必要があります。 。または、**明示的な待機**を使用する柔軟性を持たないことに自分自身を固定したい場合は**暗黙の待機をします**、セレンのドキュメントは予期しない待機時間のためそれらを混同しないよう警告します。 – mrfreester
@mrfreesterなぜ明示的な待機が優先されるべきですか? – Roxy
**暗黙の待機**は、使用する場合、テストスイートの最初に1回だけ設定する必要があります。しかし、多くの場合、テストスイートの途中で変更されることが多く、将来のテスト待ち時間や予測が難しい微妙なバグには予期せぬことが起こります。 **暗黙の待機**は、要素が__exist__まで待つだけであり、必ずしもその要素が対話する準備ができているとは限りません。** Explicit waits **を使用すると、**表示**、**クリック可能**、またはその他の必要なものを待っていると明確に言うことができ、テストをより明確かつ安定にします。 – mrfreester