为什么 HtmlUnitDriver 找不到 WebElements 但 FirefoxDriver 能够找到相同的 WebElements

ric*_*h25 5 javascript java htmlunit selenium-webdriver htmlunit-driver

我有个问题。

是什么使得 FirefoxDriver 能够找到 WebElements 并在 java 代码中单击它们,但是当使用 HtmlUnitDriver 运行相同的代码时,却找不到相同的 WebElements。此外,当在 HtmlUnit 上运行相同的代码(应用 HtmlUnit 原理)时,找不到 WebElements,实际上代码返回 NullPointerException。有什么特别的原因吗?

Tsc*_*cka 2

如果没有看到你的代码,我可能会猜测这可能是因为你需要启用 JavaScript。

默认情况下,HtmlUnitDriver 中禁用 JavaScript。

如果您查看源构造函数(LICENSE Apache 2.0

https://github.com/SeleniumHQ/htmlunit-driver/blob/master/src/main/java/org/openqa/selenium/htmlunit/HtmlUnitDriver.java#L166

  /**
   * Constructs a new instance, specify JavaScript support
   * and using the {@link BrowserVersion#getDefault() default} BrowserVersion.
   *
   * @param enableJavascript whether to enable JavaScript support or not
   */
  public HtmlUnitDriver(boolean enableJavascript) {
    this(BrowserVersion.getDefault(), enableJavascript);
  }
Run Code Online (Sandbox Code Playgroud)

其他构造函数位于https://github.com/SeleniumHQ/htmlunit-driver/blob/master/src/main/java/org/openqa/selenium/htmlunit/HtmlUnitDriver.java#L143-L158

/**
   * Constructs a new instance with JavaScript disabled,
   * and the {@link BrowserVersion#getDefault() default} BrowserVersion.
   */
  public HtmlUnitDriver() {
    this(BrowserVersion.getDefault(), false);
  }

  /**
   * Constructs a new instance with the specified {@link BrowserVersion}.
   *
   * @param version the browser version to use
   */
  public HtmlUnitDriver(BrowserVersion version) {
    this(version, false);
  }

Run Code Online (Sandbox Code Playgroud)

您会看到,如果未提供变量,它们会提供默认 false。

因此,要在 HtmlUnitDriver 中启用 javascript,您需要在初始化它时提供 true,即您希望 JavaScript 组件在其中处于活动状态。

WebDriver driver = new HtmlUnitDriver(BrowserVersion.FIREFOX_38, true);
Run Code Online (Sandbox Code Playgroud)