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

mary · 2018年02月24日 · 最后由 恒温 回复于 2018年02月24日 · 2846 次阅读

以前用例都是在 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 好了。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册