有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java HtmlUnitDriver似乎未加载页面

我试图让HtmlUnitDriver在我的开发环境中工作。作为初学者,我尝试使用最新的selenium server 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.get("http://www.google.com")之后使用driver.getCurrentUrl()获取页面的URL,但返回的字符串是about:blank

如果我使用FirefoxDriver运行它,这个示例中的类似代码肯定会起作用,但为了满足要求,我需要脚本使用selenium运行headless(如果它使用特定的BrowserVersion运行,只要它是headless就可以了)

任何帮助都将不胜感激

更新:

这就是我现在正在尝试运行的代码。我只是想看到我可以让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:

这个问题很奇怪。我在家里的电脑上也试过同样的代码,它在浏览器设置为Firefox或InternetExplorer时工作得非常好。这个问题肯定是由我工作场所的计算机配置引起的,尽管我仍然不知道为什么会发生这种情况


共 (6) 个答案

  1. # 1 楼答案

    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);  
        }
    
  2. # 2 楼答案

    在给出的示例代码中,它假设存在较旧的Google页面,该页面的搜索字段为name=q

    页面不再以这种方式标记-尝试将driver.findElement(By.name("q"))更改为driver.findElement(By.cssSelector("input[id=gbqfq]"),看看这是否解决了您的问题-至少在加载页面后,它应该能够输入到搜索栏

    如果您在尝试获取页面后立即调用driver.getCurrentUrl(),它可能没有完全加载,而是返回about:blank

    如果这不起作用,我们可以继续进行故障排除-很难看到无头浏览器的实际情况,因此您可能需要暂时切换到FirefoxDriver,以便准确地看到发生的情况

  3. # 3 楼答案

    尝试在Firefox中使用Selenium IDE插件,看看它在执行操作时会刮到什么。您可以将代码导出到java中,然后尝试运行它。我还会逐级检查家庭和工作电脑上的代码,看看是否有任何差异。由于DOM有时间完全加载,我已经看到代码在逐步执行时工作(当发生元素未找到错误时)。此外,尝试实例化和实际的浏览器,以便您可以直观地看到发生了什么

    此外,请验证在家庭和工作站之间使用的所有软件的版本

  4. # 4 楼答案

    如果您需要headless selenium,并且firefox可以配合您的测试,请尝试使用phantomjs webdriver

  5. # 5 楼答案

    试用

    HtmlUnitDriver driver = new HtmlUnitDriver();
    

    您能通过检查来检查页面是否已加载吗

    String pageTitle = driver.getTitle();
    
  6. # 6 楼答案

    我试着试一试:

    如果是网络问题,请下载此工具以检查您连接的端口是否正在使用: http://technet.microsoft.com/en-us/sysinternals/bb897437.aspx

    在这种情况下非常方便

    要进行进一步调试,请尝试读取源代码。 将此行放在第一个元素选择器之前和页面加载之后:

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

    我想知道元素是否在那里