【问题标题】:capybara jscript xpath error "unknown error: $x is not defined"capybara jscript xpath 错误“未知错误:$x 未定义”
【发布时间】:2015-05-04 14:34:12
【问题描述】:

我正在使用Site_Prism/Capybara 来实现自动化UI testing。由于我找不到任何 Capybara 滚动网页的方法,因此我正在执行 jscript,它为我完成了这项工作。 这两行对我来说做得不错:

page.execute_script ("document.getElementsByTagName('h4')[4].scrollIntoView();")

page.execute_script ($("h5:contains(' Information')")[0].scrollIntoView();)

但我想进行更强大的搜索,只包含我想要滚动到的文本。为此,我想在 jscript 中使用 Xpath。

这一行在 Chrome 控制台中运行良好:

$x("//*[contains(text(), ' Information')]")[0].scrollIntoView();

但是,当我尝试在 Capybara 中执行它时,当我执行其他 jscripts 时,如下所示:

page.execute_script ("$x(\"//*[contains(text(), '4. Conditions')]\")[0].scrollIntoView();")

我总是出错:

未知错误:$x 未定义 (会话信息:chrome=42.0.2311.135) (驱动信息:chromedriver=2.14.313457 (3d645c400edf2e2c500566c9aa096063e707c9cf),platform=Linux 3.13.0-37-generic x86_64) (Selenium::WebDriver::Error::UnknownError)

这里有什么问题? 我不能在 Capybara 执行的 jscript 中使用 Xpaths 吗?

有人可以帮忙吗?

提前致谢!

【问题讨论】:

  • 你在哪里定义$x
  • 你知道$x 是 chrome 添加到开发控制台的东西,它不是 JavaScript 的一部分吗?
  • 谢谢!我不知道 $x 是 chrome 添加到开发控制台的东西,它不是 JavaScript 的一部分。你对如何解决这个问题有什么建议吗? JavaScript中包含的任何其他方式?顺便说一句,我在 Chrome 中执行过这个脚本,也就是我目前使用 Chrome 进行测试,但我也想在其他浏览器上运行这些测试,所以答案非常有用。
  • 如果你有 jquery,也许你可以这样做: $('div:contains("Information")')[0].scrollIntoView();如果您还没有这样做,那么增大浏览器窗口可能也是一个好主意。然后你可以避免滚动。
  • 好吧div:contains 没有做这项工作,因为它返回页面的整个部分,所以它滚动页面的错误部分。搜索需要找到 DOM 树中包含文本的最后一个元素。

标签: javascript xpath capybara


【解决方案1】:

这是我设法找到的最优雅的解决方案:

def scroll_page_to_text (text)

    page.execute_script("document.evaluate(\"//*[contains(text(), '#{text}')]\", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.scrollIntoView();")

end

用法:

scroll_page_to_text("Some text")

【讨论】:

    【解决方案2】:

    您可以使用 $x 函数初始化程序来包装您的脚本。代码取自 chrome 控制台

    var scriptWrapper = @"
        $x = function(xpath, opt_startNode)
        {{
            var doc = (opt_startNode && opt_startNode.ownerDocument) || document;
            var result = doc.evaluate(xpath, opt_startNode || doc, null, XPathResult.ANY_TYPE, null);
            switch (result.resultType) {{
            case XPathResult.NUMBER_TYPE:
                return result.numberValue;
            case XPathResult.STRING_TYPE:
                return result.stringValue;
            case XPathResult.BOOLEAN_TYPE:
                return result.booleanValue;
            default:
                var nodes = [];
                var node;
                while (node = result.iterateNext())
                    nodes.push(node);
                return nodes;
            }}
        }}
    
        {0}";
    var script = @"
        var allDivsCollection = $x(""*//div"")
        return allDivsCollection;";
    
    var result = webDriver.ExecuteJavaScript<List<IWebElement>>(String.Format(scriptWrapper, script));  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-20
      • 1970-01-01
      • 2013-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多