我在使用页面对象方法调用返回页面上的对象时遇到问题。
以下是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
你能帮帮我吗?
感谢。
答案 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."