在水豚上点击 href
clicking href on capybara
我试图告诉 Capybara/Cucumber 单击 href,但尝试不同的选项失败。这是代码:
<div>
<h6 class="animation-visible tile-animation link-group color-white border-round bg-primary animated" data-animation-delay="1000" data-animation="cta-1">
<label>Option 1</label>
<a href="http://some.com/page1/">More</a>
</h6>
<h6 class="animation-visible tile-animation link-group color-white border-round bg-primary animated" data-animation-delay="1000" data-animation="cta-1">
<label>Option 2</label>
<a href="http://some.com/page2/">More</a>
</h6>
...
</div>
第一次尝试是 find_link('More')。单击 "link"。
within(all(.animation-visible.tile-animation.link-group.color-white.border-round.bg-primary.animated>a).[0]) do
find_link('More').click
end
那没用。我试过让它立即点击。
find(all('.animation-visible.tile-animation.link-group.color-white.border-round.bg-primary.animated>a')[0]).click
那也没用。
想知道是否还有其他方法可以点击选项 1?还是选项 2?这些选项需要单独测试。
这些行不通吗?
第一个link
find_link("a[href$='page1/']").click
第二个link:
find_link("a[href$='page2/']").click
Translation of the css
selector:
Find the link that ends with XXX
假设元素在页面上可见(不确定 h6 元素上的动画 类 实际在做什么)那么您的第一次尝试不会成功,因为内部的选择器上有额外的 > a - 这意味着你已经找到 a 然后在里面说找到另一个 a。您的第二次尝试不会成功,因为 find 采用选择器类型和选择器(选择器类型默认为 css)来匹配元素,但所有 return 都是一个元素数组(您调用 find 到 return 一个元素或全部到 return 多个元素) - 以下应该可以代替
within(all('.animation-visible.tile-animation.link-group.color-white.border-round.bg-primary.animated')[0]) do
find_link('More').click
end
在第一个 .animation-visible... 匹配元素中找到一个 link 和 'More' 作为其文本并单击它。也可以这样写
within(first('.animation-visible.tile-animation.link-group.color-white.border-round.bg-primary.animated', minimum: 1)) do
click_link('More')
end
这基本上是一样的,除了最小值:1 选项会让它等到页面上至少有一个匹配元素(如果您之前的调用是 #visit
或者元素正在通过ajax
注意:您也可以在第一个示例中使用最小值:1(或您希望在页面上出现的任何元素数量)
另一个答案中建议的 find_link
调用将不起作用,因为 find_link 不采用 css 选择器,它需要一个字符串来匹配文本,id ,或 link 的标题。所以以下将起作用
find_link('More', href: 'http://some.com/page1/').click
或
click_link('More', href: 'http://some.com/page1/')
我试图告诉 Capybara/Cucumber 单击 href,但尝试不同的选项失败。这是代码:
<div>
<h6 class="animation-visible tile-animation link-group color-white border-round bg-primary animated" data-animation-delay="1000" data-animation="cta-1">
<label>Option 1</label>
<a href="http://some.com/page1/">More</a>
</h6>
<h6 class="animation-visible tile-animation link-group color-white border-round bg-primary animated" data-animation-delay="1000" data-animation="cta-1">
<label>Option 2</label>
<a href="http://some.com/page2/">More</a>
</h6>
...
</div>
第一次尝试是 find_link('More')。单击 "link"。
within(all(.animation-visible.tile-animation.link-group.color-white.border-round.bg-primary.animated>a).[0]) do
find_link('More').click
end
那没用。我试过让它立即点击。
find(all('.animation-visible.tile-animation.link-group.color-white.border-round.bg-primary.animated>a')[0]).click
那也没用。
想知道是否还有其他方法可以点击选项 1?还是选项 2?这些选项需要单独测试。
这些行不通吗?
第一个link
find_link("a[href$='page1/']").click
第二个link:
find_link("a[href$='page2/']").click
Translation of the
css
selector: Find the link that ends with XXX
假设元素在页面上可见(不确定 h6 元素上的动画 类 实际在做什么)那么您的第一次尝试不会成功,因为内部的选择器上有额外的 > a - 这意味着你已经找到 a 然后在里面说找到另一个 a。您的第二次尝试不会成功,因为 find 采用选择器类型和选择器(选择器类型默认为 css)来匹配元素,但所有 return 都是一个元素数组(您调用 find 到 return 一个元素或全部到 return 多个元素) - 以下应该可以代替
within(all('.animation-visible.tile-animation.link-group.color-white.border-round.bg-primary.animated')[0]) do
find_link('More').click
end
在第一个 .animation-visible... 匹配元素中找到一个 link 和 'More' 作为其文本并单击它。也可以这样写
within(first('.animation-visible.tile-animation.link-group.color-white.border-round.bg-primary.animated', minimum: 1)) do
click_link('More')
end
这基本上是一样的,除了最小值:1 选项会让它等到页面上至少有一个匹配元素(如果您之前的调用是 #visit
或者元素正在通过ajax
注意:您也可以在第一个示例中使用最小值:1(或您希望在页面上出现的任何元素数量)
另一个答案中建议的 find_link
调用将不起作用,因为 find_link 不采用 css 选择器,它需要一个字符串来匹配文本,id ,或 link 的标题。所以以下将起作用
find_link('More', href: 'http://some.com/page1/').click
或
click_link('More', href: 'http://some.com/page1/')