我正在尝试使用PhantomJSDriver。以下代码适用于
FirefoxDriver,但不适用于PhantomJSDriver。错误是:


  [错误-2016-02-12T16:02:47.717Z] WebElementLocator-
  _handleLocateCommand-未找到元素:放弃。搜索停止时间:1455292967683 org.openqa.selenium.NoSuchElementException:错误
  消息=>'无法找到ID为'email'的元素''


是否有关于如何在Java中执行此操作的明确指南,或者任何人都可以使该工作登录?我正在努力寻找有关此主题的清晰信息。

我以为该错误与浏览器没有头有关,因此浏览器变得混乱,但是我看到其他人使用了类似的代码,并且对它们有效。

WebDriver driver = new PhantomJSDriver();
try {
    System.out.println("Logging in to Facebook...");

    driver.get("https://www.facebook.com/login");
    System.out.println(driver.getTitle());

    driver.findElement(By.id("email")).sendKeys("USERNAME");
    driver.findElement(By.id("pass")).sendKeys("PASS");
    driver.findElement(By.id("loginbutton")).click();
}
catch (Exception e) {
    e.printStackTrace();
}

最佳答案

这个问题有数百个类似的问题,例如this one。这个问题或多或少地适用于所有浏览器,是导致测试不稳定的主要原因。

基本上,您是在要求驱动程序在页面被请求后几乎立即(在毫秒内),并且几乎可以肯定的是在完成加载或在DOM中创建该Web元素之前找到id="email"

解决方案是等到元素准备好后再尝试向其发送密钥。 See these examples。例如。

System.out.println(driver.getTitle());

WebDriverWait wait = new WebDriverWait(driver, 10);  // 10 secs max wait
wait.until(ExpectedConditions.presenceOfElementLocated( By.id("email") ));

driver.findElement(By.id("email")).sendKeys("USERNAME");


一旦知道DOM已加载,就无需等待其他元素。

10-08 17:26