我可以用 Selenium 下载文件吗?

Posted

技术标签:

【中文标题】我可以用 Selenium 下载文件吗?【英文标题】:Can I download files with Selenium? 【发布时间】:2021-04-10 22:31:39 【问题描述】:

我已设法在网页上找到正确的元素,并且可以单击它。我看到下载提示出现,询问我是应该打开 pdf,在 Firefox 中打开还是保存。

我的代码如下所示:

my $profile = Selenium::Firefox::Profile->new;
$profile->set_preference(
    "browser.download.dir" => "/Users/john/Downloads",
    "browser.download.folderList" => "1",
    "browser.helperapps.neverAsk.SaveToDisk" => "application/pdf"
);
my $driver = Selenium::Firefox->new(
    'binary' => "/usr/local/bin/geckodriver",
    'firefox_profile' => $profile
);

[...]

$driver->find_child_element($driver->find_element_by_id('secHead_1'), "./a[\@class='phoDirFont']")->click();

我的理解是,如果我设置了正确的首选项,那么该文件将在没有提示的情况下保存。但这并没有发生。我已经使用开发工具对其进行了深入研究,它似乎确实以“application/pdf”作为 mime 类型提供了 pdf 文件。 Firefox 肯定承认它是一个(提供在 Firefox 中打开它,而不仅仅是使用注册的应用程序)。

如果有其他方法(也许通过向提示发送击键),那也是可以接受的。虽然我一直在使用 Firefox(在我的个人生活中试图摆脱 Google 产品),但如果 Chrome 能有所作为,我可以改用它。

查看我的 about:config(使用 Selenium 打开的窗口),似乎已经采用了首选项设置。但是,它仍然会提示输入文件。

【问题讨论】:

a 元素是否有属性target="_blank" 这能回答你的问题吗? Downloading file through Selenium Webdriver in python @PiotrM。不幸的是,a 元素使用了 href="javascript:"。我不使用 WWW::Mechanize 的部分原因。 @HedgeHog 那一个给了我更多尝试设置的偏好,但我似乎和另一个人遇到了同样的麻烦......尽管那些被设置(我能够确认它们来自 about:config),它仍然提示我。 能否提供这个html元素的源代码? 【参考方案1】:

根据https://www.selenium.dev/documentation/en/worst_practices/file_downloads/,selenium 不支持文件下载。

您可以尝试使用 curl,例如:

system("curl -s -o output.pdf -L $URL");

-s 代表静默,-o 代表保存文件的位置,-L 告诉 curl 跟随重定向 如果您需要 cookie,您可以通过以下方式获取它们:

my @cookies = $driver->get_all_cookies();

提取您需要的任何 cookie,然后使用 --cookie 参数将它们传递给 curl,如下所示:

system("curl -s -o output.pdf -L --cookie $cookie_one --cookie $another_cookie $URL");

【讨论】:

这不是一个可访问的网址。某种javascript函数完成下载。

以上是关于我可以用 Selenium 下载文件吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 selenium 和 c# 中等待完成的下载文件

《selenium2 python 自动化测试实战》(14)——下载文件

这可以用 Alamofire 播放视频文件同步下载吗?

selenium+python自动化79-文件下载(SendKeys)

Selenium 使用远程 Web 驱动程序下载文件

selenium+python自动化79-文件下载(SendKeys)转载