我试图通过注入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);
}
In" Inject.js"包含模拟日期代码。但我已经注意到,随机,有时候它会起作用,有时它会不会发生。我想因为函数是异步的并且javascript上下文有时候还没有被创建,因为根据文档你不应该在这里运行脚本。文档建议改为处理OnContextCreated,但它仅针对主框架运行,这不允许我在任何iframe上注入代码。所以我想知道我是否有其他选择。
答案 0 :(得分:1)
如果其他人需要这个,解决方法是通过在CefAppUnmanagedWrapper::OnContextCreated
末尾添加一行来修改实际的C ++ CefSharp代码:
frame->ExecuteJavaScript(CodeToInject, "something://something", 1);
如果在C#端注入,这将无法工作,我相信因为这些调用是异步的,所以在页面上的脚本运行之后你可能会注入它太晚了。
答案 1 :(得分:0)
如果您可以编辑HTML入口点,那么您可以在任何其他脚本之前添加window.Date = MockDate
。例如:
<html>
<body>
<script src="mockdate.js"></script>
<script>
window.Date = MockDate
</script>
<script src="myscript.js"></script>
</body>
</html>
因此,您可以调整HTML中的脚本加载顺序。它可以在任何浏览器中完成。
如果您不能或不想编辑HTML,那么它就会变得更加棘手。您可以在CEF C ++中使用CefLoadHandler或在CefSharp中使用它。
UPD 实际上我不确定CefLoadHandler。可靠的方法是实现自己的CefRenderProcessHandler但是你已经提到了它。如果它不起作用那么它就是CefSharp或CEF C ++本身的一个错误。在这种情况下,最好在http://magpcss.org/ceforum/
上写一下