我需要向 IE 注入一些 Javascript 腳本,然后呼叫一些方法。
我嘗試了以下簡單的 C# 代碼(Javascript 代碼是從已知的 HTML 元素構建 xpath)。
string xpath = @"
(function(win) {
""use strict"";
var doc = win.document;
if (doc._xpath_installed) return;
doc._xpath_installed = true;
doc.createXPath = function (node, optimized) {
if (node.nodeType === Node.DOCUMENT_NODE) {
return '/';
}
var steps = [];
var contextNode = node;
while (contextNode) {
var step = _xPathValue(contextNode, optimized);
if (!step) {
break;
} // Error - bail out early.
steps.push(step);
if (step.optimized) {
break;
}
contextNode = contextNode.parentNode;
}
steps.reverse();
var stepvalues = [];
steps.forEach(function (step) {
stepvalues.push(_steptostring(step));
});
return (steps.length && steps[0].optimized ? '' : '/') stepvalues.join('/');
};
var _xPathValue = function (node, optimized) {
var ownValue;
var ownIndex = _xPathIndex(node);
if (ownIndex === -1) {
return null;
} // Error.
switch (node.nodeType) {
case Node.ELEMENT_NODE:
if (optimized && node.getAttribute('id')) {
return _stepnew('//*[@id=""' node.getAttribute('id') '""]', true);
}
ownValue = node.localName;
break;
case Node.ATTRIBUTE_NODE:
ownValue = '@' node.nodeName;
break;
case Node.TEXT_NODE:
case Node.CDATA_SECTION_NODE:
ownValue = 'text()';
break;
case Node.PROCESSING_INSTRUCTION_NODE:
ownValue = 'processing-instruction()';
break;
case Node.COMMENT_NODE:
ownValue = 'comment()';
break;
case Node.DOCUMENT_NODE:
ownValue = '';
break;
default:
ownValue = '';
break;
}
if (ownIndex > 0) {
ownValue = '[' ownIndex ']';
}
return _stepnew(ownValue, node.nodeType === Node.DOCUMENT_NODE);
};
var _xPathIndex = function (node) {
// Returns -1 in case of error, 0 if no siblings matching the same expression,
// <XPath index among the same expression-matching sibling nodes> otherwise.
function areNodesSimilar(left, right) {
if (left === right) {
return true;
}
if (left.nodeType === Node.ELEMENT_NODE && right.nodeType === Node.ELEMENT_NODE) {
return left.localName === right.localName;
}
if (left.nodeType === right.nodeType) {
return true;
}
// XPath treats CDATA as text nodes.
var leftType = left.nodeType === Node.CDATA_SECTION_NODE ? Node.TEXT_NODE : left.nodeType;
var rightType = right.nodeType === Node.CDATA_SECTION_NODE ? Node.TEXT_NODE : right.nodeType;
return leftType === rightType;
}
var siblings = node.parentNode ? node.parentNode.children : null;
if (!siblings) {
return 0;
} // Root node - no siblings.
var hasSameNamedElements;
for (var i = 0; i < siblings.length; i) {
if (areNodesSimilar(node, siblings[i]) && siblings[i] !== node) {
hasSameNamedElements = true;
break;
}
}
if (!hasSameNamedElements) {
return 0;
}
var ownIndex = 1; // XPath indices start with 1.
for (var i = 0; i < siblings.length; i) {
if (areNodesSimilar(node, siblings[i])) {
if (siblings[i] === node) {
return ownIndex;
}
ownIndex;
}
}
return -1;
};
var _stepnew = function(value, optimized) {
return {
value: value,
optimized: optimized || false
}
};
var _steptostring = function(step) {
return step[""value""];
};
})(window);
";
然后我嘗試注入 xpath 字串并呼叫一個方法,
// doc is the html document (type: mshtml.IHTMLDocument2)
// element is the html element (type: mshtml.IHTMLElement)
doc.parentWindow.execScript(xpath, "JScript");
object[] args = new object[2];
args[0] = element;
args[1] = 1;
object result = doc.GetType().InvokeMember("createXPath", BindingFlags.Instance | BindingFlags.InvokeMethod, null, doc, args);
它在 Internet Explorer 11 (Windows 10) 中運行良好。
但是,當我將網站添加到兼容性視圖(設定-> 兼容性視圖設定)時,InvokeMember 呼叫會引發例外“HRESULT 中的例外:0x80020101”,這意味著 Javascript 代碼中存在一些腳本錯誤。
我的問題是,有沒有辦法在上述情況下除錯這個 Javascript 代碼?如果不進行除錯,僅根據 0x80020101 資訊幾乎不可能找到根本原因。
uj5u.com熱心網友回復:
如果您的 JS 代碼中有腳本錯誤,為什么不使用 or 跟蹤客戶端代碼的執行,console.log()以便console.debug()您知道應用程式中發生了什么?
uj5u.com熱心網友回復:
如果只想在 Edge IE 模式下除錯代碼,可以使用 IEChooser 打開 Internet Explorer DevTools,如下:
- 在 Windows 中,打開“運行”對話框。例如,按
Windows logo keyR。 - 輸入
%systemroot%\system32\f12\IEChooser.exe,然后單擊確定。 - 在 IEChooser 中,選擇 IE 模式選項卡的條目。
有關更多詳細資訊,您還可以參考此檔案:Open DevTools on a tab in IE mode。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/426548.html
標籤:javascript C# 。网 IE浏览器
