使用C#编写的Selenium ChromeDriver在单击后无法下载PDF

3

首先我要说的是,我已经尝试过以下链接的Stack Overflow文章所提供的建议,但都无济于事:

这是我ChromeOptions的内容:

            {
                ChromeOptions chromeOptions = new ChromeOptions();
                chromeOptions.AddUserProfilePreference("download.prompt_for_download", false);
                chromeOptions.AddUserProfilePreference("download.directory_upgrade", true);
                chromeOptions.AddUserProfilePreference("download.default_directory", DOWNLOAD_DIR);
                //chromeOptions.AddUserProfilePreference("disable-popup-blocking", true);
                chromeOptions.AddUserProfilePreference("plugins.plugins_disabled", "Chrome PDF Viewer");
                chromeOptions.AddUserProfilePreference("plugins.always_open_pdf_externally", true); 
                chromeOptions.AddArgument("--no-sandbox");
                _driver = new ChromeDriver(chromeOptions);
            }

你会注意到("disable-popup-blocking", true)这一部分被注释了,这是因为这样做让我看到了下面的内容:

已禁用PDF查看器

然后我又能够下载所需的PDF文件。

和所有以上链接的帖子一样,当我点击PDF链接时,我需要下载它而不是在新窗口中打开它,但由于Selenium对于PDF的限制,我无法成功地点击禁用查看器上的“打开”按钮。Visual Studio会抛出以下异常:

NoSuchElementException

根据评论中的要求,这里是试图与已禁用的PDF查看器进行交互的代码:

_driver.SwitchTo().Window(_driver.WindowHandles[1]);
_driver.FindElement(By.LinkText("Open")).Click();

有没有人对这里发生的事情有任何可能的解决方案或见解?我还是相对新手,希望得到任何建议。

如果有关系的话,我正在尝试下载的PDF是Salesforce Lightning PDF。


请在您的问题中包含代码。 - derloopkat
@derloopkat 我更新了问题,并提供了特定尝试与禁用的PDF查看器交互的代码。 - paris
2个回答

1
更新:我终于找到了解决方案,所以我在这里发布,以防其他人遇到此问题。

这里的问题与点击 PDF 的按钮位于 iFrame 内有关(请参见上面链接的“禁用 PDF 查看器”图像)。所有上述的 ChromeOptions 都是正确的,尝试与禁用的 PDF 查看器交互的代码也是正确的。缺少的是这一行:

_driver.SwitchTo().Frame("pdfFrame");

这行代码将放置在上面列出的两行代码之间,结果是3行代码,看起来像这样:

 _driver.SwitchTo().Window(_driver.WindowHandles[1]);
 _driver.SwitchTo().Frame("pdfFrame");
 _driver.FindElement(By.LinkText("Open")).Click();

在添加此内容后,我可以与“打开”按钮进行交互,并且我的PDF文件无缺地下载到了我想要的目录中。

0

NoSuchElementException 表示您的元素不存在于 DOM 上。

您必须将 By.LinkText("Open") 更改为实际按钮的选择器。


我也尝试了使用 By.Id("open-button"),但没有成功。我感觉问题与PDF查看器和Selenium的兼容性有关,但我不确定。 - paris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接