Cucumber selenium-webdriver Chrome - ruby

I'm running some tests in that I'm downloading a PDF from a webpage. I'm running tests in Chrome and I want the file to go to a folder in my test pack. I have the following block of code in my env file#
if ENV['chrome']
Capybara.default_driver = :selenium
Capybara.register_driver :selenium 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("path/to/download"),
'download.prompt_for_download' => false,
'plugins.plugins_disabled' => ["Chrome PDF Viewer"]
}
}
)
)
end
It clearly states that the prompt for download is false yet a window still appears asking me where I want to save the file once I've chosen to download the pdf.
Have I done something wrong in my block of code?

Ignore that question, I made a mistake my file path, doh!!! I'll leave this question up in case anyone needs a solution like this for their tests.

Related

Problems initialising browser with options using Ruby, Watir, Chrome

I have a few web-scraping scripts that I've been using for a while now that have been working without issue. However because of an update of something somewhere (I think chrome+chromedriver), the the browsers are not loading with the preferences/options I specify.
Current code:
preferences = {
:download => {
:prompt_for_download => false,
:directory_upgrade => true,
:default_directory => 'C:/DownloadFolder/',
}
}
args = ['--disable-infobars']
browser = Watir::Browser.new :chrome, :chrome_options => {:detach => true, :prefs => preferences, :args => args}
The problems I'm noticing are that the '--disable-infobars' and download folder location are not being applied.
ruby version: 2.3.3p222
watir version: 6.16.5
selenium webdriver version: 3.142.3
chrome version: 75.0.3770.100
chromedriver version : 75.0.3770.90
Taken from help I got elsewhere:
options = Selenium::WebDriver::Chrome::Options.new.tap do |o|
o.add_argument('--disable-infobars')
o.add_preference(:download, directory_upgrade: true,
prompt_for_download: false,
default_directory: 'C:\\DownloadFolder\\')
o.add_option(:detach, true)
end
browser = Watir::Browser.new :chrome, options: options
Two things solved the problem. 1 is specifying the options through selenium rather that Watir. The other is no longer being able to use single forward slashes in folder paths.

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?
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)
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: 'whatever#whatever.com'
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.
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

ChromeOptions To Not Prompt For Download When Running RemoteDriver

I'm trying to debug why when running remote webdriver tests on a headless linux host download dialogs are presented in chrome. I believe the chrome version is 45.
Couple of Env Details
Selenium 2.53 (gem)
Selenium 2.53 Server Jar
Chrome Driver 2.21
The framework/Tests are written in Ruby utilizing Capybara for driving web tests. Here is a brief snippet of how the remote driver is initialized.
prefernces = {
:download => {
:prompt_for_download => false,
:default_directory => '/home/john.doe/Downloads/'
}
}
caps = Selenium::WebDriver::Remote::Capabilities.chrome()
caps['chromeOptions'] = {'prefs' => prefernces}
http_client = Selenium::WebDriver::Remote::Http::Default.new
http_client.timeout = 240
options = {
browser: :remote,
url: "http://<server_url>:4444/wd/hub",
desired_capabilities: caps,
http_client: http_client
}
# Returns Remote Driver
Capybara::Selenium::Driver.new(app, options)
I have verified via the hub that the chromeOptions are set, but when a file is downloaded, we're presented with a file dialog prompt.
I've burned the candle looking for a solution to this problem. Thanks for the help and consideration!
try removing the / from the end of the default_directory and also setting directory_upgrade: true. Other than that make sure the browser has permission to write to the selected directory (note also the correct spelling of preferences)
preferences = {
:download => {
:default_directory => '/home/john.doe/Downloads',
:directory_upgrade => true,
:prompt_for_download => false,
}
}
caps = Selenium::WebDriver::Remote::Capabilities.chrome(
'chromeOptions' => {'prefs' => preferences}
)
Here is an example to download a file with Capybara / Selenium / Chrome :
require 'capybara'
require 'selenium-webdriver'
Capybara.register_driver :chrome do |app|
Capybara::Selenium::Driver.new(app,
:url => "http://localhost:4444/wd/hub",
:browser => :chrome,
:desired_capabilities => Selenium::WebDriver::Remote::Capabilities.chrome(
'chromeOptions' => {
'prefs' => {
'download.default_directory' => File.expand_path("C:\\Download"),
'download.directory_upgrade' => true,
'download.prompt_for_download' => false,
'plugins.plugins_disabled' => ["Chrome PDF Viewer"]
}
}
)
)
end
session = Capybara::Session.new(:chrome)
session.visit "https://www.mozilla.org/en-US/foundation/documents"
session.click_link "IRS Form 872-C"
sleep 20

Selenium Tag Ruby Cucumber

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.

Block images with chromium watir-webdriver

I'm trying crawl along some pages with watir-webdriver and chromium. I haven't got any success by googling arround so here is my question:
I don't need any images so, to speed up things, I try to disable image loading.
Using firefox as my browser is relatively straigtforward
profile = Selenium::WebDriver::Firefox::Profile.new
profile['network.image.imageBehavior'] = 2
browser = Watir::Browser.new :firefox, :profile => profile
But I haven't had any success with chromium. As far as I've learned, you can set preferences and pass commandline options this way (an example):
prefs = {
:download => {
:prompt_for_download => false,
:default_directory => '/tmp'
},
}
args = ['--start-maximized', '--incognito']
browser = Watir::Browser.new :chrome, :prefs => prefs, :args => args,
That works ok. The problem is that, AFAIK, there are no commandline options nor preferences to block images in chromium.
Any idea?
My setup:
LinuxMint 16 (32.0.1700.107-0ubuntu0.13.10.1~20140204.972.1)
ruby 2.0.0p353 (2013-11-22 revision 43784) [x86_64-linux]
watir-webdriver v0.6.8
chromedriver v2.9.248304
chromium-browser 32.0.1700.107 Built on Ubuntu 13.10
I've managed to disable image loading and many more things through a proxy, being any the choosen browser driver.
I used a local proxy called privoxy in my case.
prefs = {
:profile => {
:managed_default_content_settings => {
:images => 2
}
}
}
b = Watir::Browser.new :chrome, :prefs => prefs

Resources