OldGrantonian
OldGrantonian

Reputation: 607

why pageObject based on Cheezy does not work?

I'm new to ruby (1.9.3)

I have intermediate experience with Selenium WebDriver plus C#. I want to move to Watir-Webdriver.

I'd be grateful to find out why the first block of IRB code works, but the second block simply loads the correct page, then does nothing. The page is active and responds to manual input.

The second block of code is based on the PageObject example here: https://github.com/cheezy/page-object/wiki/Get-me-started-right-now%21

require 'watir-webdriver'
browser = Watir::Browser.start 'http://x.com/'
browser.select_list(:id, "ddlInterestType").select("Deferred")
browser.select_list(:id, "ddlCompanyName").select("XYZ")
browser.button(:value,"Enter Transactions").click

Second block

require 'watir-webdriver'
browser = Watir::Browser.new :firefox
browser.goto "http://x.com/"
deferredPage = DeferredPage.new(browser)
deferredPage.interestType.select = 'Deferred'
deferredPage.company.select = 'XYZ'
deferredPage.enterTransactions
class DeferredPage
  include PageObject
  select_list(:interestType, :id => 'ddlInterestType')
  select_list(:company, :id => 'ddlCompanyName')  
  button(:enterTransactions, :id => 'btnEnterTransactions')
end

Upvotes: 0

Views: 1215

Answers (3)

OldGrantonian
OldGrantonian

Reputation: 607

While googling for info on page objects, I found this page by Alister Scott. :

http://watirmelon.com/2012/06/04/roll-your-own-page-objects/

For an idiot++ such as me, I think I'll use his method until I know more about Watir-Webdriver. Based on @justinko's comment, I'll stick to one API for the present. I tried rolling my own, and it works fine:

require 'watir-webdriver'
browser = Watir::Browser.new :ie

class DeferredPage
  def initialize( browser )
    @browser = browser
  end

  def enterIntType(intType)
    @browser.select_list(:id, "ddlInterestType").select(intType)
  end

  def clickEnter()
    @browser.button(:value,"Enter Transactions").click
  end
end

dp = DeferredPage.new(browser)

browser.goto "http://x.com"

dp.enterIntType( "Deferred" )
dp.clickEnter    

Upvotes: 1

Cheezy
Cheezy

Reputation: 789

Could you please let us know what error you are getting? I suspect the problem you are seeing is related to the way the Ruby interpreter reads the code. It reads the file from top to bottom and you are using the DeferredPage class before it is defined. What would happen if you changed your code to this:

require 'watir-webdriver'
require 'page-object'
browser = Watir::Browser.new :firefox

class DeferredPage 
  include PageObject
  select_list(:interestType, :id => 'ddlInterestType')
  select_list(:company, :id => 'ddlCompanyName')  
  button(:enterTransactions, :id => 'btnEnterTransactions')
end

deferredPage = DeferredPage.new(browser)
deferredPage.navigate_to "http://x.com/"
deferredPage.interestType = 'Deferred'
deferredPage.company = 'XYZ'
deferredPage.enterTransactions

In this case I am declaring the class prior to using it.

Another thing I might suggest is creating a higher level method to perform the data entry. For example, you could change your code to this:

require 'watir-webdriver'
require 'page-object'
browser = Watir::Browser.new :firefox

class DeferredPage 
  include PageObject

  select_list(:interestType, :id => 'ddlInterestType')
  select_list(:company, :id => 'ddlCompanyName')  
  button(:enterTransactions, :id => 'btnEnterTransactions')

  def do_something(interest, company)
    self.interestType = interest
    self.company = company
    enterTransactions
  end
end

deferredPage = DeferredPage.new(browser)
deferredPage.navigate_to "http://x.com/"
deferredPage.do_someting('Deferred', 'XYZ')

This is cleaner - the access to the page is abstracted behind a method that should add some business value.

-Cheezy

Upvotes: 0

Justin Ko
Justin Ko

Reputation: 46846

In your page-object code example, after loading the page, an exception is likely being thrown (which makes it seem like nothing happens). That code should throw an no method exception:

undefined method `select=' for "stuff":String

When you declare a select list there are three methods created:

  • your_select= - this is for setting the select list
  • your_select - this is for getting the select list value
  • your_select_element - this is for getting the page-object gem element

When you do deferredPage.interestType, it returns a string that is the value of the select list. Strings do not have a select= method, which is why you get the exception (and does nothing).

The two selections should be done without the .select:

deferredPage.interestType = 'Deferred'
deferredPage.company = 'XYZ'

As you can see the page-object API is slightly different than the watir API.

Upvotes: 1

Related Questions