我们可以通过chrome获取元素selector,那么如何用C# mshtml以同样的算法来获取IE元素的selector呢,下面是给出的代码,大多是翻译chrome的js代码。
/// <summary>
/// 获取CSS Selector
/// </summary>
/// <param name="srcElement">IE元素</param>
/// <param name="optimized">优化选项</param>
/// <returns></returns>
private string CssPath(IHTMLElement srcElement, bool optimized)
{
var node = srcElement as IHTMLDOMNode;
if (node == null || node.nodeType != 1) return "";
var steps = new List<SelectorStep>();
var contextNode = node;
Debug.WriteLine("0 " + DateTime.Now + " " + DateTime.Now.Millisecond);
while (contextNode != null)
{
var step = CssPathStep(contextNode, optimized, contextNode == node);
if (step == null) break; // Error - bail out early.
steps.Add(step);
if (step.Optimized) break;
contextNode = contextNode.parentNode;
}
Debug.WriteLine("2 " + DateTime.Now + " " + DateTime.Now.Millisecond);
steps.Reverse();
var cssPath = steps.Aggregate("", (current, selectorStep) => current + " > " + selectorStep.Selector).Substring(3);
return "<css>" + cssPath + "</css>";
}
/// <summary>
/// 获取每个节点的Selector
/// </summary>
/// <param name="node"></param>
/// <param name="optimized"></param>
/// <param name="isTargetNode"></param>
/// <returns></returns>
private SelectorStep CssPathStep(IHTMLDOMNode node, bool optimized, bool isTargetNode)
{
var element = node as IHTMLElement;
if (node.nodeType != 1) return null;