所以我有一个应用程序,其中包含多个条目,这些条目是逗号分隔的电子邮件字符串。字符串位于文本区域元素中,可以在其中进行修改。应用程序使用JavaScript来修改这些字符串,我需要使用Capybara来观察验证目标字符串是否包含正确数量的电子邮件。为了说明我的意思,这里是my Cucumber (假设目标列表以5个电子邮件字符串开头):
When I remove the 3rd email under list one
Then I should see 4 emails under list one
When I click the "Cancel" button for list one
Then I should see 5 emails under list one我可以很容易地用Capybara抓取字符串,如下所示:
expect(page).to have_css(".css-selectors textarea")但我不知道从那里该做什么。我需要能够断言,字符串中的电子邮件数量实际上正在更改为所需的数量。我需要拆分字符串并计算电子邮件的数量,以查看它们是否与目标数量匹配,但我尝试的所有操作都会导致竞争条件,Capybara会在JS完成更新之前检查该值。我已经研究过将过滤器块传递给have_css调用,但我找不到关于它如何工作的文档,或者这是否是正确的策略。所以我在这里没有想法了。
发布于 2018-01-31 08:17:58
因为所有的电子邮件都在一个元素中,所以你倾向于使用过滤器块是完全正确的。过滤器块接收与初始选择器匹配的每个元素,并需要返回它是否与您希望执行的任何额外过滤匹配(true/false)。因此,要检查元素是否有一个包含4个逗号分隔项的字符串(值不是文本,因为它是一个表单字段),应该是这样的
expect(page).to have_css(".css-selectors textarea"){ |ta|
ta.value.split(',').size == 4
}这将使用水豚等待/重试行为,同时还执行额外的步骤,检查元素文本中以逗号分隔的匹配数量的项目,从而绕过竞争条件。
也可以使用字段选择器的with选项的正则表达式来执行检查,如下所示
expect(page).to have_field(type: 'textarea', with: /^[^,]+,[^,]+,[^,]+,[^,]+$/)或fillable_field选择器
expect(page).to have_selector(:fillable_field, type: 'textarea', with: /^[^,]+,[^,]+,[^,]+,[^,]+$/)这些方法目前并不适用于.css-selectors元素,但您可以使用within或链式查找来实现。您还可以通过传递元素的id/name/label文本来确保元素是唯一的。显然,如果您想要实际验证文本字符串是电子邮件等,那么可以使正则表达式变得更加复杂。
https://stackoverflow.com/questions/48531816
复制相似问题