0

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

这是我在 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

你能帮我么?

谢谢。

4

1 回答 1

2

我的猜测是由于通过javascript显示错误消息而存在时间问题。错误消息元素很可能总是在页面的 html 中,但是当登录失败时,错误消息元素的样式会更改为可见的东西。

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

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

def get_error_message
  error_message_element.when_present.text
end

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

更新- 多个 h3:

看起来实际的问题是有多个具有该类的 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."
于 2013-10-21T21:41:36.937 回答