等待使用JS / AJAX和新页面加载的watir-webdriver失败的方法(在缓存中找不到错误)

时间:2011-08-11 20:54:46

标签: cucumber watir watir-webdriver

我正在测试一个建立在Magento店面上的内部网站。在结帐过程中,表单的某些部分将被隐藏(样式:无),直到填写上一部分。这些部分通常会破坏脚本,但是对隐藏表单的第一个元素使用when_present解决了这个问题。

但是,提交订单按钮对这些相同的方法效果不佳。我今天与我们的首席开发人员合作,验证此按钮与之前的表单按钮之间的唯一区别是加载了新页面(新的URL,浏览器中的新“完成”状态)。

要清楚:

  1. 用户输入姓名,地址,电子邮件并点击“继续”=>当“常规”面板滑动关闭并且“运输方法”面板展开时,JS“加载”动画旋转,所有这些都在同一页面上。
  2. 用户点击“提交订单”=> JS“加载”动画旋转,完成后,浏览器进入/ success /(新页面),并带有可验证的元素。
  3. 如果有足够的时间来完成(睡眠声明),测试确实通过了。
  4. 以下是表单的有些伪代码,以及提交点击:

    def complete_form(data = {})
      data = DEFAULT_DATA.merge (data)
      select_guest
      continue_button.click  #proceed to billing panel
      enter_billing_and_shipping_info(data)
      enter_additional_information(data)
    
      place_order_button.when_present.click  #submit form
      #sleep 2  #this succeeds, but is undesirable
      thank_you_message.wait_until_present #I do not actually appear to wait until anything is present
    end #
    
    def enter_billing_and_shipping_info(data)
      billing_first_name.when_present.value = data['First Name'] #I work!
      billing_last_name.value = data['Last Name']
      #more fields
    end #
    

    从步骤:

    thank_you_message.should include("Yippee")
    

    脚本以两种不同的方式失败,具体取决于网站响应的速度:

    1. 失败并显示未找到预期的Thank You消息的消息 - 在错误期间拍摄的屏幕截图显示Checkout页面,而不是感谢页面,显示“loading”动画。 (预计“结帐”包括“您的订单已收到”)
    2. 失败并显示“未在缓存中找到元素”错误 - 此案例中的屏幕截图显示感谢页面,其中包含我们正在寻找的文字
    3. 其他方法如Watir :: Wait.until或直到{},都会导致相同的行为。

      • Windows 7 64位& Windows XP 32位
      • ruby​​ 1.9.2p290(2011-07-09)[i386-mingw32]
      • 黄瓜(1.0.2)
      • rspec(1.3.2)
      • watir-webdriver(0.3.0)

      更新8-15 尝试解决方案#1:

        place_order_button.when_present.click  #complete form
        ajax_submit_image.wait_while_present
      

      相同的最终结果 - 脚本终止但未找到成功消息,屏幕截图显示了旋转中间的Ajax加载图像。这和前一种方法都应该有效,但似乎没有效果。我确实可以使用脚本中的定位器(img src match)来访问图像。

2 个答案:

答案 0 :(得分:2)

您是否考虑使用“加载动画”(可能只是动画gif或类似动画)来了解您应该继续等待?

我在我的一些脚本中使用了这种方法,其中动画只是一个简单的图形文件,客户端javascript使其可见或不可见。所以我的等待循环包括一个短暂的睡眠,并检查动画是否仍然存在,一旦它消失就退出。

答案 1 :(得分:1)

值得考虑的一个选项是在应用程序本身中请求标志的可测试性功能,以便让您知道异步进程是否正在运行。在我测试的一个AJAX密集的Web应用程序中,每当XRH或计时器启动时,我们在body标签上设置一个属性,如AjaxStarted,并且XHR或计时器所做的最后一件事就是将该属性设置为AjaxStopped。这样,在任何情况下(即使可能有多个异步进程正在进行中,我有一个简单的方法来调用,看看我是否应继续前进。

您可以阅读我们所做的详情以及我们在此尝试的其他一些解决方案: http://testingjeff.wordpress.com/2009/10/21/relief-for-the-pain-of-waiting-for-ajax-elements-on-the-page/