无法使用Selenium访问Chrome元素的PDF预览窗口。

问题描述 投票:1回答:1

我的应用程序中有一个打印按钮。这个打印按钮可以在新窗口中打开一个PDF文件。在这个窗口的顶部是打印图标,点击它可以打开Chrome的打印预览窗口,在这里可以选择 "另存为PDF "选项来保存PDF文件。

我想在selenium中测试这个流程。

--- 我点击网页上的打印按钮。这将打开一个新的 Chrome 窗口,里面有 PDF

driver.findElement(By.cssSelector("ID")).click();

--- 我切换到新打开的Chrome窗口

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

我可以在日志中看到,硒确实切换到了新窗口。

--- 我试图让新的Chrome窗口的元素被打开。

driver.findElement(By.cssSelector("viewer-pdf-toolbar"))

这就是问题所在。Selenium无法与这个新打开的窗口交互,也找不到这个元素。当我检查这个新打开的窗口时,我看到了以下DOM结构------。

<body> 
    <viewer-pdf-toolbar id="toolbar"></viewer-pdf-toolbar>
    <div id="sizer" style="width: 735px; height: 1092px;"></div>
    <viewer-password-screen id="password-screen"></viewer-password-screen>
    ...
    ..
    .
</div>

我正在寻找的元素确实存在于DOM结构中,我可以通过Console访问它,但我无法使用Selenium访问它。你可以通过在Chrome浏览器中打开任何PDF文件并检查窗口来查看这个DOM。有什么办法可以解决这个问题吗?

注意:当新窗口加载时,一两秒钟它显示 "打印,请等待",然后PDF加载。不知道这些信息是否与这里的问题相关。

其他信息 -

在调试模式下,在Driver切换到新的PDF窗口后,我评估了--。driver.getCurrentUrl() - 这个URL是预览窗口地址栏中显示的正确URL。这意味着我的驱动程序在正确的窗口上。

但是当我执行 driver.getPageSource - 我得到以下输出

<html>
<head>
</head>
<body style="height: 100%; width: 100%; overflow: hidden; margin:0px; background-color: rgb(82, 86, 89);">
<embed name="XXXXXXD474B71424EC89403FB4FA75CF" style="position:absolute; left: 0; top: 0;" width="100%" height="100%" src="about:blank" type="application/pdf" internalid="XXXXXXD474B71424EC89403FB4FA75CF"></body>
</html>

所以 driver 将其视为页面源,而当我做一个 inspect 在同一个窗口中,我看到的是不同的DOM。为什么会发生这种情况?是 Chrome 浏览器替换了 <embed> 标签与最终的DOM?怎样才能让selenium知道这个变化?

请帮助我

java selenium google-chrome selenium-chromedriver
1个回答
0
投票

诱导 WebDriverWait()并等待 visibilityOfElementLocated()和下面的css选择器。

new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("#toolbar")));

更新:

new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.tagName("body")));
© www.soinside.com 2019 - 2024. All rights reserved.