Selenium SafariDriver不等待页面加载?

时间:2017-08-02 19:12:23

标签: java selenium safari

看来,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();
    }
}

如果您使用ChromeDriverFirefoxDriver运行此功能,它会按预期运行,即搜索" Hello World",然后在结果页面上,它会转到图像结果。

使用SafariDriver时,它会失败:

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)

无法找到的元素是"图像",因为页面在运行该语句之前尚未加载。

这是预期的行为吗?我应该为Safari特殊情况吗?

2 个答案:

答案 0 :(得分:0)

当你试图点击“硒”时,基本上硒会爆炸。或者' sendKeys'进入/进入页面上尚未存在的东西。
(我确定这是默认的隐含等待,但我不确定它是什么)。 基本上,您需要确定您希望测试在失败之前等待事物的灵活性。我希望这会有所帮助。

显式等待示例:

@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解释会更详细地等待。

答案 1 :(得分:0)

根本原因是您的代码不会等待搜索结果。您可以使用WebDriverWaitExpectedConditions来等待images链接。请参阅下面的示例。

@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();
}