当我尝试检查某个元素是否可见时出错。我的方法如下:
if find(:xpath, "//td[text()='#{subtab}']").visible?
find(:xpath, "//td[text()='#{subtab}']").click
else
find(:xpath, "//td[text()='#{tab}']").click
find(:xpath, "//td[text()='#{subtab}']").click
end
在if find(:xpath, "//td[text()='#{subtab}']").visible?
中,我有:
Capybara::ElementNotFound:
Unable to find xpath "//td[text()='Plan List2']"
但是当元素正确可见时,效果很好。
答案 0 :(得分:2)
编辑: 更好地看看你的代码,看起来你想要的只是验证元素是否存在,而不是等待......所以只需忽略等待部分(如果遇到一些相关问题仍然有用),并使用以下(也是在下面的答案中建议)验证元素是否存在:
has_xpath?("//td[text()='#{subtab}']")
ORIGINAL:
问题是当你从水豚中解雇查找方法时,它会尝试从你的页面映射元素。如果元素不存在于DOM中,那么它永远不会调用.visible?方法...
Capybara的最新版本删除了wait_until功能,所以在这种情况下你需要自己实现一个服务员......
以下是如何解决该问题的示例:
def wait_until
Timeout.timeout(20) do
sleep(0.1) until value = yield
end
end
然后
wait_until { has_xpath?("//td[text()='#{subtab}']") }
has_xpath?将根据DOM中元素的存在返回true或false,您将使用上面的方法循环执行该检查,它将仅移动到下一步,直到上面的检查返回true,然后您可以继续使用。可见?方法(虽然在确保元素存在于DOM中之后可能没有必要)....
答案 1 :(得分:1)
试试':visible =>对于xpath,可能是语法错误,但只是给你一个想法。
if find(:xpath, "//td[text()='#{subtab}']", visible: false).visible?
find(:xpath, "//td[text()='#{subtab}']").click
else
find(:xpath, "//td[text()='#{tab}']").click
find(:xpath, "//td[text()='#{subtab}']").click
end
答案 2 :(得分:1)
默认情况下,capybara找不到非显示的元素 - 如果你真的想让find返回可见和未显示的元素,你可以做
find(:xpath, "//td[text()='#{subtab}']", visible: :all)
更好的解决方案是
if page.has_no_xpath?("//td[text()='#{subtab}']")
# if the subtab is not visible click the tab
find(:xpath, "//td[text()='#{tab}']").click
end
find(:xpath, "//td[text()='#{subtab}']").click