元素可见吗?

Is element visible?

我尝试检查某个元素是否可见时出现错误。我的方法如下:

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']"

但是当元素正确可见时,效果很好。

尝试使用 xpath 中的 ':visible => true',可能是语法错误,但只是给你一个想法。

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

编辑: 更好地查看您的代码,看起来您想要的只是验证元素是否存在,无需等待......所以只需忽略等待部分(如果遇到一些相关问题仍然有用),并使用以下内容(这也是在下面的答案中建议)以验证是否存在元素:

has_xpath?("//td[text()='#{subtab}']")

原版:

问题是,当您从水豚触发查找方法时,它会尝试从您的页面映射元素。如果元素不在 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? return true 或 false 基于元素在 DOM 中的存在,您将使用上面的方法循环检查该检查,它只会移动到下一步,直到上面的检查 [=32] =] 是真的,那么你可以继续使用 .visible?方法(虽然在您确定元素存在于 DOM 中之后可能没有必要)...

默认情况下,水豚不会找到未显示的元素 - 如果您真的想 return 找到可见和未显示的元素,您可以这样做

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