Script not working in HtmlUnitDriver

2019-08-14 19:21发布

问题:

My purpose to execute headless browsing for test-automation. I am using selenium webdriver with Java.

Now, issue is script is working fine in Firefox browser,but not in HtmlUnitDriver.

Please guide me where I did mistake.

public class Headless 
{
    public static void main(String[] args) throws InterruptedException
    {
        WebDriver driver = new HtmlUnitDriver();
        //WebDriver driver=new FirefoxDriver();

// Navigate to Google      
        driver.get("https://www.google.co.in/?gfe_rd=cr&ei=k36cVsa6OubI8Aec14bICQ&gws_rd=ssl"); 
        //Thread.sleep(14000);


        WebDriverWait wait=new WebDriverWait(driver,10);
        wait.until(ExpectedConditions.presenceOfElementLocated(By.id("sb_ifc0")));



        System.out.println("URL= "+driver.getCurrentUrl());
        // Locate the searchbox using its name     
        WebElement element = driver.findElement(By.id("sb_ifc0")); 

       // Enter a search query     
       element.sendKeys("Guru99"); 

       // Submit the query. Webdriver searches for the form using the text input element automatically     
       // No need to locate/find the submit button     
       element.submit();           

       // This code will print the page title      
       System.out.println("Page title is: " + driver.getTitle());     

The error in case of HtmlUnitDriver:

    Exception in thread "main" java.lang.NoClassDefFoundError: com/gargoylesoftware/htmlunit/javascript/host/Event
    at org.openqa.selenium.htmlunit.HtmlUnitDriver.resetKeyboardAndMouseState(HtmlUnitDriver.java:513)
    at org.openqa.selenium.htmlunit.HtmlUnitDriver.get(HtmlUnitDriver.java:509)
    at org.openqa.selenium.htmlunit.HtmlUnitDriver.get(HtmlUnitDriver.java:469)
    at org.openqa.selenium.htmlunit.HtmlUnitDriver.<init>(HtmlUnitDriver.java:185)
    at org.openqa.selenium.htmlunit.HtmlUnitDriver.<init>(HtmlUnitDriver.java:195)
    at org.openqa.selenium.htmlunit.HtmlUnitDriver.<init>(HtmlUnitDriver.java:191)
    at com.se.ecoreal.selenium.Headless.main(Headless.java:15)
Caused by: java.lang.ClassNotFoundException: com.gargoylesoftware.htmlunit.javascript.host.Event
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 7 more

回答1:

It doesn't work because javascript is disabled by default for HtmlUnitDriver. Check the default constructor code:

  public HtmlUnitDriver() {
    this(false);
  }
  public HtmlUnitDriver(boolean enableJavascript) {
    this(BrowserVersion.getDefault(), enableJavascript);
  }

Your example works for me if I enable javascript:

 WebDriver driver = new HtmlUnitDriver(BrowserVersion.FIREFOX_38, true);

Edit (answer to the edited question):
NoClassDefFoundError is caused by a missing (or wrong version) dependency. If you are using maven or gradle, check your project for dependency conflicts. If you don't use dependency management, make sure you included all HtmlUnit dependencies.