单击元素(如果它存在于capybara中)

单击元素(如果它存在于capybara中),capybara,Capybara,我希望单击出现在我的测试应用程序上的弹出消息(如果有)。我是水豚的新手,似乎找不到这样做的方法。我以前有过与watir合作的经验,如果我与watir合作,可能会是: if browser.link(:text, "name").exists? do browser.link(:text, "name").click end if page.find('.id') do click_link('Some Link') # or page.find('.id').click else

我希望单击出现在我的测试应用程序上的弹出消息(如果有)。我是水豚的新手,似乎找不到这样做的方法。我以前有过与watir合作的经验,如果我与watir合作,可能会是:

if browser.link(:text, "name").exists? do
   browser.link(:text, "name").click
end
if page.find('.id') do 
   click_link('Some Link') # or page.find('.id').click
else 
   page.should_not have_selector('.id') # or something like that
end

我怎样才能在水豚身上做同样的事?注意:此链接不会总是出现,因此我希望使用if语句。

您是否尝试过以下操作:

if browser.link(:text, "name").exists? do
   browser.link(:text, "name").click
end
if page.find('.id') do 
   click_link('Some Link') # or page.find('.id').click
else 
   page.should_not have_selector('.id') # or something like that
end

最直接的代码是调用匹配器,然后执行操作:

但这并不是最快的解决方案,因为水豚会向驱动程序发出两个查询以获取元素:第一个查询位于
的has\u link?
中,第二个查询位于
的click\u link

更好的变体可能是只进行一次查询以获取元素:

# This code doesn't check that an element exists only at one place and just chooses the first one
link = first('name')
link.click if link


就我个人而言,我会使用
has\u link?
/
单击\u link
实现,因为第二个变量没有检查元素是否只存在于一个位置,第三个太长。

如果我使用
has\u css?
查询:

if page.has_css?("button #popUpButton") 
    click_button(#popUpButton")
end

如果您正在编写确定性测试,您不应该知道弹出窗口是否存在吗?为什么要先检查是否存在,而不是直接点击?@nzifnab因为如果元素不存在
click
方法将fail@Andrey但是因为您正在编写测试,所以您应该知道元素是否应该存在。因此,click方法应该失败,因为您的测试预期失败了。否?@nzifnab OP明确表示,他只想单击存在的链接。OP想要它可能有不同的原因(SUT进行A/B测试,OP不测试他的应用程序,等等)@user1523236如果没有匹配的元素,那么选择器
find
将抛出
Capybara::ElementNotFound
异常。因此,如果链接不存在,则此代码不会在worklink=first(“”)中包含“find”,它只会找到第一个链接……如果传入find的内容不存在,它将抛出相同的异常。@Whitneymura
first
不会在其中调用
find
。请看和的源代码。我现在明白了。但我仍然不同意你的看法,第一个选择比找到更好。当代码更改时,如果链接不再成为“第一个”链接,该怎么办?现在,您将导航到某个地方,但它可能(也可能不是)是正确的链接。Idk,只是看起来似乎没有任何改善,但我想这就是为什么我们都有自己的个人偏好:)@Whitneymura事实上,你的代码不符合OP指定的要求:如果存在链接,他想单击链接。如果元素不存在,代码将引发异常。此外,在这种情况下,我可能会使用
has\u link?
/
click\u link
,你可以在我编辑过的答案中看到(我在你发表上一条评论之前进行了编辑)。这对我来说很有效
如果页面中出现了has\u link('whatever')。has\u link('whatever')
如果。。。do
会创建语法错误(至少在ruby 2.3.1上是这样),删除do会修复问题。这太慢了…find是最快的,但不能作为条件实现