ChatGPT解决这个技术问题 Extra ChatGPT

升级到 Capybara 2.0 后如何点击项目列表中的第一个链接?

在这种情况下如何点击第一个链接:

<div class="item">
  <a href="/agree/">Agree</a>
</div>
<div class="item">
  <a href="/agree/">Agree</a>
</div>
within ".item" do
  first(:link, "Agree").click
end

我得到这个错误:

Capybara::Ambiguous:
  Ambiguous match, found 2 elements matching css ".item"

如果没有 within,我会收到此错误:

Failure/Error: first(:link, "Agree").click
NoMethodError:
  undefined method `click' for nil:NilClass

A
Andrei Botalov

您可以使用:

first('.item').click_link('Agree')

或者

first('.item > a').click

(如果您的默认选择器是 :css)

您问题中的代码不起作用:

within ".item" do
  first(:link, "Agree").click
end

相当于:

find('.item').first(:link, "Agree").click

Capybara 找到了几个 .item,因此引发了异常。我认为 Capybara 2 的这种行为非常好。


我建议不要使用#first,它不会等待元素存在:rubydoc.info/github/jnicklas/capybara/…。如果内容是在运行时使用 JS first 创建的,如果它在创建链接之前运行预期,则返回 nil。
g
gnclmorais

尝试以下操作:

within ".item" do
  click_link("Agree", :match => :first)
end

资料来源:

http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Actions#click_link-instance_method

https://github.com/jnicklas/capybara#strategy


惊人。它适用于简单的 page.find('#{css}', :match => :first).click 干杯以获得真正有用的答案
E
Elle Mundy

这个措辞也有效:

within first(".item") do
  click_link "Agree"
end

为我工作,谢谢。 Capybara 2.4.1 和 poltergeist。
D
DGM

Xpath 可以寻址元素。我还不是很擅长,但是//div[@class='active'][1]/a之类的

这可能有效,也可能无效,但关键是 xpath 可以处理一组匹配项并提取一个特定的匹配项。你应该能够匹配这个。

我的一个项目中的一个工作示例:

within page.find("div.panel", text: /Proposals/) do
  within page.find('tr', text: /Foo/) do
    page.should have_xpath('td[3]', text: @today)
  end
end

S
Salomanuel

这些解决方案中的大多数都不会使用 Capybara 出色的等待功能

最好按照此链接的建议进行操作:
https://thoughtbot.com/blog/write-reliable-asynchronous-integration-tests-with-capybara#find-the-first-matching-element

坏的:

first(".active").click
如果页面上还没有 .active 元素,则 first 将返回 nil 并且点击将失败。

好的:

如果您想确保确实有一个
find(".active").click

如果您只想要第一个元素
find(".active", match: :first).click
Capybara 会等待元素出现,然后再尝试点击。

请注意,match: :first 更脆弱,因为如果您引入匹配的新元素,它会默默地点击不同的元素。


我相信这是最准确的答案。
使困惑。查看 Capybara first,它说它等待 default_max_wait_time 秒,而对于 find,它也等待相同的时间。我提到这一点是因为它是一篇已更新的旧文章,我想知道是否可能发生了一些变化?
n
nroose

由于 first() 并不总是等待,也许这很有用:

expect(page).to have_css("selector")                               
first("selector").click

I
IT Vlogs

很简单,您可以使用:

$('.item').find('a').first().click();

这个例子与水豚无关
这不是 jQuery 吗?

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅