CefSharp 注入js的两种方法

我们在应用程序嵌入浏览器的过程中,或多或少需要插入js实现一些功能。

 

下面介绍下CefSharp注入js的两种方法。

一、js代码量较少的情况下

string script = "function showmessage(){alert('调用了!');};";
string jscode = "var script = document.createElement(\"script\");\r\n";
jscode += "script.type = \"text/javascript\";\r\n";
jscode += $"script.text = \"{script}\";";
jscode += "document.body.appendChild(script);"; 
ChromeBrowser.ExecuteJavaScriptAsync(jscode);

二、代码量较多,或者代码中包含双引号等字符的情况下。可将文件保存为js文件,然后上传到服务器,使用一下方法注入

string jscode = "var script = document.createElement(\"script\");\r\n";
jscode += "script.type = \"text/javascript\";\r\n";
jscode += $"script.src = \"https://yoururl.com/test.js?v=" + getTime() + "\";\r\n";
jscode += "document.body.appendChild(script);";
ChromeBrowser.ExecuteJavaScriptAsync(jscode);

后面带的gettime是获取本地的时间戳,可以防止js缓存

如果目标站点是iframe结构的,使用以下方法可注入到指定的iframe页面

ChromeBrowser.GetBrowser().GetFrame("yourFrameName").ExecuteJavaScriptAsync(jscode);

以上就是CefSharp注入js的两种方法。

顺便说说WebBrowser注入js的方法

var tag = browser.Document.CreateElement("script");
var scriptElement = tag.DomElement as IHTMLScriptElement;
scriptElement.type = "text/javascript";//设定为Javascript
scriptElement.text = script;//设置内容
browser.Document.Body.AppendChild(tag);

指定iframe

var tag = browser.Document.Window.Frames["yourFrameName"].Document.CreateElement("script");
var scriptElement = tag.DomElement as IHTMLScriptElement;
scriptElement.type = "text/javascript";//设定为Javascript
scriptElement.text = script;//设置内容
browser.Document.Window.Frames["yourFrameName"].Document.Body.AppendChild(tag);

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 `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` 代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值