Je veux exécuter le code JavaScript
en utilisant CefSharp
dans Windows Forms, mais cela ne fonctionne pas. Le code est le suivant et le message test
n'est pas affiché. Ai-je oublié quelque chose?
var browser = new ChromiumWebBrowser("http://localhost:50056/simple.aspx");
browser.Name = "Simple Page";
browser.Dock = DockStyle.Fill;
this.Controls.Add(browser);
browser.ExecuteScriptAsync("alert('test');");
Vous devez attendre que le navigateur soit suffisamment chargé avant d'exécuter JavaScript. Il est tentant de commencer à essayer d'accéder au DOM dans OnFrameLoadStart, alors que le V8Context aura été créé et vous pourrez exécuter un script que le DOM n'aura pas fini de charger. Si vous devez accéder au DOM le plus tôt possible, puis abonnez-vous à DOMContentLoaded, quelques exemples d'exécution de JavaScript sont ci-dessous
browser.RenderProcessMessageHandler = new RenderProcessMessageHandler();
public class RenderProcessMessageHandler : IRenderProcessMessageHandler
{
// Wait for the underlying JavaScript Context to be created. This is only called for the main frame.
// If the page has no JavaScript, no context will be created.
void IRenderProcessMessageHandler.OnContextCreated(IWebBrowser browserControl, IBrowser browser, IFrame frame)
{
const string script = "document.addEventListener('DOMContentLoaded', function(){ alert('DomLoaded'); });";
frame.ExecuteJavaScriptAsync(script);
}
}
//Wait for the page to finish loading (all resources will have been loaded, rendering is likely still happening)
browser.LoadingStateChanged += (sender, args) =>
{
//Wait for the Page to finish loading
if (args.IsLoading == false)
{
browser.ExecuteJavaScriptAsync("alert('All Resources Have Loaded');");
}
}
//Wait for the MainFrame to finish loading
browser.FrameLoadEnd += (sender, args) =>
{
//Wait for the MainFrame to finish loading
if(args.Frame.IsMain)
{
args.Frame.ExecuteJavaScriptAsync("alert('MainFrame finished loading');");
}
};