ruby on rails 3 -如何编写一个黄瓜步骤来测试元素列表是否排序



我需要编写一个黄瓜场景来测试项目列表是否被排序(按名称)。比如:

Scenario: Sort projects by name
   Given there is a project called "Project B"
   And there is a project called "Project A"
   And there is a project called "Project C"
   Given I am on the projects page
   When I follow "Sort by name"
   Then I should see in this order ["Project A", "Project B", "Project C"]

我添加了一个步骤,看起来像:

Given /^I should see in this order ([.*])$/ do |array|
end

测试页面上列出的项目是否以正确的顺序出现的最佳方法是什么?我试图通过jQuery获得所有项目名称:

$(function() {
    var arrjs = new Array();
    $("div.project-main-info").find("a:first").each(function(){
        arrjs.push($(this).text());
    })
  });

并将它们放入数组中,与作为参数传递给此步骤的数组进行比较,但我不知道如何将jQuery代码集成到此步骤中!

谢谢!

编辑

根据McStretch的建议,我尝试使用XPath获取锚:

all('a').each do |a|
    if(//projects/d*/).match("#{a[:href]}")
        arr_page << "...." # Need to retrieve the value out of <a href="..">VALUE</a> but don't know how..any idea?
    end
  end

这是正确的方法吗?我刚刚测试了,不幸的是arr_page没有填充任何东西(我用[:href]替换了"…"部分只是为了测试)!实际上,我试图检查a[:href]的值(通过提高它),它是空白的!我如何更好地检查我的锚(给定有三个匹配上面提到的正则表达式)?

首先,最好将最后一步写成:

Then I should see the projects in this order:
  | Project A |
  | Project B |
  | Project C |

现在你可以很容易地访问列表作为一个数组,例如

expected_order = table.raw

然后需要将页面中的项目收集到一个数组中,如@McStretch所建议的:

actual_order = page.all('a.project').collect(&:text)

(这里假设每个项目链接都有一个"project"CSS类,以使测试更容易)。

你可以使用RSpec来比较两个数组。

expected_order.should == actual_order

如果顺序不正确,将显示失败。

Capybara提供了两种执行JavaScript的方法:

在支持它的驱动程序中,可以轻松执行JavaScript:

page.execute_script("$('body').empty()")

对于简单表达式,可以返回脚本的结果。请注意,这可能会更复杂表情:

result = page.evaluate_script('4 + 4');

因此,您可以尝试将JS表达式存储为字符串,并使用evaluate_script方法来获取返回的元素数组arrjs

参考:

https://github.com/jnicklas/capybara

您也可以尝试使用Capybara的Node::Finders all方法,该方法将返回与给定XPath匹配的元素列表:

all('a').each { |a| do_something_with_a }
参考:

http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Finders all-instance_method

很好的解决方案,我只是分享一个稍微更完整的例子:

Then /^I should see the "([^"]*)" in this order:$/ do |selector, table|
  expected_order = table.raw
  actual_order = page.all(selector).collect(&:text)
  actual_order.should == expected_order.flatten
end
叫做:

Then I should see the ".node .name" in this order:
| East Co     |
| HQ          |
| London      |

相关内容

  • 没有找到相关文章

最新更新