可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I developed a crawler with ruby watir-webdriver that downloads some files from a page. My problem is that when I click to download the second file, Chrome opens a bar in the top asking for confirmation that I am downloading multiple files from this website.
Once this is used by webdriver, I cannot confirm the download. Is there anyway to avoid this confirmation? I am thinking if is there any configuration to avoid it or if is there an extension to do this or even if I can click on the confirmation with webdriver.
thanks
回答1:
I'm using Chrome 49 and none of the other solutions worked for me.
After some research I found a working solution:
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);
}
It seems as if these settings are constantly changing. Therefore, here's how I found the right solution for my setup:
- Open Chrome and go to chrome://version/ to find the path of your profile
In Default/Preferences is a json file called Preferences. Open it and search for automatic_downloads.
In my case the interesting part of the file looked like this:
..."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
},...
From that I could derive that the right setting would be chromePrefs.put("profile.content_settings.exceptions.automatic_downloads.*.setting", 1 );
回答2:
for new chrome (version 46 or newer) this options was changed
now your hash must looks like this:
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'}
回答3:
Here is the solution for Java - Selenium implementation
We faced hard time fixing this, as we wanted to add automation test for functionality which downloads set of PDFs on a single download link.
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);
Hope this help to someone.
回答4:
As of Chrome 56.0.2924.87, February 17, 2017, the only preference you need to set (however you set them for your webdriver) is:
'profile.default_content_setting_values.automatic_downloads': 1
Giving an updated answer because most answers here use outdated preferences or show other preferences that are unnecessary.
回答5:
It seems that the solution is different for older and newer chromedriver versions and that is adding to the confusion.
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
Today most people are probably using chromedriver2 version and that is a solution that should work fine. It worked ok in my watir scripts as I am not getting the message: "This site is attempting to download multiple files. Do you want to allow this?" anymore.
回答6:
Java solution:
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);
回答7:
This bug/enhancement has been raised in the chromedriver page at the below URL:
http://code.google.com/p/chromedriver/issues/detail?id=130
Bug/Enhancement Status: Yet to be resolved.
回答8:
this is what worked for me:
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);
回答9:
I have tried to do it on page load client-side using markups.
<META HTTP-EQUIV="Content-Disposition" CONTENT="inline" />
It seems to work (it is working at this moment, in overriding).
But time will tell (might not have effect on future CHROME's, you know what I mean).
There are a list of available header fields published on a couple of sites which I find extremely helpful. Hope it will help you, as well.
https://www.w3.org/Protocols/HTTP/Issues/content-disposition.txt
https://www.iana.org/assignments/cont-disp/cont-disp.xhtml#cont-disp-2