2012-02-21 160 views
-1

我的應用程序只能在IE中測試,所以我嘗試添加下面的bookmarklets來查找xpath。我無法找到html元素的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(); 

我嘗試使用上面的書籤在google.com(我感覺很幸運按鈕)中找到元素的xpath。它返回// BODY [@ id ='gsr']

但是,當我試圖找到我的web應用程序中使用上述書籤的菜單元素的xpath。它返回爲/HTML/BODY

我的web應用程序在單獨的框架中有菜單欄。

<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?'> 

我怎樣才能進入菜單&菜單項,在這種情況下? Xpath不適用於它。 我正在使用watir來實現流程的自動化。 請給出您的建議。

+1

使用xpath與watir幾乎總是很難做事。 watir API和對象模型使得更容易理解代碼,並創建不脆弱且難以維護的代碼。查看Adam的回答 – 2012-02-21 19:51:39

+0

Arunsankar - 這個解決方案解決了您的問題嗎? – 2012-02-23 15:54:20

回答

2

Xpath是乏味和脆弱的。我建議從基本的HTML標籤開始。您可以像我在下面描述的「div」一樣訪問其父代爲MainMenu div元素的任何HTML元素。

@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