【问题标题】:HtmlUnitDriver does not appear to be loading pageHtmlUnitDriver 似乎没有加载页面
【发布时间】:2013-10-08 23:14:38
【问题描述】:

我正在尝试让 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.get("http://www.google.com") 后使用driver.getCurrentUrl() 获取页面的URL,但返回的字符串是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 时它运行良好。这个问题肯定是由我工作场所的计算机配置引起的,尽管我仍然不知道为什么会发生这种情况。

【问题讨论】:

  • 嗨贾斯汀,你能分享你的实际测试课程吗?也许我们错过了什么。
  • 是的。上面的代码是我现在要执行的。我尝试在那里放置一个硬编码的 sleep 以查看它是否会加载页面,但它似乎无法解决问题。
  • 为了学习.. 尤其是新手.. 你应该使用 Chrome 或 Firefox。 HtmlUnit 似乎非常不可预测,此外,您实际上无法看到正在发生的事情。如果您愿意,请查看getting-started-with-selenium。这是一个很好的框架,可以帮助您入门.. 我希望我开始时拥有的东西
  • 我确实使用 HtmlUnit 运行了 this test,而 Firefox.. firefox 工作,但 HtmlUnit 没有。这从根本上困扰着我。我建议现在避免使用 HtmlUnit
  • 出于我的目的,我不需要查看发生了什么。我已经得到了我想在 Firefox 上运行的代码,但是在这方面有一些完全不同的问题超出了这个问题的范围。

标签: java selenium htmlunit-driver


【解决方案1】:

尝试使用

HtmlUnitDriver driver = new HtmlUnitDriver();

可以通过检查来检查页面是否加载

String pageTitle = driver.getTitle();

【讨论】:

    【解决方案2】:

    如果您需要无头 selenium,并且 firefox 可以处理您的测试,请尝试使用 phantomjs webdriver。

    【讨论】:

      【解决方案3】:

      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】:

        我会试试看:

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

        在这种情况下非常方便。

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

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

        我想知道元素是否在那里..

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

          • 有趣的是上面的代码可以和 FirefoxDriver 一起使用。它只是不适用于 HtmlUnitDriver,但我需要能够无头运行这个程序。
          • 为什么,你需要无头?
          • 因为我正在使用 Selenium 从这个网站上抓取信息。它作为后台任务运行,每小时从该网站抓取信息并将信息放入 Excel 电子表格。不幸的是,它正在与某人用于工作的同一工作站上运行。最好不要每隔一小时启动一个 Mozilla Firefox 窗口,以便用户可以完成她的工作。
          【解决方案6】:

          在给出的示例代码中,它假定存在具有 name=q 搜索字段的旧 Google 页面。

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

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

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

          【讨论】:

          • <input id="gbqfq" class="gbqfif" name="q" type="text" /> - name attr 还在
          • 嗨 JPierce。我已经尝试添加您的修改,但我仍然收到 NoSuchElementException。似乎 HtmlUnitDriver 坚持不加载网页。我已经尝试过启用和禁用 javascript。
          • 嗯。谢谢sircapsalot,我完全错过了这个名字属性。
          • 我没有足够的代表来回复 OP.... 但是从编辑的代码中删除 ((HtmlUnitDriver)driver).setJavascriptEnabled(true) 行会导致它为我工作并且不会爆炸成异常。 thread.sleep() 部分也是不必要的,因为我相信 driver.get() 中内置了一个隐式等待。
          • 我尝试删除 ((HtmlUnitDriver)driver).setJavascriptEnabled(true) 行,但似乎我仍然遇到同样的问题。顺便问一下,你的 selenium 构建环境是如何配置的?
          猜你喜欢
          • 1970-01-01
          • 2017-10-15
          • 2021-09-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-30
          • 1970-01-01
          相关资源
          最近更新 更多