【发布时间】:2017-04-08 17:33:59
【问题描述】:
我试图通过注入MockDate 并在其他所有脚本运行之前将其设置为某个固定日期来模拟 CefSharp 浏览器上的日期。每个 window 对象,在任何帧上,在任何时候,都应该只能访问模拟日期,所以理想的做法是在内部重新定义 JavaScript Date 对象,但我认为 CefSharp 甚至 Chromium 都没有这个选项。我还将模拟一些其他功能,例如setTimeout 和Math.rand,以防止浏览器产生任何副作用(这是一个更大的项目的一部分,其目的是能够记录/重播浏览活动),所以弄乱操作系统的时间并不能解决它。
我考虑过使用RegisterJsObject,因为它实际上可以覆盖现有的全局变量,但我认为没有办法传递 JavaScript 构造函数。
到目前为止我尝试的是处理FrameLoadStart 事件:
private static string Inject = File.ReadAllText("Inject.js");
private void ChromeBrowser_FrameLoadStart(object sender, FrameLoadStartEventArgs e)
{
e.Frame.ExecuteJavaScriptAsync(Inject);
}
其中“Inject.js”包含模拟日期代码。但我注意到,随机地,有时它会起作用,有时它不会。我猜是因为该函数是异步的,并且有时还没有创建 javascript 上下文,因为根据文档,您不应该在此处运行脚本。文档建议改为处理OnContextCreated,但它只在主框架上运行,这不会让我在任何 iframe 上注入代码。所以我想知道我是否有其他选择。
【问题讨论】:
-
如果您需要这种级别的控制,那么使用 CefGlue 或 ChromiumFx 可能会更好
-
@amaitland 将 CefSharp 修改为每帧触发
OnContextCreated有多难?你能指出我正确的方向吗? -
只搜索oncontextcreated的来源,只需几分钟即可找到
标签: javascript c# chromium chromium-embedded cefsharp