Error while executing a method in Ruby using Selenium WebDriver - ruby

I am getting the following error when I execute the below code.
Please let me know the way to execute the method 'startup' in Eclipse.
Error Message:
': undefined local variable or method ***startup***' for PageObjects:Class (NameError) from C:/Technical/RubyTraining/PageObjects.rb:1:in'
Code:
class PageObjects
require 'selenium-webdriver'
require 'page-object'
def startup
#browser = Selenium::WebDriver.for :firefox
#browser.manage.window.maximize
end
startup
end

From the code you have provided, you don't need the class PageObjects (If you have more code, please post them all at once). So you might simply try this:
require 'selenium-webdriver'
# require 'page-object' # You are not using page-object either.
def startup
#browser = Selenium::WebDriver.for :firefox
#browser.manage.window.maximize
end
startup
However, if you want to use this class, you need to call this instance method setup outside your class after initializing the class. Like this:
class PageObjects
require 'selenium-webdriver'
require 'page-object'
def startup
#browser = Selenium::WebDriver.for :firefox
#browser.manage.window.maximize
end
end
PageObjects.new.startup

Related

Using Capybara within a Ruby class

I'm just experimenting a little with Cucumber and Capybara.
I'm writing a class that will perform some user admin for me.
I have the following class:
class UserAdmin
def initialize(data)
#data = data
end
def add_user
require 'rspec/expectations'
require 'capybara/cucumber'
require 'capybara/helpers'
#data.hashes.each do |user_details|
load_user_data(user_details)
fill_in('firstname', with: #first_name)
fill_in('surname', with: #last_name)
fill_in('username', with: #new_username)
fill_in('usernameConfirmation', with: #confirm_new_username)
click_button_add_user
end
end
When I try and create an instance of this class, I get `NoMethodError: undefined method fill_in' for #
I thought by requieing Capybara etc, I could use their methods in my class.
Clearly I'm wrong, could anyone point out where I've gone wrong please?
You should include Capybara::DSL:
require 'capybara/dsl'
class UserAdmin
include Capybara::DSL
Capybara.run_server = false
# ...
end

YAML + Ruby usage

I'm trying to make testcase using Selenium WebDriver and Ruby. I started learning Ruby a few times ago.
I created the testcase:
require "test/unit"
require "selenium-webdriver"
require "yaml"
thing = YAML.load_file('config.yaml')
puts thing.inspect
class Test < Test::Unit::TestCase
def setup
browser = thing('browser')
#driver = Selenium::WebDriver.for browser
#driver.get 'http://google.com'
#driver.manage.delete_all_cookies
end
def teardown
#driver.close
end
def test_page_search
end
end
I decided to use YAML for config file where I will can change and for WebDriver.
config.yaml:
# Set browser (firefox, ie, chrome, opera)
browser: ":firefox"
# Search query
search_query: "ios testing"
But when I'm running the testcase I'm getting the error:
"test_yaml.rb:11:in `setup'"
You have:
browser = thing('browser')
Did you mean:
browser = thing['browser']
If you're trying to access the browser key, that should take care of it.
Thank you!
I resolved the issue:
require "test/unit"
require "selenium-webdriver"
require "yaml"
class Test < Test::Unit::TestCase
def setup
thing = YAML.load_file('config.yaml')
puts thing.inspect
browser = thing['browser'].to_sym
#driver = Selenium::WebDriver.for browser
#driver.get 'http://google.com'
#driver.manage.delete_all_cookies
end
def teardown
# #driver.close
end
def test_page_search
end
end

Ruby Page object Gem - Unable to pick a platform for the provided browser (RuntimeError)

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.

Create a ruby object from a supertype object

I am using the Selenium Webdriver libraries in Ruby. A typical piece of code looks like this:
require 'rubygems'
require 'selenium-webdriver'
driver = Selenium::WebDriver.for :firefox
# driver is an instance of Selenium::WebDriver::Driver
url = 'http://www.google.com/'
wait = Selenium::WebDriver::Wait.new(:timeout => 10)
driver.get(url)
wait.until { driver.title.start_with? "Google" }
I would like to create a subclass of Selenium::WebDriver::Driver called Selenium::WebDriver::Driver::MyClass that will contain some new methods and instance variables.
As the above code illustrates, the way that instances of Selenium::WebDriver::Driver are created is with Selenium::WebDriver.for.
Without wholesale copying of code, how can I create a version of Selenium::WebDriver.for that does the same thing as Selenium::WebDriver.for but creates instances of Selenium::WebDriver::Driver::MyClass?
Why not just override the Selenium::WebDriver.for ? let me show you that my an example
# selenium code
module Selenium
class WebDriver
def self.for
puts "creating oldclass"
end
end
end
# your code
class Selenium::WebDriver
def self.for
puts "creating myclass"
end
end
Selenium::WebDriver.for
output:
creating myclass
Safe alternative is to derive class from Selenium::WebDriver and use that in your code, or to the extreme you can just open Driver class and add your behavior to it.
Check the source code. Selenium::WebDriver.for simply delegate the method call to Selenium::WebDriver::Driver.for.
If you don't have listener attached, you can simple create your own bridge MyClass::Bridge.new and then pass that to Selenium::WebDriver::Driver.new.
If you insist override the for method, here is some code snippet that might help.
module Selenium
module WebDriver
class Driver
class << self
alias_method :old_for, :for
def for(browser, opts = {})
if browser == :myclass
# create your MyClass::Bridge instance and pass that to new()
else
old_for(browser, opts)
end
end
end
end
end
end
If you just want to define some extra methods on your driver, you do not need to override WebDriver.for.
The following worked well for me:
First, in file customdriver.rb
require 'selenium-webdriver'
class CustomDriver < Selenium::WebDriver::Driver
#a custom method..
def click_on (_id)
element = find_element :id => _id
element.click
end
#add other custom methods here
#....
end
Then, in file main.rb
require-relative 'customdriver'
driver = CustomDriver.for :chrome
driver.click_on("buttonID")
Regards,

Nomethoderror on watir webdriver ruby

i am new to Watir. When I run this file in terminal, ruby TestJoinChange.rb, I get NoMethodError
require 'rubygems'
require 'test/unit'
require 'watir-webdriver'
browser = Watir::Browser.new
class TestJoinChange < Test::TestCase
def test_join(logintype,usr,pwd)
# open browser to page
#browser.goto 'http://change.com'
end
end
How do I pass parameter values? Why my function is returning no method error?
"You have defined subroutine now you can pass values when you call that subroutine by making an object of the class."
your code:
require 'rubygems'
require 'test/unit'
require 'watir-webdriver'
browser = Watir::Browser.new
class TestJoinChange < Test::TestCase
def test_join(logintype,usr,pwd)
# open browser to page
#browser.goto 'http://change.com'
end
end
now just create an object for your class:
obj = TestJoinChange.new
# it will create object for your class and now call the subroutine and pass any value in that#
obj.test_join("logintype_value", "user", "password")
Now you can use the values in your class by storing all passed values in to variables.

Resources