2015-05-04 44 views
0

我正在使用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(); 

但是,当我尝试在水豚执行它,因为我执行其他jscripts,像这样:

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

我总是得到错误:

unknown error: $x is not defined (Session info: chrome=42.0.2311.135) (Driver info: chromedriver=2.14.313457 (3d645c400edf2e2c500566c9aa096063e707c9cf),platform=Linux 3.13.0-37-generic x86_64) (Selenium::WebDriver::Error::UnknownError)

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

任何人都可以帮忙吗?

在此先感谢!

+0

你在哪里定义'$ x'? –

+0

您是否意识到'$ x'是Chrome添加到开发控制台的东西,它不是JavaScript的一部分? – epascarello

+0

谢谢!我不知道$ x是添加到开发控制台的东西,它不是JavaScript的一部分。你有什么建议如何解决这个问题? JavaScript中包含的其他任何方式?顺便说一句,我已经在Chrome中执行了这个脚本,也就是我现在使用Chrome进行测试,但是我也想在其他浏览器上运行这些测试,所以答案非常有用。 –

回答

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") 
1

你可以用与$ 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));