我正在使用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吗?
任何人都可以帮忙吗?
提前致谢!
答案 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));