页面对象上的方法调用不返回结果

时间:2013-10-20 23:44:38

标签: watir watir-webdriver page-object-gem

我在使用页面对象方法调用返回页面上的对象时遇到问题。

以下是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

我的登录类定义如下:

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

为什么以下行不返回任何输出?

    puts @log_in_page.error_message
    puts @log_in_page.get_error_message

你能帮帮我吗?

感谢。

1 个答案:

答案 0 :(得分:2)

我的猜测是,由于通过javascript显示错误消息,存在计时问题。错误消息元素可能始终位于页面的html中,但是当登录失败时,错误消息元素的样式将更改为可见的内容。

当页面对象(或watir)元素返回其文本时,它仅包含可见文本。因此,如果错误消息尚未显示,则不会显示任何文本。

尝试等待以确保该元素对用户可见:

def get_error_message
  error_message_element.when_present.text
end

when_present将等待最多5秒钟让元素对用户可见,然后返回文本。

更新 - 多个h3s:

看起来实际问题是有多个h3元素具有该类。 Watir总是返回第一个匹配,在这种情况下是cookie错误标题。鉴于它没有显示,你得到空白文本。

解决方案是减少搜索范围,以便第一个h3是你想要的。这可以通过查看错误消息列表来完成。我将如下定义页面对象。请注意,您不需要指定h3元素的类,因为它是列表中唯一的h3元素。

class LogIn
  include PageObject

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

然后会找到正确的h3元素:

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."