CefSharp Winforms - Execute javascript before showing browser












0















I am trying to load a page and execute some javascript before showing the browser to the user. This because i want to take them through some screens before they get it shown (selenium like), and i only want to show it when i require their input (Wich is after the 2nd pageload).



Unfortunatly i cant go to that page directly, i have to click a link first. But whatever i try, it will still show the browser, then execute the javascript. My current test is below, was playing around with browser.visible, but that doesnt work either, i still see the js being executed.



(Site and javascript are dummy values)



 public ChromiumWebBrowser browser;
public void InitBrowser()
{
Cef.Initialize(new CefSettings());
browser = new ChromiumWebBrowser("https://www.bing.com/");
this.Controls.Add(browser);
browser.Visible = false;
browser.FrameLoadEnd += (sender, args) =>
{
//Wait for the MainFrame to finish loading
if (args.Frame.IsMain)
{
//do this first
browser.ExecuteScriptAsyncWhenPageLoaded("document.getElementById('sb_form_q').value = 'test';",true);
browser.ExecuteScriptAsyncWhenPageLoaded("document.getElementById('sb_form_go').click();",true);

}
};
browser.FrameLoadEnd += (sender, args) =>
{
//Wait for the MainFrame to finish loading
if (args.Frame.IsMain)
{
//when page is loaded again, do this:
browser.ExecuteScriptAsync("document.getElementById('hplogo').src='https://logos-download.com/wp-content/uploads/2016/02/bing-tm-logo.png'");

}
};
//then show browser again
browser.Visible = true;
}









share|improve this question























  • You are setting Visible = false then adding actions to events (not executing the actions) then setting Visible = true when the events might not have fired yet. Try putting browser.Visible = true within one of the events or create a new event to trigger it to show or use .ContinueWith( () => { browser.Visible = true; } );

    – Minijack
    Nov 28 '18 at 22:11













  • You can connect Puppeteer Sharp to a running instance for automation purposes. Your code doesn't handle the FrameLoadEnd event properly, subscribing twice doesn't mean first run will be first handler, second will be second handler. Both handlers will fire. You have to subscribe, unsubscribe, subscribe a different handler. Or just check the frame url in the one handler.

    – amaitland
    Nov 29 '18 at 0:14











  • How can i check the frameurl in a handler? .Adress doesnt exist according to VS

    – Martijn Deleij
    Nov 29 '18 at 5:55











  • cefsharp.github.io/api/67.0.0/html/P_CefSharp_IFrame_Url.htm

    – amaitland
    Nov 29 '18 at 10:04
















0















I am trying to load a page and execute some javascript before showing the browser to the user. This because i want to take them through some screens before they get it shown (selenium like), and i only want to show it when i require their input (Wich is after the 2nd pageload).



Unfortunatly i cant go to that page directly, i have to click a link first. But whatever i try, it will still show the browser, then execute the javascript. My current test is below, was playing around with browser.visible, but that doesnt work either, i still see the js being executed.



(Site and javascript are dummy values)



 public ChromiumWebBrowser browser;
public void InitBrowser()
{
Cef.Initialize(new CefSettings());
browser = new ChromiumWebBrowser("https://www.bing.com/");
this.Controls.Add(browser);
browser.Visible = false;
browser.FrameLoadEnd += (sender, args) =>
{
//Wait for the MainFrame to finish loading
if (args.Frame.IsMain)
{
//do this first
browser.ExecuteScriptAsyncWhenPageLoaded("document.getElementById('sb_form_q').value = 'test';",true);
browser.ExecuteScriptAsyncWhenPageLoaded("document.getElementById('sb_form_go').click();",true);

}
};
browser.FrameLoadEnd += (sender, args) =>
{
//Wait for the MainFrame to finish loading
if (args.Frame.IsMain)
{
//when page is loaded again, do this:
browser.ExecuteScriptAsync("document.getElementById('hplogo').src='https://logos-download.com/wp-content/uploads/2016/02/bing-tm-logo.png'");

}
};
//then show browser again
browser.Visible = true;
}









share|improve this question























  • You are setting Visible = false then adding actions to events (not executing the actions) then setting Visible = true when the events might not have fired yet. Try putting browser.Visible = true within one of the events or create a new event to trigger it to show or use .ContinueWith( () => { browser.Visible = true; } );

    – Minijack
    Nov 28 '18 at 22:11













  • You can connect Puppeteer Sharp to a running instance for automation purposes. Your code doesn't handle the FrameLoadEnd event properly, subscribing twice doesn't mean first run will be first handler, second will be second handler. Both handlers will fire. You have to subscribe, unsubscribe, subscribe a different handler. Or just check the frame url in the one handler.

    – amaitland
    Nov 29 '18 at 0:14











  • How can i check the frameurl in a handler? .Adress doesnt exist according to VS

    – Martijn Deleij
    Nov 29 '18 at 5:55











  • cefsharp.github.io/api/67.0.0/html/P_CefSharp_IFrame_Url.htm

    – amaitland
    Nov 29 '18 at 10:04














0












0








0








I am trying to load a page and execute some javascript before showing the browser to the user. This because i want to take them through some screens before they get it shown (selenium like), and i only want to show it when i require their input (Wich is after the 2nd pageload).



Unfortunatly i cant go to that page directly, i have to click a link first. But whatever i try, it will still show the browser, then execute the javascript. My current test is below, was playing around with browser.visible, but that doesnt work either, i still see the js being executed.



(Site and javascript are dummy values)



 public ChromiumWebBrowser browser;
public void InitBrowser()
{
Cef.Initialize(new CefSettings());
browser = new ChromiumWebBrowser("https://www.bing.com/");
this.Controls.Add(browser);
browser.Visible = false;
browser.FrameLoadEnd += (sender, args) =>
{
//Wait for the MainFrame to finish loading
if (args.Frame.IsMain)
{
//do this first
browser.ExecuteScriptAsyncWhenPageLoaded("document.getElementById('sb_form_q').value = 'test';",true);
browser.ExecuteScriptAsyncWhenPageLoaded("document.getElementById('sb_form_go').click();",true);

}
};
browser.FrameLoadEnd += (sender, args) =>
{
//Wait for the MainFrame to finish loading
if (args.Frame.IsMain)
{
//when page is loaded again, do this:
browser.ExecuteScriptAsync("document.getElementById('hplogo').src='https://logos-download.com/wp-content/uploads/2016/02/bing-tm-logo.png'");

}
};
//then show browser again
browser.Visible = true;
}









share|improve this question














I am trying to load a page and execute some javascript before showing the browser to the user. This because i want to take them through some screens before they get it shown (selenium like), and i only want to show it when i require their input (Wich is after the 2nd pageload).



Unfortunatly i cant go to that page directly, i have to click a link first. But whatever i try, it will still show the browser, then execute the javascript. My current test is below, was playing around with browser.visible, but that doesnt work either, i still see the js being executed.



(Site and javascript are dummy values)



 public ChromiumWebBrowser browser;
public void InitBrowser()
{
Cef.Initialize(new CefSettings());
browser = new ChromiumWebBrowser("https://www.bing.com/");
this.Controls.Add(browser);
browser.Visible = false;
browser.FrameLoadEnd += (sender, args) =>
{
//Wait for the MainFrame to finish loading
if (args.Frame.IsMain)
{
//do this first
browser.ExecuteScriptAsyncWhenPageLoaded("document.getElementById('sb_form_q').value = 'test';",true);
browser.ExecuteScriptAsyncWhenPageLoaded("document.getElementById('sb_form_go').click();",true);

}
};
browser.FrameLoadEnd += (sender, args) =>
{
//Wait for the MainFrame to finish loading
if (args.Frame.IsMain)
{
//when page is loaded again, do this:
browser.ExecuteScriptAsync("document.getElementById('hplogo').src='https://logos-download.com/wp-content/uploads/2016/02/bing-tm-logo.png'");

}
};
//then show browser again
browser.Visible = true;
}






c# cefsharp






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 28 '18 at 22:07









Martijn DeleijMartijn Deleij

76




76













  • You are setting Visible = false then adding actions to events (not executing the actions) then setting Visible = true when the events might not have fired yet. Try putting browser.Visible = true within one of the events or create a new event to trigger it to show or use .ContinueWith( () => { browser.Visible = true; } );

    – Minijack
    Nov 28 '18 at 22:11













  • You can connect Puppeteer Sharp to a running instance for automation purposes. Your code doesn't handle the FrameLoadEnd event properly, subscribing twice doesn't mean first run will be first handler, second will be second handler. Both handlers will fire. You have to subscribe, unsubscribe, subscribe a different handler. Or just check the frame url in the one handler.

    – amaitland
    Nov 29 '18 at 0:14











  • How can i check the frameurl in a handler? .Adress doesnt exist according to VS

    – Martijn Deleij
    Nov 29 '18 at 5:55











  • cefsharp.github.io/api/67.0.0/html/P_CefSharp_IFrame_Url.htm

    – amaitland
    Nov 29 '18 at 10:04



















  • You are setting Visible = false then adding actions to events (not executing the actions) then setting Visible = true when the events might not have fired yet. Try putting browser.Visible = true within one of the events or create a new event to trigger it to show or use .ContinueWith( () => { browser.Visible = true; } );

    – Minijack
    Nov 28 '18 at 22:11













  • You can connect Puppeteer Sharp to a running instance for automation purposes. Your code doesn't handle the FrameLoadEnd event properly, subscribing twice doesn't mean first run will be first handler, second will be second handler. Both handlers will fire. You have to subscribe, unsubscribe, subscribe a different handler. Or just check the frame url in the one handler.

    – amaitland
    Nov 29 '18 at 0:14











  • How can i check the frameurl in a handler? .Adress doesnt exist according to VS

    – Martijn Deleij
    Nov 29 '18 at 5:55











  • cefsharp.github.io/api/67.0.0/html/P_CefSharp_IFrame_Url.htm

    – amaitland
    Nov 29 '18 at 10:04

















You are setting Visible = false then adding actions to events (not executing the actions) then setting Visible = true when the events might not have fired yet. Try putting browser.Visible = true within one of the events or create a new event to trigger it to show or use .ContinueWith( () => { browser.Visible = true; } );

– Minijack
Nov 28 '18 at 22:11







You are setting Visible = false then adding actions to events (not executing the actions) then setting Visible = true when the events might not have fired yet. Try putting browser.Visible = true within one of the events or create a new event to trigger it to show or use .ContinueWith( () => { browser.Visible = true; } );

– Minijack
Nov 28 '18 at 22:11















You can connect Puppeteer Sharp to a running instance for automation purposes. Your code doesn't handle the FrameLoadEnd event properly, subscribing twice doesn't mean first run will be first handler, second will be second handler. Both handlers will fire. You have to subscribe, unsubscribe, subscribe a different handler. Or just check the frame url in the one handler.

– amaitland
Nov 29 '18 at 0:14





You can connect Puppeteer Sharp to a running instance for automation purposes. Your code doesn't handle the FrameLoadEnd event properly, subscribing twice doesn't mean first run will be first handler, second will be second handler. Both handlers will fire. You have to subscribe, unsubscribe, subscribe a different handler. Or just check the frame url in the one handler.

– amaitland
Nov 29 '18 at 0:14













How can i check the frameurl in a handler? .Adress doesnt exist according to VS

– Martijn Deleij
Nov 29 '18 at 5:55





How can i check the frameurl in a handler? .Adress doesnt exist according to VS

– Martijn Deleij
Nov 29 '18 at 5:55













cefsharp.github.io/api/67.0.0/html/P_CefSharp_IFrame_Url.htm

– amaitland
Nov 29 '18 at 10:04





cefsharp.github.io/api/67.0.0/html/P_CefSharp_IFrame_Url.htm

– amaitland
Nov 29 '18 at 10:04












0






active

oldest

votes












Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53528846%2fcefsharp-winforms-execute-javascript-before-showing-browser%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























0






active

oldest

votes








0






active

oldest

votes









active

oldest

votes






active

oldest

votes
















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53528846%2fcefsharp-winforms-execute-javascript-before-showing-browser%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

A CLEAN and SIMPLE way to add appendices to Table of Contents and bookmarks

Calculate evaluation metrics using cross_val_predict sklearn

Insert data from modal to MySQL (multiple modal on website)