Tom
Tom

Reputation: 1105

Download location Selenium-webdriver Cucumber Chrome

I'm using Cucumber with Ruby. When running tests in Chrome via Selenium-Webdriver, I'd like to alter the download location to the test folder instead of the users download folder.

My current chrome driver is set up like so:

Capybara.default_driver = :selenium
 Capybara.register_driver :selenium do |app|
    Capybara::Selenium::Driver.new(app, :browser => :chrome,
      desired_capabilities: {
      'chromeOptions' => {
      'args' => %w{ window-size=1920,1080 }

     }
    }
   )
  end

What would I need to add there to change the download location please?

Upvotes: 10

Views: 3727

Answers (3)

wbharding
wbharding

Reputation: 4573

Since my Chrome driver is set up with options rather than capabilities, I ended up going this route:

Capybara.register_driver :selenium_chrome_headless do |app|
  Capybara::Selenium::Driver.load_selenium
  browser_options = ::Selenium::WebDriver::Chrome::Options.new.tap do |opts|
    opts.args << "--headless"
  end

  browser_options.add_preference(:download, { prompt_for_download: false, default_directory: DOWNLOAD_PATH })
  Capybara::Selenium::Driver.new(app, browser: :chrome, options: browser_options)
end

As inspired by this gist

Upvotes: 1

Beartech
Beartech

Reputation: 6411

I've run into this problem recently and was unable to get the previous answer to work due to my setup being different. I have the following setup:

test_helper.rb

ENV['RAILS_ENV'] = 'test'
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'
require 'minitest/reporters'
MiniTest::Reporters.use!

class ActiveSupport::TestCase
  # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
  fixtures :all

  # Add more helper methods to be used by all tests here...
end

application_system_test_case.rb

require 'test_helper'
require 'capybara/rails'
require 'capybara/poltergeist'
require 'fileutils'
require 'selenium-webdriver'

class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
  #driven_by :poltergeist, options: { js_errors: false } #uncomment if you want to run headless
  self.use_instantiated_fixtures = true
  @downloads = File.expand_path(Rails.root + 'tmp/downloads')
  driven_by :selenium, using: :chrome, screen_size: [1400, 1400], options: {prefs:{
      'download.default_directory' => @downloads,
      'download.prompt_for_download' => false,
      'plugins.plugins_disabled' => ["Chrome PDF Viewer"]
  } }
end

A typical test: admin_page_test.rb

require 'application_system_test_case'
include ApplicationHelper

class AdminPageTest < ApplicationSystemTestCase

  setup do
    visit new_user_session_url
    fill_in 'Email', with: '[email protected]'
    fill_in 'Password', with: 'password'
    click_on 'commit'
    assert_selector 'h1', text: 'Admin Status Board'
  end

I looked everywhere for the correct way to pass the options in the class and finally stumbled on it through reading through the Capybara modules, and trial and error. I think I read almost a hundred posts in various places and none of them worked. Hopefully this helps someone who comes across it.

Upvotes: 0

Florent B.
Florent B.

Reputation: 42518

The download directory can be set with the download.default_directory preference:

require 'capybara'
require 'selenium-webdriver'

Capybara.register_driver :chrome do |app|
  Capybara::Selenium::Driver.new(app,
    :browser => :chrome,
    :desired_capabilities => Selenium::WebDriver::Remote::Capabilities.chrome(
      'chromeOptions' => {
        'args' => [ "--window-size=1920,1080" ],
        'prefs' => {
          'download.default_directory' => File.expand_path("C:\\Download"),
          'download.prompt_for_download' => false,
          'plugins.plugins_disabled' => ["Chrome PDF Viewer"]
        }
      }
    )
  )
end

session = Capybara::Session.new(:chrome)

Upvotes: 17

Related Questions