Search code examples
seleniumfirefoxselenium3

Unable to suppress a firefox pop-up for a file download


enter image description hereFirefox - 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.


Solution

  • 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