下载位置 Selenium-webdriver Cucumber Chrome

Download location Selenium-webdriver Cucumber Chrome

我在 Ruby 中使用 Cucumber。当 运行 通过 Selenium-Webdriver 在 Chrome 中进行测试时,我想将下载位置更改为测试文件夹而不是用户下载文件夹。

我当前的 chrome 驱动程序是这样设置的:

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

我需要在那里添加什么才能更改下载位置?

可以使用download.default_directory首选项设置下载目录:

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)

我最近 运行 遇到了这个问题,由于我的设置不同,我无法得到以前的答案。我有以下设置:

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

一个典型的测试: 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: 'whatever@whatever.com'
    fill_in 'Password', with: 'password'
    click_on 'commit'
    assert_selector 'h1', text: 'Admin Status Board'
  end

我到处寻找在 class 中传递选项的正确方法,最后通过阅读 Capybara 模块并反复试验,偶然发现了它。我想我在不同地方阅读了将近一百篇文章,其中 none 有效。希望这对遇到它的人有所帮助。

由于我的 Chrome 驱动程序设置了选项而不是功能,所以我最终选择了这条路线:

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

灵感来自 this gist