下载位置 Selenium-webdriver Cucumber Chrome

9
我将使用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

我需要添加什么来更改下载位置呢?
3个回答

16

可以使用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)

您先生,真是位绅士。谢谢您。我已经尝试了许多组合,但我漏掉了“File.expand_path”。 - Tom

0

由于我的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的启发


0

最近我遇到了这个问题,由于我的设置不同,无法使之前的答案起作用。我有以下设置:

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

我曾经四处寻找正确的方法来传递类中的选项,最终通过阅读Capybara模块并进行试错才找到了它。我想我在各个地方读了将近一百篇帖子,但都没有起作用。希望这能帮助那些遇到同样问题的人。


这确实可以工作,但在Rails 6.1中会抛出一个弃用警告(:prefs已被弃用,请使用Selenium::WebDriver::Chrome::Options#add_preference)。不幸的是,我还没有弄清楚如何正确使用Selenium::WebDriver::Chrome::Options#add_preference - Michael Trojanek
对我来说也是一样。我已经尝试了无数种方法来让'#add_preference'起作用,但是没有任何方法适用于我。我真的希望如果他们说这样的话,他们会给出一个例子或者一个链接,指向例子所在的位置。这让我感到非常疯狂,以至于我只能忽略它,直到最终它崩溃了,然后我被迫修复它。 - Beartech
看起来向块屈服是有效的:driven_by :selenium, using: :headless_chrome, screen_size: [1400, 1400] do |driver_options| driver_options.add_preference(:download, prompt_for_download: false) driver_options.add_preference(:download, default_directory: File.join(Rails.root, "tmp", "downloads")) end - Michael Trojanek
所以,我在你的代码中没有遇到错误,它似乎可以工作,但它没有设置下载目录。文件正在下载到我的个人资料中的“下载”目录中。 - Beartech
很有趣。对我来说,它按预期工作(或者像他们说的:“在我的机器上工作”,抱歉我不能提供更多帮助)。 - Michael Trojanek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接