如何让PhantomJSDriver在selenium中工作?

时间:2016-02-12 16:09:29

标签: java selenium selenium-webdriver phantomjs

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

  

[ERROR - 2016-02-12T16:02:47.717Z] WebElementLocator -   _handleLocateCommand - 未找到元素:GAVE UP。搜索停止时间:1455292967683 org.openqa.selenium.NoSuchElementException:错误   消息=> '无法找到包含ID'电子邮件''

的元素

是否有关于如何在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();
}

1 个答案:

答案 0 :(得分:0)

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

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

解决方法是在尝试向其发送密钥之前等待元素准备就绪。 See these examples。 E.g。

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,就不需要等待其他元素了。