cefsharp注入javascript在网页上点击后通过javascript返回给C#端点击元素的xpath
时间: 2024-03-19 22:44:18 浏览: 169
要在 `CefSharp` 中注入 `JavaScript` 并从网页上点击后返回点击元素的 `XPath`,您可以使用以下步骤:
1. 在 `CefSharp` 控件的 `FrameLoadEnd` 事件中注入 `JavaScript` 代码。
```csharp
private void ChromiumWebBrowserFrameLoadEnd(object sender, FrameLoadEndEventArgs e)
{
if (e.Frame.IsMain)
{
e.Frame.ExecuteJavaScriptAsync(@"
function handleClick(event) {
var target = event.target || event.srcElement;
window.external.notify(target.tagName + '|' + target.id + '|' + target.className + '|' + getXPath(target));
}
function getXPath(node) {
if (node && node.nodeType == Node.ELEMENT_NODE) {
var xpath = '';
var element = node;
while (element) {
var id = element.getAttribute('id');
var tagName = element.tagName.toLowerCase();
var siblings = element.parentNode.children;
var siblingIndex = 1;
for (var i = 0; i < siblings.length; i++) {
if (siblings[i] == element) {
xpath = '/' + tagName + '[' + siblingIndex + ']' + xpath;
break;
}
if (siblings[i].tagName == tagName) {
siblingIndex++;
}
}
element = element.parentNode;
}
return xpath;
}
return null;
}
document.addEventListener('click', handleClick);
");
}
}
```
上面的 `JavaScript` 代码会在网页上注入一个 `click` 事件监听器,当用户在网页上单击时,会将点击元素的 `tagName`、`id`、`className` 和 `XPath` 信息通过 `window.external.notify()` 方法发送给 `C#` 端。
2. 在 `C#` 端注册 `JavascriptObjectRepository` 对象,并实现 `IJavascriptCallback` 接口。
```csharp
public class ClickedElementInfo
{
public string TagName { get; set; }
public string Id { get; set; }
public string ClassName { get; set; }
public string XPath { get; set; }
}
public class JsCallback : IJavascriptCallback
{
public void Dispose()
{
}
public void InvokeAsync(object[] args)
{
var clickedElementInfo = new ClickedElementInfo();
var info = ((string)args[0]).Split('|');
clickedElementInfo.TagName = info[0];
clickedElementInfo.Id = info[1];
clickedElementInfo.ClassName = info[2];
clickedElementInfo.XPath = info[3];
// TODO: 处理点击元素信息
}
}
public class JsObject
{
public void NotifyClickedElement(string clickedElementInfo)
{
var jsCallback = new JsCallback();
jsCallback.InvokeAsync(new object[] { clickedElementInfo });
}
}
var jsObject = new JsObject();
browser.JavascriptObjectRepository.Register("external", jsObject, true);
```
上面的代码会将 `JsObject` 对象注册为 `JavascriptObjectRepository` 中的 `external` 对象,当 `JavaScript` 通过 `window.external.notify()` 方法发送信息时,会调用 `JsObject.NotifyClickedElement()` 方法,并将点击元素信息作为参数传递给 `C#` 端。
3. 在 `C#` 端处理点击元素信息。
```csharp
private void HandleClickedElementInfo(ClickedElementInfo clickedElementInfo)
{
// TODO: 处理点击元素信息
}
```
上面的代码会将点击元素信息作为参数传递给 `HandleClickedElementInfo()` 方法,您可以在该方法中处理点击元素信息,例如打印到控制台或将信息保存到文件中。
注意:上面的代码仅适用于 `CefSharp` 版本 75 或更高版本。如果您使用的是更早的版本,请升级到最新版本。另外,如果您需要获取其他元素的信息,可以相应地修改 `JavaScript` 代码。
阅读全文