使用ruby/watir/page_对象测试jqueryui自动完成小部件(AJAX)

使用ruby/watir/page_对象测试jqueryui自动完成小部件(AJAX),jquery,ruby,ajax,watir-webdriver,page-object-gem,Jquery,Ruby,Ajax,Watir Webdriver,Page Object Gem,我正在使用jRuby、watir webdriver和Page对象来测试web应用程序 该应用程序有一个jquery自动完成小部件,它在某种延迟后提供来自后端数据库的响应,我不能总是预测这种延迟 我正在尝试投票,只有在所有数据都显示在“自动完成”字段下的“建议”框中后,才会在测试中进行断言 如何使用Page Object或watir进行轮询,以便准确地知道何时从成功的AJAX调用接收到所有数据 -- 我试过使用 @page.wait_until do end 问题是,我找不到任何好东西放在这

我正在使用jRuby、watir webdriver和Page对象来测试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
属性以查看是否有呼叫正在运行。值为零表示没有任何东西在运行

running = @browser.execute_script('return jQuery.active == 0')
页面对象gem有一个用于等待jqueryajax调用的内置方法。它由以下配置:

PageObject.javascript_framework = :jquery
并称之为使用:

wait_for_ajax
虽然这适用于许多jQuery控件,但自动完成的问题是,它通常被配置为在用户输入文本字段和检查自动完成结果之间有一个延迟。如果已配置,则需要等待呼叫开始和结束。如果不检查开始,即使尚未开始,也会显示呼叫已完成

下面是一个使用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')
解决方案-等待列表

我认为一个更好的方法是简单地等待列表元素,即自动完成列表出现。这样,您就不必担心检查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测试


我的意思是您应该创建带有| request:expected respond |的测试对,并测试您的服务器响应。在这种情况下,您根本不需要Watir。

您可以从您试图访问的小部件提供html吗?