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;
}