I'm having some trouble working out how to get Capybara (1.1.1) to autoaccept SSL certificates on Chrome.
This is my current Capybara configuration
Capybara.run_server = false
Capybara.app_host = 'http://some.host.com'
Capybara.default_driver = :selenium
Capybara.register_driver :selenium do |app|
Capybara::Selenium::Driver.new(app, :browser => :chrome)
end
I have read about the -trustAllSSLCertificates flag but I'm not sure how to apply this when running Selenium using Capybara.
This will do it with firefox:
Capybara.register_driver :selenium do |app|
profile = Selenium::WebDriver::Firefox::Profile.new
profile.assume_untrusted_certificate_issuer = false
Capybara::Selenium::Driver.new(app, :profile => profile)
end
Related
I've got a script which downloads a pdf from a site which keeps updating every month and I want to automate this. It works but I cannot get it to work headless and I think it's because it's not handling the downloads correctly. It seems to start the chrome in headless ok and my navigation commands seem to work, but when it goes to download nothing happens.
#!/usr/bin/env ruby
#
require 'capybara'
require 'rb-inotify'
require 'webdrivers/chromedriver'
def initialise
Capybara.register_driver :chrome do |app|
Capybara::Selenium::Driver.new(app, :browser => :chrome, options: chrome_options)
end
#session = Capybara::Session.new(:chrome)
end
# Settings and profile for the Chrome Browser
# NOTE: still cannot get headless working
def chrome_options
opts = Selenium::WebDriver::Chrome::Options.new
opts.add_argument('--headless') unless ENV['UI']
opts.add_argument('--no-sandbox')
opts.add_argument('--disable-gpu')
opts.add_argument('--disable-dev-shm-usage')
opts.add_argument('--window-size=1920,1080')
opts.add_preference(:download,
directory_upgrade: true,
prompt_for_download: false,
default_directory: "~/Downloads")
opts.add_preference(:plugins,
plugins_disabled: ["Chrome PDF Viewer"])
opts.add_preference(:browser, set_download_behavior: { behavior: 'allow' })
opts
end
Update I'm using Chrome version 81.0.4044.113-1
Across different versions of Chrome and selenium-webdriver the settings required to get downloads working have changed/grown. It looks like you're missing one of them.
opts.add_preference('download.default_directory', '~/Downloads')
Another thing you can also do, depending on versions, is
def initialise
Capybara.register_driver :chrome do |app|
Capybara::Selenium::Driver.new(app, :browser => :chrome, options: chrome_options).tap do |driver|
driver.browser.download_path = '~/Downloads'
end
#session = Capybara::Session.new(:chrome)
end
I added some configurations to your code, probably it will work:
#!/usr/bin/env ruby
#
require 'capybara'
require 'rb-inotify'
require 'webdrivers/chromedriver'
def initialise
Capybara.register_driver :chrome do |app|
Capybara::Selenium::Driver.new(app, :browser => :chrome, options: chrome_options)
end
#session = Capybara::Session.new(:chrome)
end
# Settings and profile for the Chrome Browser
# NOTE: still cannot get headless working
def chrome_options
download_directory = "~/Downloads"
opts = Selenium::WebDriver::Chrome::Options.new
opts.add_argument('--headless') unless ENV['UI']
opts.add_argument('--no-sandbox')
opts.add_argument('--disable-gpu')
opts.add_argument('--disable-dev-shm-usage')
opts.add_argument('--window-size=1920,1080')
opts.add_preference(:download,
directory_upgrade: true,
prompt_for_download: false,
default_directory: download_directory)
opts.add_preference(:browser, set_download_behavior: { behavior: 'allow' })
driver = Capybara::Selenium::Driver.new(app, browser: :chrome,
options: options)
bridge = driver.browser.send(:bridge)
path = '/session/:session_id/chromium/send_command'
path[':session_id'] = bridge.session_id
bridge.http.call(:post, path, cmd: 'Page.setDownloadBehavior',
params: {
behavior: 'allow',
downloadPath: download_directory
})
driver
opts.add_preference(:plugins,
always_open_pdf_externally: true)
opts.add_preference(:browser, set_download_behavior: { behavior: 'allow' })
opts
end
I use Selenium::WebDriver::Remote::Capabilities.chrome and chromeOptions with --proxy-server (mitmdump is used like proxy-server). But when I run the code and go to check ip, it's still mine.
args = [
"mitmdump",
"--listen-host", "127.0.0.1",
"--listen-port", #port,
"--mode", "upstream:http://#{proxy.ip}:#{proxy.port}",
"--upstream-auth", #{proxy.login}:#{proxy.password}
]
server = ChildProcess.build(*args)
server.start
raise "Oops" unless server.alive?
Capybara.register_driver :selenium do |app|
caps = Selenium::WebDriver::Remote::Capabilities.chrome(
"chromeOptions" => {
"args" => [
"--headless",
"--proxy-server=http://127.0.0.1:#port",
"--disable-dev-shm-usage",
"--blink-settings=imagesEnabled=true",
"window-size=1440,900",
"--no-sandbox"
]
}
)
Capybara::Selenium::Driver.new(app, browser: :chrome, desired_capabilities: caps)
end
Capybara.javascript_driver = :chrome
Capybara.configure do |config|
config.default_max_wait_time = 20
config.default_driver = :selenium
end
session = Capybara::Session.new(:selenium)
session.visit("https://www.2ip.ru")
The latest Selenium/Chrome combo silently ignores the "chromeOptions" option, the new syntax for that is "goog:chromeOptions" https://github.com/SeleniumHQ/docker-selenium/issues/674
I'm running automated tests using Ruby/Cucumber/Capybara/Chromedriver, but i get an error while running a simple test scenario. I tried to solve problem by updating version of Ruby, Capybara, Cucumber, Chromdriver and Chrome. I need your help. Here is the details:
Try to:
visit 'http://www.google.com'
Getting:
WARNING: The formatter Teamcity::Cucumber::Formatter is using the deprecated formatter API which will be removed in v4.0 of Cucumber.
2018-04-16 14:32:43 WARN Selenium [DEPRECATION] :args or :switches is deprecated. Use Selenium::WebDriver::Chrome::Options#add_argument instead.
Net::ReadTimeout: Net::ReadTimeout
./features/step_definitions/common_steps.rb:46:in `/^testing$/'
Chrome Version:65.0.3325.181
Chrome Driver: 2.37
cucumber: 3.1.0
capybara: 3.0.1
ruby: 2.2.6
When I removed "--disable-extensions" from env.rb file as you see below it works fine..
Capybara::Selenium::Driver.new(app, :browser => :chrome, :switches => %w[--disable-extensions --disable-web-security --start-maximized])
Capybara::Selenium::Driver.new(
app,browser: :chrome,
desired_capabilities: {
'chromeOptions' => {
'useAutomationExtension' => false,
'args' => ['--disable-web-security', '--start-maximized', '--disable-infobars']
}
}
)
client = Selenium::WebDriver::Remote::Http::Default.new
client.read_timeout = 120
Capybara.register_driver :headless_chrome do |app|
capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(
chromeOptions: {args: %w[headless disable-gpu disable-popup-blocking window-size=10_000,1080 log-level=3]}
)
Capybara::Selenium::Driver.new(app,
browser: :chrome,
desired_capabilities: capabilities,
http_client: client)
end
Using Chromium 62.0.3168.0 I have confirmed it uses my socks5 proxy when running chrome directly: ./chrome --headless --remote-debugging-port=9222 --proxy-server=socks5://127.0.0.1:9055 http://bot.whatismyipaddress.com but when I try to run through Capybara I earn an error:
SOCKSError::ServerFailure: general SOCKS server failure
How do I get Capybara to use headless_chrome through my socks proxy?
My chrome Capybara setup that isn't working:
Capybara.default_driver = :headless_chromium
Capybara.register_driver :headless_chromium do |app|
Capybara::Selenium::Driver.new(app, {
browser: :chrome,
desired_capabilities: Selenium::WebDriver::Remote::Capabilities.chrome(
"chromeOptions" => {
'binary' => "#{ENV['HOME']}/chromium/src/out/Default/chrome",
'args' => ["no-sandbox", "disable-gpu", "headless",
"proxy-server=socks5://127.0.0.1:9055"]
}
)
})
end
If I remove the proxy-server arg from the above code, the :headless_chromium driver works but doesnt use the socks proxy.
Here is my Capybara setup for poltergeist that does succesfully use the socks proxy:
Capybara.default_driver = :poltergeist
Capybara.register_driver :poltergeist do |app|
Capybara::Poltergeist::Driver.new(app, {
:phantomjs => Phantomjs.path,
:phantomjs_options => ["--proxy-type=socks5", "--proxy=127.0.0.1:9055"]
})
end
I'm using Selenium-Webdriver with the ChromeDriver installed as well as PhantomJS to automate my test pack. There are some scenarios that I would prefer to run in browser when my pack is running headless. I can tag my scenario as #selenium but when it loads, it opens up in firefox. How do I get it to open up ChromeDriver when using the #selenium tag please?
I have the following in my env.rb file to run in browser:
if ENV['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=1080,720 }
}
}
)
I set chrome=true to run in browser via cmd.
The solution, following on from Dave McNulla's guidance is as follows:
Before ('#tag') do |scenario|
Capybara.default_driver = :selenium
Capybara.register_driver :selenium do |app|
Capybara::Selenium::Driver.new(app,
:browser => :chrome,
desired_capabilities: {
"chromeOptions" => {
"args" => %w{ window-size=1080,720 }
}
}
)
end
end
I've set it to open in Chrome, only because it's default download action doesn't open up a pop up window, it goes directly to the downloads folder which is ideal for my tests.