HTMLUnitDriver 在 Selenium 自动化测试中返回错误,而 ChromeDriver 没有

HTMLUnitDriver returning error in Selenium Automation Testing which ChromeDriver doesn't

目标:使用 headless 选项对登录页面进行 selenium 测试。(最好使用 HTMLUnitDriver)

我正在尝试使用 HTMLUnitDriver 自动登录网站。

当我将键发送到一个元素时,它会抛出一个错误。

HtmlUnitDriver driver = new HtmlUnitDriver();
driver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS);
driver.get("https://bigData/login.jsp");
WebDriverWait usernameWait = new WebDriverWait(driver, 3);
usernameWait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//input[@id=\"username\"]")));
driver.findElement(By.xpath("//input[@id=\"username\"]")).sendKeys("admin");

错误:

Exception in thread "main" org.openqa.selenium.ElementNotInteractableException: You may only interact with visible elements

我对 ChromeDriver 进行了同样的尝试。它工作正常!它没有抛出这个异常。但是我无法使用其中的无头选项。

ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.addArguments("--headless");
WebDriver driver = new ChromeDriver(chromeOptions);

returns,

Exception in thread "main" org.openqa.selenium.TimeoutException: Expected condition failed: waiting for presence of element located by: By.xpath: //input[@id="username"] (tried for 3 second(s) with 500 milliseconds interval)

只有在初始化 chromeDriver 时未定义 chromeOptions 时才能正常工作。

ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.addArguments("--headless");
WebDriver driver = new ChromeDriver();

请指导我这些 scenarios/suggest 可以替代什么?

根据文档,ElementNotInteractableException 是 W3C 异常,它被抛出以指示尽管元素存在于 DOM 树中,但它不在可以交互的状态。

代码你可以试试是:

HtmlUnitDriver driver = new HtmlUnitDriver(BrowserVersion.CHROME ,true);
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
driver.get("https://bigData/login.jsp");
WebDriverWait usernameWait = new WebDriverWait(driver, 30);
usernameWait.until(ExpectedConditions.visibiltyOfElementLocated(By.xpath("//input[@id=\"username\"]")));
usernameWait.until(ExpectedConditions.elementToBeClickable(By.xpath("//input[@id=\"username\"]")));
driver.findElement(By.xpath("//input[@id=\"username\"]")).sendKeys("admin");  

试用此代码并让我知道状态。