WebBrowser Navigate和InvokeScript的流程
我无法理解我正在构建的这个函数的流程。
public void PortalLogin(AutoResetEvent signal) { // Navigate to portal string portalUrl = "website_name"; string portalEmail = "email@email.com"; string portalPassword = "password"; Action action2 = () => { webBrowser2.Tag = signal; webBrowser2.Navigate(portalUrl); webBrowser2.DocumentCompleted -= WebBrowserDocumentCompleted; webBrowser2.DocumentCompleted += WebBrowserDocumentCompleted; }; webBrowser2.Invoke(action2); signal.WaitOne(); // Login to O365 portal webBrowser2.Invoke(new Action(() => { HtmlElement head = webBrowser2.Document.GetElementsByTagName("head")[0]; HtmlElement testScript = webBrowser2.Document.CreateElement("script"); IHTMLScriptElement element = (IHTMLScriptElement)testScript.DomElement; element.text = "function PortalLogin() { document.getElementById('userid').value = '" + portalEmail + "'; document.getElementById('password').value = '" + portalPassword + "'; document.getElementById('login').submit(); }"; head.AppendChild(testScript); webBrowser2.Document.InvokeScript("PortalLogin"); })); } ... more functions after this
当我单步执行它时,它似乎没有调用document.getElementById('login').submit();
脚本的一部分“及时”。 在InvokeScript
完全完成之前,如何确保没有任何InvokeScript
?
此外 – 如果你看到任何多余的代码或可以清理的东西,那也很棒。
编辑 :这是DocumentCompleted函数。
private void WebBrowserDocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs Url) { ((AutoResetEvent)((WebBrowser)sender).Tag).Set(); }
几点:
您可以在PortalLogin
外部添加DocumentCompleted
事件处理程序, PortalLogin
用相同的处理程序。 您正在使用AutoResetEvent
,它会在signal.WaitOne()
之后自动重置为非信号状态,因此您只需使用DocumentCompleted
一个永久处理程序即可。
你确定document.getElementById('login')
返回一个有submit
方法的有效元素吗? 在调用InvokeScript
之前validation。 您可以分两步进行登录,例如:
element.text = "function PortalLogin() { document.getElementById('userid').value = '" + portalEmail + "'; document.getElementById('password').value = '" + portalPassword + "'; }" + "function ExecuteLogin() { document.getElementById('login').submit(); }"; head.AppendChild(testScript); webBrowser2.Document.InvokeScript("PortalLogin"); // verify document.getElementById('login') here webBrowser2.Document.InvokeScript("ExecuteLogin");
注意:如果成功,提交最终会触发另一个DocumentCompleted
事件。
我将使用单线程和await / async模式重构此代码。 DocumentCompleted
可以作为TaskCompletionSource
的任务TaskCompletionSource
(这里是如何 )。
下面是使用async/await
样子。 在有MessageBox.Show
地方你可以做你的DOM操作。 注意,它都是在主UI线程上完成的(当然是异步的)。 对我来说看起来相当容易。
上述就是C#学习教程:WebBrowser Navigate和InvokeScript的流程分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
void Form1_Load(object sender, EventArgs e) { var task = DoNavigationAsync(); task.ContinueWith((t) => { MessageBox.Show("Navigation done!"); }, TaskScheduler.FromCurrentSynchronizationContext()); } struct Void {}; // use an empty struct as parameter to generic TaskCompletionSource async Task DoNavigationAsync() { Void v; TaskCompletionSource tcs = null; WebBrowserDocumentCompletedEventHandler documentComplete = null; documentComplete = new WebBrowserDocumentCompletedEventHandler((s, e) => { // more of DocumentCompleted can possibly be fired due to dynamic navigation inside the web page, we don't want them! this.WB.DocumentCompleted -= documentComplete; tcs.SetResult(v); // continue from where awaited }); // navigate to www.bing.com tcs = new TaskCompletionSource (); this.WB.DocumentCompleted += documentComplete; this.WB.Navigate("https://www.bing.com"); await tcs.Task; // do whatever you want with this instance of WB.Document MessageBox.Show(this.WB.Document.Url.ToString()); // navigate to www.google.com tcs = new TaskCompletionSource (); this.WB.DocumentCompleted += documentComplete; this.WB.Navigate("https://www.google.com"); await tcs.Task; // do whatever you want with this instance of WB.Document MessageBox.Show(this.WB.Document.Url.ToString()); // navigate to www.yahoo.com tcs = new TaskCompletionSource (); this.WB.DocumentCompleted += documentComplete; this.WB.Navigate("https://www.yahoo.com"); await tcs.Task; // do whatever you want with this instance of WB.Document MessageBox.Show(this.WB.Document.Url.ToString()); return; }
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/953407.html