IllegalStateException:在getTitle()时,无法使用HtmlUnitDriver通过com.gargoylesoftware.htmlunit.UnexpectedPage的名称来查找元素

时间:2018-10-29 10:57:36

标签: java selenium selenium-webdriver headless-browser htmlunit-driver

这是我启动HTMLUnit浏览器并获取标题的基本代码。在运行代码时,我得到的标题为null,后来它抛出以下执行:

使用过的瓶子:

  • htmlunit-driver-2.33.0-jar-with-dependencies.jar
  • selenium-server-standalone-3.14.0.jar

代码试用:

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.htmlunit.HtmlUnitDriver;

public class HtmlUnitDriverTest {

    public static void main(String[] args) throws InterruptedException {

        WebDriver driver = new HtmlUnitDriver();
        Thread.sleep(5000);
        driver.get("https://google.com");
        System.out.println(driver.getTitle());

        driver.findElement(By.name("q")).sendKeys("testing");

    }

}

O / p:

  

线程“ main”中的异常java.lang.IllegalStateException:无法按名称找到com.gargoylesoftware.htmlunit.UnexpectedPage@2e32ccc5的元素

     

在org.openqa.selenium.htmlunit.HtmlUnitDriver.findElementByName(HtmlUnitDriver.java:1285)

1 个答案:

答案 0 :(得分:1)

您需要考虑几个事实:

  • 在调用Thread.sleep(5000);之后立即引入HtmlUnitDriver()实际上是没有意义的。您可以在调用Thread.sleep(5000);之后使用driver.get()。但是,根据最佳实践硬编码的Thread.sleep(n)隐式等待,应将其替换为 WebDriverWait

  • 在这里您可以找到有关Replace implicit wait with explicit wait (selenium webdriver & java)

  • 的详细讨论
  • 您会看到 title null ,因为驱动程序甚至在之前尝试提取 Page Title 。页面标题HTML DOM

  • 中呈现
  • 作为使用 htmlunit-driver-2.33.0-jar-with-dependencies.jar 的解决方案,您需要为 Page引入 WebDriverWait 在提取之前标题 <包含字符序列,您可以使用以下解决方案:

  • 代码块:

    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.htmlunit.HtmlUnitDriver;
    import org.openqa.selenium.support.ui.ExpectedConditions;
    import org.openqa.selenium.support.ui.WebDriverWait;
    
    public class A_HtmlunitDriver_2_33_0 {
    
        public static void main(String[] args) throws InterruptedException {
    
            WebDriver driver = new HtmlUnitDriver();
            driver.get("https://google.com");
            new WebDriverWait(driver, 20).until(ExpectedConditions.titleContains("Go"));
            System.out.println(driver.getTitle());
        }
    }
    
  • 控制台输出:

    Google