Ruby、Cucumber&Capybara:如何用正则选择PAY开头按钮
解决Capybara定位以PAY开头的可变文本按钮问题
没问题,我来帮你搞定这个Capybara定位按钮的问题!这种文本开头固定、后面内容可变的场景,用正则表达式匹配是最靠谱的方式,我给你分情况讲清楚:
情况1:按钮是<button>标签
如果你的按钮是这种结构:
<button> PAY $150 </button>
那Capybara可以直接通过匹配按钮的内部文本定位,用正则表达式匹配「以PAY开头(允许前后有空格)」的规则就行:
# 基础匹配:只要文本开头是PAY(忽略前后空格) pay_button = find('button', text: /^\s*PAY/) # 更精确的匹配:严格匹配「PAY + 空格 + 美元金额(整数或两位小数)」的格式 pay_button = find('button', text: /^\s*PAY \$\d+(\.\d{2})?\s*$/)
情况2:按钮是<input>标签(比如submit按钮)
如果你的按钮是input类型,比如:
<input type="submit" value=" PAY $150 ">
这时候按钮的文本存在于value属性里,不能用text选项,得用value选项来匹配:
# 基础匹配:value属性以PAY开头 pay_button = find('input[type="submit"]', value: /^\s*PAY/) # 精确匹配格式 pay_button = find('input[type="submit"]', value: /^\s*PAY \$\d+(\.\d{2})?\s*$/)
常见报错原因分析
大概率是这两个坑导致的:
- 用了精确字符串匹配(比如
text: 'PAY'),但实际按钮文本包含空格和金额,完全不匹配,导致找不到元素 - 针对input按钮错误地用了
text选项,而不是value选项,Capybara自然定位不到
额外小技巧
如果页面上有多个类似按钮,你可以结合其他属性(比如class、id)缩小范围,比如:
# 结合class定位 pay_button = find('button.checkout-primary-btn', text: /^\s*PAY/)
内容的提问来源于stack exchange,提问作者Darkisa
相关产品推荐
相关产品推荐

