我正在尝试使用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已加载,就无需等待其他元素。