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

Cucumber watir webdriver的等待方法在JS/AJAX和新页面加载下失败(在缓存中找不到错误),cucumber,watir,watir-webdriver,Cucumber,Watir,Watir Webdriver,我正在测试一个建立在Magento店面上的内部网站。在签出过程中,表单的某些部分将隐藏(样式:无),直到填写上一部分。这些部分通常会破坏脚本,但是使用隐藏表单的第一个元素when_present解决了这个问题 但是,SubmitOrder按钮不能很好地使用这些相同的方法。我今天与我们的首席开发人员合作,验证此按钮与以前的表单按钮之间的唯一区别是加载了新页面(新URL,浏览器中的新“完成”状态) 非常清楚地说: 用户输入姓名、地址、电子邮件并单击“继续”=>JS“加载”动画旋转,同时“常规”面板滑

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

但是,SubmitOrder按钮不能很好地使用这些相同的方法。我今天与我们的首席开发人员合作,验证此按钮与以前的表单按钮之间的唯一区别是加载了新页面(新URL,浏览器中的新“完成”状态)

非常清楚地说:

  • 用户输入姓名、地址、电子邮件并单击“继续”=>JS“加载”动画旋转,同时“常规”面板滑动关闭,“装运方法”面板展开,所有这些都在同一页面上
  • 用户单击“提交顺序”=>JS“加载”动画旋转,完成后,浏览器进入带有可验证元素的/success/(新页面)
  • 如果有足够的时间来完成(sleep语句),测试就会通过
  • 以下是表单的伪代码,以及“提交”按钮:

    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")
    
    根据站点响应的速度,脚本以两种不同的方式失败:

  • 失败,消息显示未找到预期的感谢消息-错误期间拍摄的屏幕截图显示结帐页面,而不是感谢页面,并显示“加载”动画。(预期“结帐”包括“您的订单已收到”)
  • 失败,出现“缓存中未找到元素”错误-本例中的屏幕截图显示感谢页面,其中包含我们正在查找的文本
  • 其他方法,如Watir::Wait.until或until{}do,也会导致相同的行为

    • 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:


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

    您是否考虑过使用“加载动画”(可能只是一个动画gif或类似内容)作为一种知道您应该继续等待的方式


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

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

    您可以在此处阅读我们所做工作的详细信息以及我们尝试的其他一些解决方案:

    谢谢你的回复,Chuck。我已经考虑过了,但到目前为止还没有完成(Firebug的速度太快了,我还没有访问服务器来找到元素,因为它仍在开发中-到目前为止,这都是基线性能测试)。我对这个解决方案充满希望,但我仍然想知道为什么以前的方法会失败,因为它们是按预期使用的。这位开发人员喜欢AJAX表单,所以这不会是我最后一次遇到这种情况了!Chuck,这种方法看起来也有同样的结果:下订单按钮。出现时。单击完成表单ajax\u正在加载\u image.wait\u当\u出现时为了给自己一个更好的机会来获取加载动画上的数据,我建议您在动画更新之前找到自己的位置,拔掉网络电缆(或者改变虚拟机设置,如果使用虚拟机,则断开系统与网络的连接)然后启动会导致页面更新的操作..这应该会给你一点时间来获取“加载”内容上的商品,而客户端代码试图联系Web服务器却徒劳无功。如果他们先设置,然后再删除,加载动画可能会像@Jeff在其回答中描述的标志一样工作。谢谢ff,如果情况变得更糟,我将看看开发人员是否会登录。他们过去为我添加了定位器,因此如果他们有时间,他们应该对此持开放态度。在代码示例中了解感谢消息的返回类型会很有用(这似乎是某种Watir::元素,因为它会响应“等待到”出现,尽管“From Steps”代码表示它是一个字符串)。此外,查看任何错误的堆栈跟踪也会很有帮助。因为您正在等待页面更改,另一个很好的技巧是等待页面的标题更改:old_title=browser.title;wait.until{browser.title!=old_title}很好,Jari。我在感谢页面验证中混合了两种不同的尝试,试图在这里总结问题。“从步骤”代码用于@browser.div(:class,/page title/).text,而上面的等待到现在版本用于@browser.button(:text,/Continue Shopping/)这只会出现在感谢页面上。页面标题的想法可能会完全解决问题,很高兴看到它。Jari,如果你把你关于标题的解决方案作为答案,我会很乐意接受。仍然不确定为什么前者会遇到
      place_order_button.when_present.click  #complete form
      ajax_submit_image.wait_while_present