【问题标题】:element not visible Selenium capybara元素不可见硒水豚
【发布时间】:2017-09-15 23:24:40
【问题描述】:

我在执行以下 capybara 命令时遇到错误, 有趣的是,在我期望 XPath 存在时,相同的 XPath 没有给出任何错误。 但是,当我尝试单击该 XPath 时,它会抛出错误。

-------------代码----

然后(/^I click on left tree child of "([^"])"$/) 的 "([^"])" do |child, parent|

within(:xpath, ".//div/span[@class='folder-nav-tree-fileroom' and text()='DND-IndexTwistyExpClps']/../../../. ./..",等待:5) 做

find(:xpath, ".//span[contains(text(),  '1 IndexTwistyLevel1')]/../../../span[@class='ui-tree-toggler  fa fa-fw fa-caret-right']",  wait:5).click

结束

结束

Error : Capybara::ElementNotFound: Unable to find visible xpath "//div[.//span[contains(text(),  '1 IndexTwistyLevel1')]]/span[@class='ui-tree-toggler  fa fa-fw fa-caret-right']"

【问题讨论】:

    标签: selenium selenium-webdriver capybara selenium-chromedriver


    【解决方案1】:

    您的代码存在许多问题,这表明它实际上无法像您声称的那样工作。如果您修复代码并提供它应该匹配的 HTML 片段,我们可以缩小问题的范围,但目前错误是:

    首先,您不匹配/未转义 's 和 )s 在你的 XPath 表达式中(不能有 inside a string surrounded bys 所以很明显你没有复制/粘贴你的实际代码)

    其次,::after 不是有效的 XPath - ::after 伪元素纯粹是 CSS,不能从 XPath 访问,因此在选择器中包含它不会产生预期的结果。这应该会导致 Chrome 引发无效的选择器错误。

    第三,如果不以 . 开头选择器,您就完全击败了 within 范围块 - 请参阅 https://github.com/teamcapybara/capybara#beware-the-xpath--trap

    最后,在您想要点击的元素上使用visible: false 是没有意义的,因为您无法点击页面上未显示的元素。

    很遗憾,由于您提供的代码无效,因此很难判断其中哪些可能会导致您的实际问题(如果有)。

    【讨论】:

    • 嗨 Thomas Walpole,感谢您的快速回复:以下是更新代码 .within(:xpath, "//div/span[@class='folder-nav-tree-fileroom' 和文本()='TEXT']/../../../../..") 如果 page.all(:xpath, "//div[.//span[contains(text(),  ' 1 IndexTwistyLevel1 ')]]/span[@class='ui-tree-toggler fa fa-fw fa-caret-right']").count == 1 puts "i got the match" end find(:xpath, " //div[.//span[contains(text(),  '1 IndexTwistyLevel1 ')]]/span[@class='ui-tree-toggler fa fa-fw fa-caret-right']").click end
    • @asingh 请编辑/修复您的问题,以便代码实际上是可读的 - 使用您在评论中输入的代码,within 仍然没有意义,因为您完全失败了它与您的 xpath 表达式 - 我的回答中的第三点
    • 嘿,Thomas,根据第 3 点,我已经更新了代码,运行它得到错误元素不可见,我已经更新了问题和代码。请看一下,再次感谢您的宝贵时间
    • @asingh 从问题中的代码 - 你还没有固定点 3 - 因为内块内的 xpath 表达式(你想要的范围仍然不是以 . ) - 你的问题中显示的错误是“无法找到”而不是“元素不可见”
    • @asingh 另外-实际 span 元素的尺寸是多少-在您的图像中,您显示 ::after 伪元素的尺寸,而不是实际 span 元素的尺寸(这就是您可以找到并点击)
    【解决方案2】:
    within(:xpath, config['documents_obj']['FRChildTreeXpath'].sub('TEXT', parent), wait:5) do
    elem = find(:xpath, config['documents_obj']['childTwistyXpath'].sub('TEXT', child), visible:false,  wait:5).native
    page.driver.browser.action.click(elem).perform
    

    为了避免我刚刚做的事情的错误,我使用了水豚动作生成器, 获取原生元素,然后执行操作。

    对我来说效果很好。

    参考:https://seleniumhq.github.io/selenium/docs/api/rb/Selenium/WebDriver/ActionBuilder.html

    【讨论】:

      猜你喜欢
      • 2020-02-03
      • 2013-09-14
      • 1970-01-01
      • 1970-01-01
      • 2015-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-06
      相关资源
      最近更新 更多