天天看點

GeckoFx (3)使用 xpath 擷取元素,生成 xpath 路徑

GeckoFx (3)使用 xpath 擷取元素,生成 xpath 路徑

生成 xpath 需要使用 DomClick 事件,擷取選中的元素對象。以下兩個生成 xpath 的方法

/// <summary>
/// 擷取短 xpath
/// </summary>
/// <param name="node"></param>
/// <returns></returns>
public string GetSmallXpath(GeckoNode node)
{
  if (node == null)
    return "";
  if (node.NodeType == NodeType.Attribute)
  {
    return String.Format("{0}/@{1}", GetSmallXpath(((GeckoAttribute)node).OwnerDocument), node.LocalName);
  }
  if (node.ParentNode == null)
  {
    return "";
  }
  string elementId = ((GeckoHtmlElement)node).Id;
  if (!String.IsNullOrEmpty(elementId))
  {
    return String.Format("//*[@id=\"{0}\"]", elementId);
  }
  int indexInParent = 1;
  GeckoNode siblingNode = node.PreviousSibling;
  while (siblingNode != null)
  {
    if (siblingNode.LocalName == node.LocalName)
    {
      indexInParent++;
    }
    siblingNode = siblingNode.PreviousSibling;
  }
  return String.Format("{0}/{1}[{2}]", GetSmallXpath(node.ParentNode), node.LocalName, indexInParent);
}
/// <summary>
/// 擷取長xpath
/// </summary>
/// <param name="node"></param>
/// <returns></returns>
public string GetXpath(GeckoNode node)
{
  if (node == null)
    return "";
  if (node.NodeType == NodeType.Attribute)
  {
    return String.Format("{0}/@{1}", GetXpath(((GeckoAttribute)node).OwnerDocument), node.LocalName);
  }
  if (node.ParentNode == null)
  {
    return "";
  }
  int indexInParent = 1;
  GeckoNode siblingNode = node.PreviousSibling;
  while (siblingNode != null)
  {
    if (siblingNode.LocalName == node.LocalName)
    {
      indexInParent++;
    }
    siblingNode = siblingNode.PreviousSibling;
  }
  return String.Format("{0}/{1}[{2}]", GetXpath(node.ParentNode), node.LocalName, indexInParent);
}      

獲得元素,生成 xpath

/// <summary>
/// 文檔單擊事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void browser_DomClick(object sender, DomMouseEventArgs e)
{
  var ele = e.CurrentTarget.CastToGeckoElement();
  ele = e.Target.CastToGeckoElement();
  //短xpath
  var xpath1 = GetSmallXpath(ele);
  Msg("xpath1:" + xpath1);
  //長xpath
  var xpath2 = GetXpath(ele);
}      

使用 xpath 查找元素

/// <summary>
/// 通過 xpath 查找元素,btnXpath button 的點選事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnXpath_Click(object sender, EventArgs e)
{
  if (string.IsNullOrWhiteSpace(_xpath))
    return;
  var xresult = browser.DomDocument.EvaluateXPath(_xpath);
  var nodes = xresult.GetNodes();
  var elements = nodes.Select(x => x as GeckoElement).ToArray();
  var html = FindElement(elements);
}
//獲得元素的 HTML 資訊
private string FindElement(params GeckoElement[] nodes)
{
  if (nodes == null)
  {
    return "無比對項...";
  }
  var html="";
  nodes.All(x =>
  {
    html = (x as GeckoHtmlElement).OuterHtml;
    return false;
  });
  return html;
}