我可以用 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 下载文件吗?的主要内容,如果未能解决你的问题,请参考以下文章
《selenium2 python 自动化测试实战》(14)——下载文件