ruby 如何指定chromedriver二进制文件的位置

kx7yvsdv  于 2022-11-04  发布在  Ruby
关注(0)|答案(4)|浏览(169)

早些时候我把Chrome二进制文件chromedriver.exe放在了C:/Windows目录下,Watir从那里挑选了它。现在我不得不把我的项目移到另一台机器上,这样我就不能硬编码可执行路径了。我还希望二进制文件和我们的代码一起保存在Git上,而不是让每个测试工程师在新版本发布时手动更新二进制文件。
现在我已经把Chrome二进制文件放在了一个绝对路径上,但是没有找到它。下面是我尝试的方法(hooks.rb):

Before do
    puts "inside hooks in before"
    profile = Selenium::WebDriver::Chrome::Profile.new
    profile['download.prompt_for_download'] = false
    profile['download.default_directory'] = File.join(File.absolute_path('../..', File.dirname(__FILE__)),"browsers/chromedriver.exe")
    @browser = Watir::Browser.new :chrome, :profile => profile
  end

输出为:

inside hooks in before

Selenium::WebDriver::Error::WebDriverError: Unable to find the chromedriver executable. Please download the server from http://chromedriver.storage.googleapis.com/index.html and place it somewhere on your PATH. More info at http://code.google.com/p/selenium/wiki/ChromeDriver.
C:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.44.0/lib/selenium/webdriver/chrome/service.rb:21:in `executable_path'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.44.0/lib/selenium/webdriver/chrome/service.rb:34:in `default_service'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.44.0/lib/selenium/webdriver/chrome/bridge.rb:14:in `initialize'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.44.0/lib/selenium/webdriver/common/driver.rb:37:in `new'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.44.0/lib/selenium/webdriver/common/driver.rb:37:in `for'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.44.0/lib/selenium/webdriver.rb:67:in `for'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/watir-webdriver-0.6.11/lib/watir-webdriver/browser.rb:46:in `initialize'
C:/Users/Admin/watircukepractice/test_puppies/features/support/hooks.rb:11:in `new'
C:/Users/Admin/watircukepractice/test_puppies/features/support/hooks.rb:11:in `Before'

我在Windows 7上,使用Ruby版本1.9.3p551,我指的是教程http://watirwebdriver.com/chrome/
我如何告诉Watir(和Selenium-WebDriver)chromedriver.exe的位置?

hjqgdpho

hjqgdpho1#

解决方案1 - Selenium::Web驱动程序::Chrome.驱动程序路径=

有一个Selenium::WebDriver::Chrome.driver_path=方法可以指定chromedriver二进制:

require 'watir'

# Specify the driver path

chromedriver_path = File.join(File.absolute_path('../..', File.dirname(__FILE__)),"browsers","chromedriver.exe")
Selenium::WebDriver::Chrome.driver_path = chromedriver_path

# Start the browser as normal

b = Watir::Browser.new :chrome
b.goto 'www.google.com'
b.close

解答2 -在浏览器初始化期间指定:driver_path

作为一种选择,你也可以在初始化浏览器时指定驱动程序路径。这是一个更好的选择,因为你不需要有Selenium代码,但是如果你在不同的地方初始化浏览器,这将是重复的。


# Determine the driver path

chromedriver_path = File.join(File.absolute_path('../..', File.dirname(__FILE__)),"browsers","chromedriver.exe")

# Initialize the browser with the driver path

browser = Watir::Browser.new :chrome, driver_path: chromedriver_path

解决方案3 -更新环境['PATH']

当我最初回答这个问题时,不管什么原因,我都无法让上面的解决方案工作。当Selenium-WebDriver在中启动驱动程序时,似乎没有使用设置值。虽然第一个解决方案是推荐的方法,但这是一个替代方法。
另一种选择是通过编程方式将所需的目录添加到路径中,该路径存储在ENV['PATH']中。您可以在Selenium::WebDriver::Platform中通过检查路径中的任何文件夹中是否存在可执行文件来查看二进制文件的位置(从版本2.44.0开始):

def find_binary(*binary_names)
  paths = ENV['PATH'].split(File::PATH_SEPARATOR)
  binary_names.map! { |n| "#{n}.exe" } if windows?

  binary_names.each do |binary_name|
    paths.each do |path|
      exe = File.join(path, binary_name)
      return exe if File.executable?(exe)
    end
  end

  nil
end

要指定包含二进制文件的文件夹,只需更改ENV['PATH'](以附加目录):

require 'watir'

# Determine the directory containing chromedriver.exe

chromedriver_directory = File.join(File.absolute_path('../..', File.dirname(__FILE__)),"browsers")

# Add that directory to the path

ENV['PATH'] = "#{ENV['PATH']}#{File::PATH_SEPARATOR}#{chromedriver_directory}"

# Start the browser as normal

b = Watir::Browser.new :chrome
b.goto 'www.google.com'
b.close
mmvthczy

mmvthczy2#

Selenium webdriver 3.x配置中,更改:

caps = Selenium::WebDriver::Remote::Capabilities.chrome("chromeOptions" => {"binary" => <path to chrome (example: chrome portable)>})
Capybara::Selenium::Driver.new(app, :browser => :chrome, :driver_path => <path to chrome driver>, :desired_capabilities => caps)

**驱动程序路径:**定义chromedriver chromedriver page的路径
**binary:**定义二进制chrome应用chromepage的路径。您可以使用chrome便携版来使用不同版本的chrome。

7gcisfzg

7gcisfzg3#

直接更新您的Selenium driver_path

只需在启动新的Chrome浏览器窗口之前调用此命令即可:

Selenium::WebDriver::Chrome::Service.driver_path = Rails.root.join( "lib", "chromedriver" ).to_s

当然,将路径更改为您的chromedriver所在的位置。
注意:driver_path必须是字符串,所以不要传入FilePath对象。

iyzzxitl

iyzzxitl4#

这对我很有效:

options = Selenium::WebDriver::Chrome::Options.new
Selenium::WebDriver::Chrome::Service.driver_path = '/app/.chromedriver/bin/chromedriver'
chrome_bin_path = ENV.fetch('GOOGLE_CHROME_SHIM', nil)

if chrome_bin_path
  options.binary = chrome_bin_path if chrome_bin_path
  options.add_argument '--no-sandbox'
  options.add_argument '--window-size=1200x600'
  options.add_argument '--headless'
  options.add_argument '--disable-gpu'
end

browser = Watir::Browser.new(:chrome, options:)

相关问题