capybara jscript xpath错误“未知错误:$ x未定义”

时间:2015-05-04 14:34:13

标签: javascript xpath capybara

我正在使用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中使用Xpath吗?

任何人都可以帮忙吗?

提前致谢!

2 个答案:

答案 0 :(得分:1)

This is the most elegant solution I managed to find:

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

usage:

scroll_page_to_text("Some text")

答案 1 :(得分:1)

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

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));