Selenium ChromeDriver:如何触发PDF下载而不是PDF显示?

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

我有一个基于 Selenium 的 ChromeDriver 的测试套件,作为某些测试的一部分,它会触发从服务器下载 PDF。到目前为止,此方法运行良好,但现在出现问题,因为较新的 Chrome 版本希望使用内置 PDF 查看器显示 PDF,而不是将其下载到本地文件。 我发现我可以通过打开 Chrome 的设置(通过 URL“chrome://settings/content/pdfDocuments”)以交互方式更改该行为,然后选择上方的单选按钮“下载 PDF”而不是下方的单选按钮“在 Chrome 中打开 PDF”(默认设置)。 但是,此配置更改仅在我以交互方式启动 Chrome 时应用。当我通过 Selenium Chrome 驱动程序启动 Chrome 时,不会保留(或不应用)此修改后的设置。

通过 Selenium Chrome 驱动程序使用 Chrome 时如何修改该设置?我尝试通过 ChromeDriver 以编程方式进行相同的配置更改,方法是最初调用上述相同的配置 URL,但我无法在配置页面上找到“下载 PDF”单选按钮。该按钮没有特定的类,并且尝试通过 XPath 找到它或包含的文本到目前为止对我来说总是失败。

是否有一些 ChromeDriver Guru 有这方面的经验,或者知道如何在通过 Selenium ChromeDriver 控制 Chrome 时修改 Chrome 的配置?

我使用的是 Chrome 版本 131.0.6778.70(官方版本)(64 位)

Selenium 和 ChromeDriver 版本均为 v4.21.0。

补充: 我尝试使用此代码:

        ...
        ChromeOptions chromeOptions = new ChromeOptions(); 
        chromeOptions.addArguments("profile.default_content_settings.popups", "0"); // disable the popup window
        chromeOptions.addArguments("download.default_directory", "U://Downloads"); // Change default directory for downloads
        chromeOptions.addArguments("download.prompt_for_download", "false");
        chromeOptions.addArguments("download.directory_upgrade", "true");
        chromeOptions.addArguments("plugins.always_open_pdf_externally", "false"); // It will not show PDF directly in chrome 
        driver = new ChromeDriver(chromeOptions);
        ...

...按照“K J”引用的附录中的建议,但这不起作用。 PDF 仍然直接显示在 Chrome 的 PDF 预览中并且下载。

selenium-chromedriver
1个回答
0
投票

对于任何被这个线程绊倒的人:

以下方法解决了这个问题:需要不是通过

chromeOptions.addArguments(<option-name>, <option-value>);
而是通过
HashMap
(此处名为
chromeOptionsMap 
)设置这些选项,其中使用
chromeOptionsMap.put(<option-name>, <option-value>);
添加选项,然后将其添加为使用
chromeOptions.setExperimentalOption("prefs", chromeOptionsMap);
进行论证,即像这样:

    ...
    // Initialize ChromeDriver:
    // found this at "https://medium.com/@akshayshinde7289/how-to-download-pdf-file-in-chrome-using-selenium-6a717ced483b" 
    // to disable the built-in PDF previewer:
    ChromeOptions chromeOptions = new ChromeOptions();
    HashMap<String, Object> chromeOptionsMap = new HashMap<String, Object>();
    chromeOptionsMap.put("download.default_directory", DownloadDirPath);
    chromeOptionsMap.put("plugins.plugins_disabled", new String[] { "Chrome PDF Viewer" });
    chromeOptionsMap.put("plugins.always_open_pdf_externally", true);

    chromeOptions.setExperimentalOption("prefs", chromeOptionsMap);
    driver = new ChromeDriver(chromeOptions);
    ...

最终让我继续前进......

© www.soinside.com 2019 - 2024. All rights reserved.