看来,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();
}
}
如果您使用ChromeDriver
或FirefoxDriver
运行此功能,它会按预期运行,即搜索" 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特殊情况吗?
答案 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();
}
您还可以选择使用流畅的等待,这样可以让您更好地控制明确的等待,这样您就可以告诉它忽略某些异常,但它们更加冗长。
我认为创建一个静态方法库来完成繁琐的等待是一个更好的可读性,更容易出错的方式来编写测试。
另外,great answer解释会更详细地等待。
答案 1 :(得分:0)
根本原因是您的代码不会等待搜索结果。您可以使用WebDriverWait
和ExpectedConditions
来等待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();
}