nzsquall
nzsquall

Reputation: 405

Method call on page object does not return result

I am having problem to use page object method call to return an object on the page.

Here is my example codes in test_log_in.rb

 ...
    class TestLogIn < Test::Unit::TestCase
    .....
      def test_failed_log_in
        @log_in_page= LogIn.new(@browser)
        @log_in_page.go_to_log_in

        @log_in_page.log_in("174773476","test","aaa111as")

        puts @log_in_page.error_message
        puts @log_in_page.get_error_message
      end

    end

My log in class is defined below:

class LogIn
  include PageObject

  ...
  h3(:error_message, :class => 'no-margin white-text')

  ...

  def log_in (access_number, user_id, password)
    self.access_number = access_number
    self.user_id = user_id
    self.password = password
    log_me_in
    AccountSummary.new(@browser)
  end

 ....
 def get_error_message
    self.error_message
  end
  ....  
end

Why will the following lines returns no output?

    puts @log_in_page.error_message
    puts @log_in_page.get_error_message

Can you please help me?

Thanks.

Upvotes: 0

Views: 151

Answers (1)

Justin Ko
Justin Ko

Reputation: 46836

My guess is that there is a timing issue due to the error message being displayed through javascript. It is likely that the error message element is always in the html of the page, but when login fails, the error message element's style is changed to be something visible.

When a page object (or watir) element returns its text, it only includes the visible text. So if the error message is not yet visible, you get no text.

Try waiting to ensure the element is visible to the user:

def get_error_message
  error_message_element.when_present.text
end

when_present will wait up to 5 seconds for the element to become visible to the user and then return the text.

Update - Multiple h3s:

It looks like the actual problem is that there are multiple h3 elements that have that class. Watir always returns the first match, which in this case is the cookie error heading. Given that it is not being displayed, you get the blank text.

The solution would be to reduce the search scope so that you the first h3 is the one you want. This can be done by only looking in the error message list. I would define the page object as follows. Note that you do not need to specify the class of the h3 element since it is the only h3 element in the list.

class LogIn
  include PageObject

  div(:error_message_list, :id => 'errorMessageList')
  h3(:error_message){ error_message_list_element.h3_element }
end

This will then find the right h3 element:

browser = Watir::Browser.new
browser.goto 'https://www.bnz.co.nz/ib4b/app/login'
browser.button(:text => 'Login').click

page = LogIn.new(browser)
page.error_message
#=> "There were 3 errors on the page."

Upvotes: 2

Related Questions