gpt4 book ai didi

java - 使用 Java + Selenium 关闭(关闭)Chrome 打印预览

转载 作者:行者123 更新时间:2023-12-02 09:45:44 29 4
gpt4 key购买 nike

我的 Selenium 测试看起来像这样:客户选择金融产品,填写一些必要的数据,并在打印预览中显示条款/协议(protocol)文档(根据本地法律的要求)。打印/关闭打印预览对话框后,客户输入更多数据并进一步进行,选择一些选项,最后获得契约(Contract)的另一个打印预览。之后他确认契约(Contract)并完成流程。我针对 Chrome 版本 75 运行测试。

到目前为止我已经尝试过两件事:1. 使用 Selenium 切换到打印预览,通过 DOM 导航到“取消”按钮并单击它。但由于该对话框使用了 Shadow DOM,因此非常丑陋,难以维护,并且在 Chrome 更新后经常崩溃。2.尝试使用awt中的Robot类,它在本地运行时运行良好,但在Selenium网格上运行时失败,因为Chrome窗口没有聚焦并且不接收键盘事件。

处理打印对话框关闭的方法的当前状态:

    public void closePrintPreview() {
WebDriverWait wait = new WebDriverWait(driver, 5);
wait.until(driver -> driver.getWindowHandles().size() > 1);
driver.switchTo().window(driver.getWindowHandles().toArray()[1].toString());

wait.until(d -> {
if (d.getWindowHandles().size() > 1) {
d.switchTo().window(driver.getWindowHandles().toArray()[1].toString());
try {
Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_ESCAPE);
robot.keyRelease(KeyEvent.VK_ESCAPE);
} catch (AWTException e) {
throw new RuntimeException(e);
}
return false;
}
return true;
});

driver.switchTo().window(driver.getWindowHandles().toArray()[0].toString());
}

所以我的问题是,是否有一种更简单的方法可以在打印预览中获取“取消”按钮,或者是否有某种方法可以强制 Chrome 窗口聚焦,以便它可以接收来自 Robot 的关键事件?

最佳答案

这是Python中的解决方案。

您可以更新它以在 java 中工作。

Python:

def cancelPrintPreview():
# get the current time and add 180 seconds to wait for the print preview cancel button
endTime = time.time() + 180
# switch to print preview window
driver.switch_to.window(driver.window_handles[-1])
while True:
try:
# get the cancel button
cancelButton = driver.execute_script(
"return document.querySelector('print-preview-app').shadowRoot.querySelector('#sidebar').shadowRoot.querySelector('print-preview-header#header').shadowRoot.querySelector('paper-button.cancel-button')")
if cancelButton:
# click on cancel
cancelButton.click()
# switch back to main window
driver.switch_to.window(driver.window_handles[0])
return True
except:
pass
time.sleep(1)
if time.time() > endTime:
driver.switch_to.window(driver.window_handles[0])
break

Java:

  public void closePrintPreview() {
String jsCancel = "return document.querySelector('print-preview-app')" +
".shadowRoot.querySelector('#sidebar')" +
".shadowRoot.querySelector('print-preview-header#header')" +
".shadowRoot.querySelector('paper-button.cancel-button')";
WebDriverWait wait = new WebDriverWait(driver, 5);
JavascriptExecutor jse = (JavascriptExecutor) driver;
WebElement cancelButton;

wait.until(driver -> driver.getWindowHandles().size() > 1);
driver.switchTo().window(driver.getWindowHandles().toArray(new String[0])[1]);

while (driver.getWindowHandles().size() > 1) {
driver.switchTo().window(driver.getWindowHandles().toArray(new String[0])[1]);
cancelButton = (WebElement) jse.executeScript(jsCancel);
cancelButton.click();
}

driver.switchTo().window(driver.getWindowHandles().toArray(new String[0])[0]);
}

你可以查看我的回答here有关使用影子根元素的更多信息。

关于java - 使用 Java + Selenium 关闭(关闭)Chrome 打印预览,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56678891/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com