我正在使用jRuby, watir-webdriver和Page Object来测试web应用程序。
应用程序有一个jquery自动完成小部件,在某种延迟后提供来自后端数据库的响应,我不能总是预测。
我正在尝试投票并在测试中断言只有在所有数据显示在自动完成字段下的建议框中后才会发生。
如何使用Page Object或watir轮询,以便确切地知道何时从成功的AJAX调用中接收到所有数据?
,
我试过使用
@page.wait_until do
end
问题是,我找不到任何好的东西放在块里。
我猜应该是
@browser.execute_script("some_sort_of_javascript_code_that_returns_a_boolean_when_the_ajax_call_is_done")
显然,我需要帮助找到我需要的特殊javascript或考虑替代方案…
解决方案——jQuery.active
您可以检查jQuery.active
属性,看看是否有一个调用正在运行。值为0表示没有运行。
running = @browser.execute_script('return jQuery.active == 0')
页面对象gem有一个内置的方法来等待jQuery ajax调用。通过以下命令配置:
PageObject.javascript_framework = :jquery
和调用
wait_for_ajax
虽然这适用于许多jQuery控件,但自动完成的问题是,它通常被配置为在用户输入文本字段和检查自动完成结果之间有一个延迟。如果进行了配置,则需要等待调用的开始和结束。如果不检查start,即使调用还没有开始,也会看起来好像已经完成了。
下面是一个使用jQuery UI远程数据库的例子。脚本将在文本字段中输入一个值,等待列表出现,然后选择一个值:require 'watir-webdriver'
require 'page-object'
PageObject.javascript_framework = :jquery
class MyPage
include PageObject
text_field(:birds, :id => 'birds')
def birds_select(value)
# Wait for ajax call to start
wait_until{ !execute_script('return jQuery.active == 0') }
# Wait for ajax call to end
wait_for_ajax
# Select from autocomplete list
list = unordered_list_element(:class => 'ui-menu')
list.link_element(:text => 'Jack Snipe').click
end
end
@browser = Watir::Browser.new
@browser.goto 'http://jqueryui.com/resources/demos/autocomplete/remote.html'
page = MyPage.new(@browser)
page.birds = 'ja'
page.birds_select('Jack Snipe')
解决方案-等待列表
我认为更好的方法是等待list元素出现,它是自动完成列表。这样,您就不必担心检查ajax调用的开始/停止的时间。
您可以使用when_present
方法等待列表。下面是同一页面的工作示例:
require 'watir-webdriver'
require 'page-object'
class MyPage
include PageObject
text_field(:birds, :id => 'birds')
def birds_select(value)
list = unordered_list_element(:class => 'ui-menu')
list.when_present.link_element(:text => 'Jack Snipe').click
end
end
@browser = Watir::Browser.new
@browser.goto 'http://jqueryui.com/resources/demos/autocomplete/remote.html'
page = MyPage.new(@browser)
page.birds = 'ja'
page.birds_select('Jack Snipe')
你要做的是测试jQuery插件,它已经测试过了。您应该假设它可以工作,并专注于测试您的服务器功能,并创建一些单元测试,而不是UI测试。
我的意思是你应该创建测试对|请求:预期响应|和测试你的服务器响应。在这种情况下,您根本不需要Watir。