beginner is here with a simple question.
Using Ruby with Selenium web-driver. Just wanted to make my life easier to make a reusable class that will return me a different webdrivers. Tried the below, but it did not work when I tried to call.
def Sel_drive
def ff_drive
return Selenium::WebDriver.for :firefox
end
def ie_drive
return Selenium::WebDriver.for :ie
end
def chrome_drive
return Selenium::WebDriver.for :chrome
end
def name_of_browser(browser_name)
if browser_name == 'Firefox'
driver = ff_drive
end
elsif browser_name == 'IE'
driver = ie_drive
else
browser_name == 'Chrome'
driver = chrome_drive
end
You can use case to return the correct webdriver.
def Sel_drive(drive_type)
case drive_type
when "firefox"
return Selenium::WebDriver.for :firefox
when "ie"
return Selenium::WebDriver.for :ie
when "chrome"
return Selenium::WebDriver.for :chrome
else
puts "Not a valid driver"
end
end
driver = Sel_drive("firefox")
Related
This is my code:
class LoginTest < MiniTest::Test
def before_all
Selenium::WebDriver::Chrome.driver_path = DRIVER_PATH
options = Selenium::WebDriver::Chrome::Options.new
options.add_argument('--headless')
#driver = Selenium::WebDriver.for :chrome, options: options
end
def test_one
end
def test_two
end
end
I want to call the driver method before all test suites.
Is there a way to run some code once before all suites?
Probably a bit late, and you probably already have find your answer,
but here is the solution
class LoginTest < MiniTest::Test
setup do
Selenium::WebDriver::Chrome.driver_path = DRIVER_PATH
options = Selenium::WebDriver::Chrome::Options.new
options.add_argument('--headless')
#driver = Selenium::WebDriver.for :chrome, options: options
end
def test_one
end
def test_two
end
end
the code present in the function setup will be run before each test
I'm working on integrating allure into my tests but have come across a problem with the first test suite failing and returning a undefined method `find_element' for nil:NilClass error with every test in the suite. The tests run as expected when I'm not using allure and the same thing happens regardless of what suite is run.
I've had a look into it and it seems the before and after hooks in my spec helper aren't being used in the failed tests. Any ideas what could be causing this?
require 'rspec'
require 'selenium-webdriver'
require 'allure-rspec'
require 'nokogiri'
require 'uuid'
require 'pathname'
RSpec.configure do |c|
c.include AllureRSpec::Adaptor
c.expect_with :rspec do |c|
### Enable both should and expect syntax ###
c.syntax = [:should, :expect]
end
c.before(:all) do
#Start the Phantom-js driver before running any headless tests
case ENV['browser']
when 'headless'
## Run in command line before a headless test: phantomjs --webdriver=8001
system('start cmd /k phantomjs --webdriver=8001')
sleep 3
end
end
c.before(:each) do
#Find the browser to the used and set the driver to the appropriate one
case ENV['browser']
when 'chrome'
#driver = Selenium::WebDriver.for :chrome
##driver = Selenium::WebDriver.for(:remote, url: 'http://localhost:5555/wd/hub', desired_capabilities: :chrome)
when 'ie'
#driver = Selenium::WebDriver.for :internet_explorer
##driver = Selenium::WebDriver.for(:remote, url: 'http://localhost:5555/wd/hub', desired_capabilities: :ie)
when 'firefox'
#driver = Selenium::WebDriver.for :firefox
##driver = Selenium::WebDriver.for(:remote, url: 'http://localhost:5555/wd/hub', desired_capabilities: :firefox)
when 'headless'
#driver = Selenium::WebDriver.for :remote, url: 'http://localhost:8001'
end
#Maximize the browser
#driver.manage.window.maximize
#driver.get ENV['base_url']
end
c.after(:each) do |c|
#Takes a screen shot if an exception is thrown and attaches it to the allure XML when running Rake tests
if c.exception != nil
$failure = true
c.attach_file("screenshot", File.new(#driver.save_screenshot(File.join(Dir.pwd, "test_reports/allure/#{UUID.new.generate}.png"))))
end
#driver.quit
end
end
AllureRSpec.configure do |c|
#Outputs the Allure XML
c.output_dir = "test_reports/allure"
end
I get this error on running my feature file.
Unable to pick a platform for the provided browser (RuntimeError)
Help required, please.
Here is the code;
class GooglePage
include PageObject
def self.visitor
visit("http://www.google.com")
end
end
env.rb
require 'selenium-webdriver'
require 'page-object'
require 'rubygems'
require 'page-object/page_factory'
World (PageObject::PageFactory)
#browser = Selenium::WebDriver.for :firefox
Step-Definitions
require_relative 'GooglePage'
Given(/^I am on the Google home page$/) do
visit(GooglePage)
# visit('http://www.google.com')
on(GooglePage).visitor
end
This won't work:
visit(GooglePage)
because you haven't called page_url in GooglePage (ln 4 below)
class GooglePage
include PageObject
page_url "http://www.google.com"
def self.visitor
visit("http://www.google.com")
end
end
Move the line #browser = Selenium::WebDriver.for :firefox to the Before method in hooks.rb
Before do
#browser = Selenium::WebDriver.for :firefox
end
After do
#browser.close
end
what if you make your rake file pass on tags and BROWSER and URL,e.g.
rake my_task BROWSER=chrome URL=http://google.com.au
and hooks will check if the BROWSER is chrome, then will use the specific Webdriver for chrome. But how to pass the URL in the PageObject?
Currently from hooks I have the ff:
when "chrome" then
caps = Selenium::WebDriver::Remote::Capabilities.chrome
caps.version = "40.0.2214.115 m"
caps.native_events = false
caps.javascript_enabled= true
# This is for increasing the default timeout to 180
client = Selenium::WebDriver::Remote::Http::Default.new
client.timeout = 180
browser = Selenium::WebDriver.for :chrome
browser.manage.window.maximize
end
Before do
browser.cookies.clear
#browser = browser
end
After do
unless ENV["BROWSER"].eql? "ie"
browser.close
sleep 2
end
end
Then on my HomePage pageobject I have the ff:
class HomePage
include PageObject
page_url("#{ENV['URL']}")
#opens the url defined in ENV['URL']
def goto_homepage
visit(HomePage)
end
end
Using Watir, the URL got opened, so trying this out in Selenium and it won't work.
After executing script i am getting error "`': uninitialized constant Selenium::Webdriver"
here is my code
require 'rubygems'
require 'selenium-webdriver'
require 'test/unit'
class TC_Login < Test::Unit::TestCase
#driver = Selenium::Webdriver.for :firefox
#driver.get "http:test.com"
def test_01
login()
end
def login()
content
end
Just one minor typo in your code, it's not Selenium::Webdriver, but Selenium::WebDriver with capital D.
require 'selenium-webdriver'
require 'test/unit'
class TC_Login < Test::Unit::TestCase
##driver = Selenium::Webdriver.for :firefox, yours is Webdriver
#driver = Selenium::WebDriver.for :firefox
#driver.get "http:test.com"
end
Try this out :
driver = Selenium::WebDriver.for :firefox
source
Please close the class using End
Main thing is
#driver = Selenium::Webdriver.for :firefox
Try this
#driver = Selenium::WebDriver.for :firefox
WedDriver D sholud be Capital letter
I'm running automation tests with watir-webdriver.
I am not able to pass command line arguments ARGV through test unit, I get an ArgumentError.
require 'rubygems'
require 'watir-webdriver'
require 'test/unit'
ARGV.each do |arg|
if arg.downcase.include? 'chrome'
$browser = 'chrome'
elsif arg.downcase.include? 'firefox'
$browser = 'firefox'
elsif arg.downcase.include? 'ff'
$browser = 'firefox'
elsif arg.downcase.include? 'ie'
$browser = 'ie'
end
end
class TEST_SITE < Test::Unit::TestCase
def setup
if $browser == 'chrome'
$b = Watir::Browser.new :chrome
elsif $browser == 'firefox'
$b = Watir::Browser.new :ff
elsif $browser == 'ie'
$b = Watir::Browser.new :ie
end
end
end
Is there another option or somehow override the test unit class?
Test/Unit seems to have logic around how it is handling the values in ARGV, though not exactly sure what values it is checking for. However, if you make your arguments more parameter like, they get ignored by Test/Unit and your tests should run.
Try running the following from command line (you should not need to change your code):
ruby filename.rb -browser=ff