0

我是编码的初学者,我尝试将autofill用户名和密码输入一个页面,但是当我点击登录时,代码仍然getelementbyid在下一页上搜索(所有页面都在同一个域下)并崩溃。我正在使用 Visual Studio 2k17

在此先感谢,任何帮助都是完美的!

using System;
using System.Windows.Forms;
using DotNetBrowser;
using DotNetBrowser.DOM;
using DotNetBrowser.Events;
using DotNetBrowser.WinForms;

namespace WindowsFormsApp9
{
    class Program
    {
        public class WindowMain : Form
        {
            private WinFormsBrowserView browserView;

            public WindowMain()
            {
                Browser browser = BrowserFactory.Create();
                browserView = new WinFormsBrowserView(browser);

                browser.FinishLoadingFrameEvent += delegate (object sender, FinishLoadingEventArgs e)
                {

                    if (e.IsMainFrame)
                    {
                        DOMDocument document = e.Browser.GetDocument();
                        DOMInputElement username = (DOMInputElement)document.GetElementById("id_Username");
                        DOMInputElement password = (DOMInputElement)document.GetElementById("id_Password");


                        username.Value = "fo2";
                        password.Value = "f2342156f";

                    }
                };

                this.Controls.Add(browserView);

                Width = 1024;
                Height = 768;
                this.Load += WindowMain_Loaded;
            }

            void WindowMain_Loaded(object sender, EventArgs e)
            {
                browserView.Browser.LoadURL("http://test.com");
            }

            [STAThread]
            public static void Main()
            {
                WindowMain wnd = new WindowMain();
                Application.Run(wnd);

                var browser = wnd.browserView.Browser;
                wnd.browserView.Dispose();
                browser.Dispose();
            }
        }
    }
}
4

1 回答 1

0

Browser.FinishLoadingFrameEvent每次网页完全加载时都会引发该事件。因此,应用程序崩溃了,因为它仍在为下一个网页上不存在的元素设置值。

FinishLoadingFrameEvent要解决此问题,有必要在登录代码执行后添加验证 URL 的检查并取消订阅。

这是一个重新设计的示例:

using System;
using System.Windows.Forms;
using DotNetBrowser;
using DotNetBrowser.DOM;
using DotNetBrowser.Events;
using DotNetBrowser.WinForms;

namespace WindowsFormsApp9
{
    class Program
    {
        public class WindowMain : Form
        {
            private WinFormsBrowserView browserView;

            public WindowMain()
            {
                Browser browser = BrowserFactory.Create();
                browserView = new WinFormsBrowserView(browser);

                browser.FinishLoadingFrameEvent += Browser_FinishLoadingFrameEvent;

                this.Controls.Add(browserView);

                Width = 1024;
                Height = 768;
                this.Load += WindowMain_Loaded;
            }

            private void Browser_FinishLoadingFrameEvent(object sender, FinishLoadingEventArgs e)
            {
                if(e.IsMainFrame && e.ValidatedURL.Contains("loginURL"))
                {
                    DOMDocument document = e.Browser.GetDocument();
                    DOMInputElement username = (DOMInputElement)document.GetElementById("id_Username");
                    DOMInputElement password = (DOMInputElement)document.GetElementById("id_Password");

                    username.Value = "fo2";
                    password.Value = "f2342156f";

                    e.Browser.FinishLoadingFrameEvent -= Browser_FinishLoadingFrameEvent;
                }
            }

            void WindowMain_Loaded(object sender, EventArgs e)
            {
                browserView.Browser.LoadURL("http://test.com");
            }

            [STAThread]
            public static void Main()
            {
                WindowMain wnd = new WindowMain();
                Application.Run(wnd);

                var browser = wnd.browserView.Browser;
                wnd.browserView.Dispose();
                browser.Dispose();
            }
        }
    }
}
于 2018-07-06T14:58:58.033 回答