元素可见吗?

时间:2015-06-11 06:48:30

标签: ruby capybara

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

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

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

3 个答案:

答案 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