问题
Firefox - 51.0.1 Selenium - 3.0.5 Ubuntu - 16.04 (64bit)
Here is what my code looks like:
profile = Selenium::WebDriver::Firefox::Profile.new
profile['browser.download.dir'] = "/tmp/webdriver-downloads"
profile['browser.download.folderList'] = 2
profile['browser.helperApps.neverAsk.saveToDisk'] = "application/pdf"
profile['pdfjs.disabled'] = true
driver = Selenium::WebDriver.for :firefox, :profile => profile
driver.get "https://s3.amazonaws.com/shopsocially-misc/vfs/vfs_test_sample.csv"
Please run the above code and than you see the popup.
This is the error I get:
Selenium::WebDriver::Error::UnknownError: Failed to decode response from marionette
from /var/lib/gems/2.3.0/gems/selenium-webdriver-3.0.5/lib/selenium/webdriver/remote/response.rb:69:in `assert_ok'
from /var/lib/gems/2.3.0/gems/selenium-webdriver-3.0.5/lib/selenium/webdriver/remote/response.rb:32:in `initialize'
from /var/lib/gems/2.3.0/gems/selenium-webdriver-3.0.5/lib/selenium/webdriver/remote/http/common.rb:85:in `new'
from /var/lib/gems/2.3.0/gems/selenium-webdriver-3.0.5/lib/selenium/webdriver/remote/http/common.rb:85:in `create_response'
from /var/lib/gems/2.3.0/gems/selenium-webdriver-3.0.5/lib/selenium/webdriver/remote/http/default.rb:107:in `request'
from /var/lib/gems/2.3.0/gems/selenium-webdriver-3.0.5/lib/selenium/webdriver/remote/http/common.rb:63:in `call'
from /var/lib/gems/2.3.0/gems/selenium-webdriver-3.0.5/lib/selenium/webdriver/remote/w3c_bridge.rb:640:in `raw_execute'
from /var/lib/gems/2.3.0/gems/selenium-webdriver-3.0.5/lib/selenium/webdriver/remote/w3c_bridge.rb:615:in `execute'
from /var/lib/gems/2.3.0/gems/selenium-webdriver-3.0.5/lib/selenium/webdriver/remote/w3c_bridge.rb:126:in `get'
from /var/lib/gems/2.3.0/gems/selenium-webdriver-3.0.5/lib/selenium/webdriver/common/navigation.rb:32:in `to'
from /var/lib/gems/2.3.0/gems/selenium-webdriver-3.0.5/lib/selenium/webdriver/common/driver.rb:132:in `get'
from (irb):70
from /usr/bin/irb:11:in `<main>'
As far I tried, it seems an issue with the new versions I am using. Please correct me if I am wrong.
回答1:
The MIME type is tripping you up. In your example you have it set to 'application/pdf'. I have downloaded the file with wget to determine the mime type.
wget https://s3.amazonaws.com/shopsocially-misc/vfs/vfs_test_sample.csv
...
Content-Type: application/octet-stream
Length: 200 [application/octet-stream]
...
The content type of application/octet-stream means that the server itself doesn't know what kind of file this could be. Since Selenium is explicitly defining what MIME types it will accept in browser.helperApps.neverAsk.saveToDisk, this is causing your failure.
This profile will help to automate downloading different types of files, including application/octet-stream.
# Create a firefox driver that can be passed to HeadlessBrowser.new
def start_driver
profile = Selenium::WebDriver::Firefox::Profile.new
profile["browser.download.folderList"] = 2 # This allows downloads to be sent to a custom location
profile["browser.download.manager.showWhenStarting"] = false
profile["browser.download.dir"] = `/home/stefan/Downloads` # download to this custom path
# FILES WILL NOT DOWNLOAD UNLESS THEIR MIME TYPE IS INCLUDED IN THIS LIST!
profile["browser.helperApps.neverAsk.saveToDisk"] = accepted_mime_types_for_download
driver = Selenium::WebDriver.for :firefox, :profile => profile
return driver
end
def accepted_mime_types_for_download
[
"application/vnd.ms-exceltext/csv",
"application/csv",
"application/zip",
"text/csv",
"application/x-msexcel",
"application/excel",
"application/x-excel",
"application/vnd.ms-excel",
"image/png",
"image/jpeg",
"text/html",
"text/plain",
"application/msword",
"application/xml",
"application/octet-stream"
].join(",")
end
来源:https://stackoverflow.com/questions/42023320/unable-to-suppress-a-firefox-pop-up-for-a-file-download