Page Objects in Selenium with Ruby - ruby

I'm familiar with Page Objects in Watir-Webdriver using Ruby, but now i'm trying to define Page Objects in Selenium-Webdriver with Ruby and facing the below issue. Could any one please help.
require "selenium-webdriver"
require "page-object"
Firstname = {id: "firstname"}
#driver = Selenium::WebDriver.for :firefox
#driver.get ("http://www.practiceselenium.com/practice-form.html")
#driver.manage().window.maximize()
#driver.find_element(Firstname).send_keys "User1"
Unable to locate element: {"method":"id","selector":"firstname"} (Selenium::WebDriver::Error::NoSuchElementError)

There is no id: "firstname" attribute on the page you specified. Try name: "firstname" instead:
require "selenium-webdriver"
require "page-object"
Firstname = {name: "firstname"}
#driver = Selenium::WebDriver.for :firefox
#driver.get ("http://www.practiceselenium.com/practice-form.html")
#driver.manage().window.maximize()
#driver.find_element(Firstname).send_keys "User1"
Or in a more object oriented fashion:
require "selenium-webdriver"
require "page-object"
class PraticeForm
include PageObject
page_url "http://www.practiceselenium.com/practice-form.html"
text_field(:firstname, :name => 'firstname')
end
browser = Selenium::WebDriver.for :firefox
my_page_object = PraticeForm.new(browser)
my_page_object.goto
my_page_object.firstname = "User1"

Related

Chrome headless download pdf

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

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

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.

profile.assume_untrusted_certificate_issuer = false not working for me

Using watir-webdriver for automation I'm not able to handle Firefox "Untrusted Connection" . Already tried this:
require 'watir-webdriver'
profile = Selenium::WebDriver::Firefox::Profile.new
profile.assume_untrusted_certificate_issuer = false
browser = Watir::Browser.new(:firefox, :profile => profile)
browser.goto("http://xxx.xxx.xxx.com)
Still got the same result ? Any help would be appreciated...
This worked for me :
#profile=Selenium::WebDriver::Firefox::Profile.from_name "default"
#profile.assume_untrusted_certificate_issuer=false
#profile.secure_ssl = true
browser = Watir::Browser.new :firefox, :profile => #profile
Capabilities help me:
capabilities = Selenium::WebDriver::Remote::Capabilities.firefox(accept_insecure_certs: true)
$driver = Selenium::WebDriver.for :firefox, desired_capabilities: capabilities
geckodriver 0.14.0, Mozilla Firefox 52.0, selenium-webdriver 3.2.1

Remote WebDriver ignore certificate errors for Chrome

How ignore sertificate with Remote WebDriver for Chrome? I try run this code:
#encoding: utf-8
require 'selenium-webdriver'
include Selenium
capabilities = WebDriver::Remote::Capabilities.chrome(:native_events => true)
driver = WebDriver.for(:remote,
:desired_capabilities => capabilities,
:url => "http://192.168.1.44:4444/wd/hub",
:switches => %w[--ignore-certificate-errors]
)
driver.navigate.to "https://trunk.plus1.oemtest.ru/"
puts driver.title
driver.close
And get an error message:
home/igor/.rvm/gems/ruby-1.9.2-p290#selenium/gems/selenium-webdriver-2.12.0/lib/selenium/webdriver/remote/bridge.rb:51:in `initialize': unknown option: {:switches=>["--ignore-certificate-errors"]} (ArgumentError)
The approach described above is not supported by latest chromedriver anymore. According to this doc chromeOptions should be used instead:
caps = Selenium::WebDriver::Remote::Capabilities.chrome("chromeOptions" => {"args" => [ "--ignore-certificate-errors" ]})
driver = Selenium::WebDriver.for :remote, url: 'http://localhost:4444/wd/hub', desired_capabilities: caps
This should do the trick:
caps = Selenium::WebDriver::Remote::Capabilities.chrome
caps['chrome.switches'] = %w[--ignore-certificate-errors]
driver = Selenium::WebDriver.for(:remote, :desired_capabilities => caps)
It seems like now the correct way of requesting insecure certs is setting accept_insecure_certs = true on the Selenium::WebDriver::Remote::Capabilities instance.

Resources