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