Selenium IE11 对 xpath 支持很差,老用例很多运行失败,如何比较好解决这个问题?

mary · February 24, 2018 · Last by 恒温 replied at February 24, 2018 · 2355 hits

以前用例都是在IE10一下版本运行的,升级到IE11后,就出现若干问题。一般都是点击响应不了,输入框啥的倒是正常。比如登陆按钮,点击没有反应;或者树节点上,点击的元素不是你设置的。换成JavaScript查找元素后,点击就没有这个问题。但是,这样修改针对已有用例修改很麻烦。
问题:1. 不太明白,为什么IE11会造成xpath点击不上这种情况?
2. 有什么比较好的解决方法?

共收到 5 条回复 时间 点赞

该换ie了,今早用chrome,ff来维护吧

—— 来自TesterHome官方 安卓客户端

建议抛弃 ie 的可以退下了,人家可能定位的群体,大部分使用ie的怎么办?
楼主看看这篇文章 http://laiyenmin.blogspot.tw/2014/01/xpath-ie10-ie11-selectnodes.html

經過不斷的 google ,網路上有幾個解法

\1. 在獲取 xml 的同時,將他封裝成 MSXML

try{
xhr.responseType = "msxml-document";
}catch(e){}

\2. 在使用 xPath 的地方將 xml 變更成 MSXML

var doc;
try{
doc = new ActiveXObject('Microsoft.XMLDOM');
doc.loadXML(stringVarWithXml);
var node = doc.selectSingleNode('//foo');
}catch(e){
//deal with case that ActiveXObject is not supported
}

\3. 使用模擬 xPath 的套件取代 xPath 行為

https://code.google.com/p/wicked-good-xpath/

雖然其實最後這三個解法都無法解決我的問題

我另外又試了另一個可能可以的方法

使用 getElementsByTagName() 函式來取代 SelectNodes (SelectSingleNode)

但是在程式中又都是只尋找下一層的子節點

而且原本的 xml 竟然一大堆同名的節點下方還有同名的節點

真是被打敗

於是花了很多時間,把原本的程式邏輯搞清楚

發現其實根本不需要用到 xPath 因為所有的搜尋行為都只找下一層而已

因此我自己寫了一個 getChildByName function 來取代掉原本的方法

getChildByName = function(xmlDoc, tagName){
var tmpXML = xmlDoc.cloneNode(true);
var childNodes = tmpXML.childNodes;
for(var i = childNodes.length-1 ; i >= 0 ; i--){
if(childNodes[i].tagName != tagName){
tmpXML.removeChild(childNodes[i]);
}
}
childNodes = tmpXML.childNodes;
return childNodes;
}

其實確實是還有改進的空間

但是以目前來說,可以確實解決問題就好了

原因的话,据说是因为IE11的xhttp加载dom方式不支持xpath。

解决方案有几个:

  • 使用css selector代替
  • 老老实实使用window.ActiveXObject
  • M$ Edge还是支持xpath的
  • 降级回IE10

附M$官方支持列表(https://developer.microsoft.com/en-us/microsoft-edge/platform/status/domlevel3xpath/?q=xpath):
IE11不支持

我是觉得全部植入 sizzle.js好了。

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up