我有一个仅Internet Explorer的Web应用程序。
我正在探索如何使测试自动化。
Selenium看起来是一个很好的工具,但是能够激活链接等。我需要告诉它它们在哪里。应用程序的构建并不是考虑到这种测试,因此id,关键元素通常没有属性。
id
没问题,我想,我可以使用XPath表达式。但是,如果要通过检查页面源代码来找到正确的XPath(例如某个按钮),将是一件很痛苦的事情。
使用Firefox / Firebug,我可以选择元素,然后使用“复制XPath”获取表达式。
我有IE开发人员工具栏,它非常令人沮丧。我可以单击以选择感兴趣的元素,并显示有关它的各种信息。但我找不到确定它的XPath的任何便捷方法。
那么,使用IE有什么方法吗?
我会使用小书签。我有一个XPath相关,但我不知道它是否可以在IE中使用。我得走了,但是如果它在IE上可以工作,我会对其进行测试并给出。
Web开发人员从我的书签中获得的两个小书签站点:Subsimple的小书签和Squarefree的小书签。那里有很多有用的东西…
[编辑]好,我回来了。我拥有的小书签仅适用于FF,不是最佳选择。我终于重写了它,尽管使用了最初的想法。无法找到我找到它的地方。
扩展的JS:
function getNode(node) { var nodeExpr = node.tagName; if (nodeExpr == null) // Eg. node = #text return null; if (node.id != '') { nodeExpr += "[@id='" + node.id + "']"; // We don't really need to go back up to //HTML, since IDs are supposed // to be unique, so they are a good starting point. return "/" + nodeExpr; } // We don't really need this //~ if (node.className != '') //~ { //~ nodeExpr += "[@class='" + node.className + "']"; //~ } // Find rank of node among its type in the parent var rank = 1; var ps = node.previousSibling; while (ps != null) { if (ps.tagName == node.tagName) { rank++; } ps = ps.previousSibling; } if (rank > 1) { nodeExpr += '[' + rank + ']'; } else { // First node of its kind at this level. Are there any others? var ns = node.nextSibling; while (ns != null) { if (ns.tagName == node.tagName) { // Yes, mark it as being the first one nodeExpr += '[1]'; break; } ns = ns.nextSibling; } } return nodeExpr; } var currentNode; // Standard (?) if (window.getSelection != undefined) currentNode = window.getSelection().anchorNode; // IE (if no selection, that's BODY) else currentNode = document.selection.createRange().parentElement(); if (currentNode == null) { alert("No selection"); return; } var path = []; // Walk up the Dom while (currentNode != undefined) { var pe = getNode(currentNode); if (pe != null) { path.push(pe); if (pe.indexOf('@id') != -1) break; // Found an ID, no need to go upper, absolute path is OK } currentNode = currentNode.parentNode; } var xpath = "/" + path.reverse().join('/'); alert(xpath); // Copy to clipboard // IE if (window.clipboardData) clipboardData.setData("Text", xpath); // FF's code to handle clipboard is much more complex // and might need to change prefs to allow changing the clipboard content. // I omit it here as it isn't part of the original request.
您必须选择元素并激活小书签以获取其XPath。
现在,小书签版本(感谢Bookmarklet Builder):
IE (我不得不将其分为两部分,因为IE不喜欢很长的书签(最大大小取决于IE版本!)。您必须先激活第一个(功能def),然后再激活第二个。经过IE6测试)
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();
FF
javascript:function o__o(){function getNode(node){var nodeExpr=node.tagName;if(nodeExpr==null)return null;if(node.id!=''){nodeExpr+="[@id='"+node.id+"']";return "/"+nodeExpr;}var rank=1;var ps=node.previousSibling;while(ps!=null){if(ps.tagName==node.tagName){rank++;}ps=ps.previousSibling;}if(rank>1){nodeExpr+='['+rank+']';}else{var ns=node.nextSibling;while(ns!=null){if(ns.tagName==node.tagName){nodeExpr+='[1]';break;}ns=ns.nextSibling;}}return nodeExpr;}var currentNode=window.getSelection().anchorNode;if(currentNode==null){alert("No selection");return;}var path=[];while(currentNode!=undefined){var pe=getNode(currentNode);if(pe!=null){path.push(pe);if(pe.indexOf('@id')!=-1)break;}currentNode=currentNode.parentNode;}var xpath="/"+path.reverse().join('/');alert(xpath);}o__o();