HtmlUnitDriver似乎没有加载页面

时间:2013-10-02 14:18:13

标签: java selenium htmlunit-driver

我正在尝试让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时效果非常好。这个问题肯定是由我工作场所的计算机配置造成的,虽然我仍然不知道为什么会这样。

6 个答案:

答案 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。