我正在尝试让HtmlUnitDriver在我的开发环境中工作。作为初学者,我尝试使用最新的selenium服务器jar从以下页面实现示例: http://code.google.com/p/selenium/wiki/GettingStarted
不幸的是,每当我尝试运行此程序时,我都会遇到以下异常:
Exception in thread "main" org.openqa.selenium.NoSuchElementException: Unable to locate element with name: q
For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html
Build info: version: '2.35.0', revision: 'c916b9d', time: '2013-08-12 15:42:01'
System info: os.name: 'Windows 7', os.arch: 'x86', os.version: '6.1', java.version: '1.6.0_16'
Driver info: driver.version: HtmlUnitDriver
at org.openqa.selenium.htmlunit.HtmlUnitDriver.findElementByName(HtmlUnitDriver.java:853)
at org.openqa.selenium.By$ByName.findElement(By.java:292)
at org.openqa.selenium.htmlunit.HtmlUnitDriver$5.call(HtmlUnitDriver.java:1404)
at org.openqa.selenium.htmlunit.HtmlUnitDriver$5.call(HtmlUnitDriver.java:1)
at org.openqa.selenium.htmlunit.HtmlUnitDriver.implicitlyWaitFor(HtmlUnitDriver.java:1094)
at org.openqa.selenium.htmlunit.HtmlUnitDriver.findElement(HtmlUnitDriver.java:1401)
at org.openqa.selenium.htmlunit.HtmlUnitDriver.findElement(HtmlUnitDriver.java:419)
at Justin.Main.main(Main.java:30)
我已尝试修改我的代码以合并此处实现的修补程序:
HtmlUnitDriver causes problems while getting an url
我在调用driver.getCurrentUrl()
后尝试使用driver.get("http://www.google.com")
获取网页的网址,但返回的字符串为about:blank
。
如果我使用FirefoxDriver运行它,这个例子中的类似代码肯定会有用,但是为了满足要求,我需要我的脚本用selenium运行无头(如果它运行时使用特定的BrowserVersion就可以了,只要它无头)。
非常感谢任何帮助。
更新:
这是我正在尝试运行的代码。我只是想知道我可以使用HtmlUnitDriver来处理像在Google中输入搜索查询这样简单的事情。
package Justin;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.htmlunit.HtmlUnitDriver;
public class Main {
public static void main(final String[] args) {
// Create a new instance of the html unit driver
// Notice that the remainder of the code relies on the interface,
// not the implementation.
final WebDriver driver = new HtmlUnitDriver();
((HtmlUnitDriver)driver).setJavascriptEnabled(true);
// And now use this to visit Google
driver.get("http://www.google.com");
try {
Thread.sleep(30000);
} catch (final InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// Find the text input element by its name
final WebElement element = driver.findElement(By.name("q"));
// Enter something to search for
element.sendKeys("Cheese!");
// Now submit the form. WebDriver will find the form for us from the element
element.submit();
// Check the title of the page
System.out.println("Page title is: " + driver.getTitle());
}
}
更新2:
这个问题非常奇怪。我在家里的计算机上尝试了相同的代码,并且将BrowserVersion设置为Firefox或Internet Explorer时效果非常好。这个问题肯定是由我工作场所的计算机配置造成的,虽然我仍然不知道为什么会这样。
答案 0 :(得分:1)
在给出的示例代码中,它假定存在较旧的Google页面,其中搜索字段的名称为q。
页面不再标记为这种方式 - 尝试将driver.findElement(By.name("q"))
更改为driver.findElement(By.cssSelector("input[id=gbqfq]")
并查看是否可以解决您的问题 - 至少它应该能够在您获得后输入搜索栏页面已加载。
如果您在尝试获取页面后立即致电driver.getCurrentUrl()
,则可能未完全加载,而是返回:空白。
如果这不起作用,我们可以继续进行故障排除 - 很难看到无头浏览器实际发生的情况,因此您可能需要暂时切换到FirefoxDriver以准确显示正在发生的事情。
答案 1 :(得分:1)
我试着试一试:
如果是网络问题,请下载此工具以检查您所连接的端口是否正在使用中: http://technet.microsoft.com/en-us/sysinternals/bb897437.aspx
对于这种情况非常方便。
要进一步调试,请尝试读取源代码。 将此行放在第一个元素选择器之前和页面加载之后。:
System.out.println(driver.getPageSource());
我想知道元素是否存在..
答案 2 :(得分:0)
尝试在Firefox中使用Selenium IDE插件,看看它在执行操作时会刮擦什么。您可以将代码导出到java中,然后尝试运行它。我还会逐步浏览家用和工作计算机上的代码,看看是否存在任何差异。由于DOM有时间完全加载,我看到代码工作(当元素未找到错误时)。此外,尝试实例化和实际的浏览器,以便您可以清楚地看到发生了什么。
此外,验证您在家庭和工作站之间使用的所有软件的版本。
答案 3 :(得分:0)
1)尝试添加
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
之前
final WebElement element = driver.findElement(By.name("q"));
2)或尝试
try {
WebElement element = driver.findElement(By.name("q"));
} catch (Exception e) {
Thread.sleep(1000);
}
答案 4 :(得分:0)
尝试使用
HtmlUnitDriver driver = new HtmlUnitDriver();
您可以通过检查
来检查页面是否已加载String pageTitle = driver.getTitle();
答案 5 :(得分:0)
如果您需要无头硒,并且firefox适用于您的测试,请尝试使用phantomjs webdriver。