所以我有一个应用程序,它包含多个逗号分隔的电子邮件字符串。字符串位于可以修改它们的文本区域元素中。该应用程序使用JavaScript来修改这些字符串,我需要使用Capybara来验证目标字符串中是否包含正确数量的电子邮件。为了说明我的意思,这是我的黄瓜(假设目标列表以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调用,但是我找不到关于它如何工作的文档,或者它是否是正确的策略。所以我在这里没有想法。
答案 0 :(得分:1)
由于所有电子邮件都在一个元素中,因此您倾向于使用过滤器块是完全正确的。过滤器块接收与初始选择器匹配的每个元素,并且需要返回它是否匹配您希望执行的任何额外过滤(true / false)。因此,要检查元素是否有一个字符串(值不是文本,因为它是一个表单字段),其中包含4个逗号分隔的项目,它将类似于
expect(page).to have_css(".css-selectors textarea"){ |ta|
ta.value.split(',').size == 4
}
然后,这将使用Capybaras等待/重试行为,同时还执行额外步骤,检查元素文本中匹配数量的逗号分隔项,从而绕过竞争条件。
也可以使用字段选择器的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文本来确保唯一元素。如果你想真正验证文本字符串是电子邮件等,显然你可以使正则表达式更复杂。