我的应用程序只能在IE中测试,所以我尝试添加以下bookmarklet来查找xpath。
javascript:function getNode(node){var nodeExpr=node.tagName;if(!nodeExpr)return null;if(node.id!=''){nodeExpr+="[@id='"+node.id+"']";return "/"+nodeExpr;}var rank=1;var ps=node.previousSibling;while(ps){if(ps.tagName==node.tagName){rank++;}ps=ps.previousSibling;}if(rank>1){nodeExpr+='['+rank+']';}else{var ns=node.nextSibling;while(ns){if(ns.tagName==node.tagName){nodeExpr+='[1]';break;}ns=ns.nextSibling;}}return nodeExpr;}
javascript:function o__o(){var currentNode=document.selection.createRange().parentElement();var path=[];while(currentNode){var pe=getNode(currentNode);if(pe){path.push(pe);if(pe.indexOf('@id')!=-1)break;}currentNode=currentNode.parentNode;}var xpath="/"+path.reverse().join('/');clipboardData.setData("Text", xpath);}o__o();
我尝试使用上面的bookmarklet在google.com中找到元素的xpath(我感觉很幸运)。它返回 // BODY [@ id ='gsr']
但是当我尝试使用上面的bookmarklet在我的Web应用程序中找到菜单元素的xpath时。它以 / HTML / BODY 返回。
我的网络应用程序在单独的框架中有菜单栏。
<frameset name="fr" id="fr" border="0" frameBorder="NO" frameSpacing="0" marginwidth="0" >
<frame name="frNav" src="navi.esp" ">
<html>
<head>
.......
</head>
<body class="GlobalNavBackground" onload="InitializePage();" onunload="" onresize="DisplayChange()">
<div id="MainMenu" style="display: none;">
<div tabIndex="-1" class="ActionMenuDropDown" id="ActionMenu_Registration" onblur="HideDropdown(this);">
<div class="active" onmouseover="this.className='selected';" onmouseout="this.className='active';" onclick=('/registration.esp?'>
我如何访问菜单&amp;菜单项,在这种情况下? Xpath不起作用。 我正在与watir一起自动化这个过程。 请提出你的建议。
答案 0 :(得分:2)
@browser.frame(:name => "frNav").div(:id => "MainMenu").div.each do |div|
#for each div element in the MainMenu div, in the frNav frame
puts div.id
#write the div id to the console
end
您可以通过为父元素指定值来简化重复使用和可读性:
MenuFrame = @browser.frame(:name => "frNav")
MainMenu = MenuFrame.div(:id => "MainMenu")
MainMenu.div(:id => "ActionMenu_Registration").click
真的,你要做的就是指定父框架和下一个元素(父/子):
browser.frame(:how => what).div(:how => what).element