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





  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值