18

我用 ruby​​ watir-webdriver 开发了一个爬虫,可以从页面下载一些文件。我的问题是,当我单击下载第二个文件时,Chrome 会在顶部打开一个栏,要求确认我正在从该网站下载多个文件。

一旦被 webdriver 使用,我无法确认下载。有没有办法避免这种确认?我在想是否有任何配置可以避免它,或者是否有扩展来执行此操作,或者即使我可以单击 webdriver 的确认。

谢谢

4

9 回答 9

18

我正在使用 Chrome 49,其他解决方案都不适合我。经过一番研究,我找到了一个可行的解决方案:

ChromeDriver createChromeDriverWithDownloadFolder(String folder) {
    Map<String, Object> chromePrefs = new HashMap<String, Object>();
    chromePrefs.put("profile.default_content_settings.popups", 0);
    chromePrefs.put("download.default_directory", folder);
    chromePrefs.put("profile.content_settings.exceptions.automatic_downloads.*.setting", 1 );
    chromePrefs.put("download.prompt_for_download", false);

    ChromeOptions options = new ChromeOptions();
    options.setExperimentalOption("prefs", chromePrefs);
    DesiredCapabilities cap = DesiredCapabilities.chrome();
    cap.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);
    cap.setCapability(ChromeOptions.CAPABILITY, options);
    return new ChromeDriver(cap);
}

这些设置似乎在不断变化。因此,这是我为我的设置找到正确解决方案的方法:

  1. 打开 Chrome 并转到 chrome://version/ 以查找您的个人资料的路径
  2. Default/Preferences中有一个名为Preferences的 json 文件。打开它并搜索automatic_downloads。就我而言,文件的有趣部分如下所示:

    ...“profile”:{“avatar_bubble_tutorial_shown”:1,“avatar_index”:0,“content_settings”:{“clear_on_exit_migrated”:true,“exceptions”:{“app_banner”:{},“auto_select_certificate”:{}, "automatic_downloads": { "[ .]localhost:63342, ": { "setting": 1 },...

  3. 从中我可以得出正确的设置是chromePrefs.put("profile.content_settings.exceptions.automatic_downloads.*.setting", 1 );

于 2016-04-24T08:59:22.730 回答
11

从 Chrome 56.0.2924.87, February 17, 2017 开始,您需要设置的唯一首选项(但是您为 webdriver 设置它们)是:

'profile.default_content_setting_values.automatic_downloads': 1

给出更新的答案,因为这里的大多数答案都使用过时的偏好或显示其他不必要的偏好。

于 2017-02-14T22:29:15.630 回答
7

对于新的 chrome(版本 46 或更高版本),此选项已更改,现在您的哈希必须如下所示:

prefs = {
    'profile' => {
        'default_content_settings' => {'multiple-automatic-downloads' => 1}, #for chrome version olde ~42
        'default_content_setting_values' => {'automatic_downloads' => 1}, #for chrome newer 46
    }
}

browser = Watir::Browser.new :chrome, options: {prefs: prefs, args: ['--test-type', '--disable-infobars'}
于 2015-10-15T15:13:14.537 回答
3

这是Java的解决方案 - Selenium 实现

我们很难解决这个问题,因为我们想为在单个下载链接上下载 PDF 集的功能添加自动化测试。

Map<String, Object> prefs = new HashMap<String, Object>();
//To Turns off multiple download warning
prefs.put("profile.default_content_settings.popups", 0);
prefs.put( "profile.content_settings.pattern_pairs.*.multiple-automatic-downloads", 1 );
//Turns off download prompt
prefs.put("download.prompt_for_download", false);
ChromeOptions options = new ChromeOptions();
options.setExperimentalOptions("prefs", prefs);
driver =  new ChromeDriver(options);

希望这对某人有帮助。

于 2016-01-19T12:16:47.213 回答
2

似乎对于旧版和新版 chromedriver 版本的解决方案有所不同,这增加了混乱。

铬驱动程序

profile = Selenium::WebDriver::Chrome::Profile.new
profile['download.prompt_for_download'] = false
profile['download.default_directory'] = download_directory

b = Watir::Browser.new :chrome, :profile => profile

chromedriver2

prefs = {
      'profile' => {
          'default_content_settings' => {'multiple-automatic-downloads' => 1},
      }
  }

b = Watir::Browser.new :chrome, :prefs => prefs

今天大多数人可能都在使用chromedriver2版本,这是一个应该可以正常工作的解决方案。它在我的watir脚本中运行良好,因为我没有收到以下消息:“该站点正在尝试下载多个文件。你想允许这个吗? ”不再。

于 2015-03-05T13:24:09.017 回答
1

Java解决方案:

cap = DesiredCapabilities.chrome();
ChromeOptions options = new ChromeOptions();
Map<String, Object> prefs = new HashMap<>();
Map<String, Object> content_setting = new HashMap <>();

content_setting.put("multiple-automatic-downloads",1);

prefs.put("download.prompt_for_download", "false");
prefs.put("profile.default_content_settings", content_setting);

options.setExperimentalOption("prefs", prefs);
cap.setCapability(ChromeOptions.CAPABILITY, options);
于 2015-04-27T16:43:25.970 回答
1

这对我有用:

HashMap<String, Object> chromePrefs = new HashMap<String, Object>();
chromePrefs.put("profile.default_content_settings.popups", 0);
chromePrefs.put("profile.default_content_setting_values.automatic_downloads", 1);
chromePrefs.put("download.prompt_for_download", false);
ChromeOptions options = new ChromeOptions();
options.setExperimentalOption("prefs", chromePrefs);
DesiredCapabilities cap = DesiredCapabilities.chrome();
cap.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);
cap.setCapability(ChromeOptions.CAPABILITY, options);
于 2016-10-25T14:22:24.720 回答
0

此错误/增强功能已在以下 URL 的 chromedriver 页面中提出: http ://code.google.com/p/chromedriver/issues/detail?id=130

错误/增强状态:尚未解决。

于 2013-05-20T05:47:42.830 回答
0

我试图在页面加载客户端使用标记来做到这一点。

<META HTTP-EQUIV="Content-Disposition" CONTENT="inline" />

它似乎有效(此时它正在工作,以压倒一切)。

但是时间会证明一切(可能对未来的 CHROME 没有影响,你知道我的意思)。

有几个网站上发布的可用标题字段列表,我觉得它们非常有用。希望它也能帮助你。

https://www.w3.org/Protocols/HTTP/Issues/content-disposition.txt https://www.iana.org/assignments/cont-disp/cont-disp.xhtml#cont-disp-2

于 2018-01-26T19:04:47.710 回答