5

コンソール アプリケーションがあり、その中に Web ブラウザを定義しました。まず、ページに移動してログインフォームに入力し、送信ボタンを呼び出してログインします。

その後、同じ Web ブラウザを使用して同じサイト内の別のページに移動したいのですが、そのページに移動しません。代わりに、ログイン後にリダイレクトされるページに移動します。

明確にするための私のコードは次のとおりです。このコードは、product.aspx の代わりに www.websiteiwanttogo.com/default.aspx のソース コードを提供します。

static WebBrowser wb = new WebBrowser();

    [STAThread]
    static void Main(string[] args)
    {
        wb.AllowNavigation = true;
        wb.Navigate("https://www.thewebsiteiwanttogo.com/login.aspx");
        wb.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(wb_DocumentCompleted);
        Application.Run();


    }

    static void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        if (wb.Url.ToString().IndexOf("login.aspx") > -1)
        {
            wb.Document.GetElementById("txtnumber").SetAttribute("value", "000001");
            wb.Document.GetElementById("txtUserName").SetAttribute("value", "myusername");
            wb.Document.GetElementById("txtPassword").SetAttribute("value", "mypassword");
            wb.Document.GetElementById("btnLogin").InvokeMember("click");


        }
        else
        {
            //wb.Document.Body  you are logged in do whatever you want here.
            wb.Navigate("https://www.thewebsiteiwanttogo.com/product.aspx");

            Console.WriteLine(wb.DocumentText);
            Console.ReadLine();
            Application.Exit();

        }
    }
4

1 に答える 1

6

この機能を実現するには、さまざまな方法があります。ただし、私の推測では次のようになります。

  1. 次のページに移動するための呼び出しが速すぎるか、または
  2. ログイン後にDocument.Completedイベントが適切に発生しない (これは、特に宛先ドキュメントに動的スクリプトが含まれている場合に一般的です)

私は多くの Web ページの自動化 (リンクからリンクへの移動、いくつかのアクションの実行、別のリンクへの移動など) を行ってきましたが、非同期プロセスの使用を検討する必要があります。webBrowser原則として、オブジェクトを処理する場合は、非同期プロセスを使用するのが常に最適です。これは、他の機能を実行している間に 1 つのプロセスを実行する必要がある場合が多いためです。

あまり詳しくは説明しませんが、次の質問への回答を見て、コードを調べてください: WebBrowser Navigate と InvokeScript のフロー

ただし、その実装を試す前に、ページに移動する前に async await を追加してみてください。(async await は a に似ていThread.Sleep()ますが、実際にはページの読み込み、つまり「スレッド」を停止しません)。

(非同期プロセスについて聞いたことがない場合は、MSDN のこのチュートリアルを参照してください)。

最初にこれを試してください:

static void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    if (wb.Url.ToString().IndexOf("login.aspx") > -1)
    {
        wb.Document.GetElementById("txtnumber").SetAttribute("value", "000001");
        wb.Document.GetElementById("txtUserName").SetAttribute("value", "myusername");
        wb.Document.GetElementById("txtPassword").SetAttribute("value", "mypassword");
        wb.Document.GetElementById("btnLogin").InvokeMember("click");


    }
    else
    {
        //wb.Document.Body  you are logged in do whatever you want here.
        await Task.Delay(1000); //wait for 1 second just to let the WB catch up
        wb.Navigate("https://www.thewebsiteiwanttogo.com/product.aspx");

        Console.WriteLine(wb.DocumentText);
        Console.ReadLine();
        Application.Exit();

    }
}

これで問題が解決しない場合は、上記のリンクを検討し、非同期プロセスを使用してより堅牢なナビゲーション シーケンスを実装してみてください。

それが機能せず、動的ページの移動または読み込みの待機についてヘルプが必要な場合は、次の投稿を試してください: .NET の WebBrowser または mshtml.HTMLDocument を使用して HTML コードを動的に生成する方法? 私はこのコード理論を何度も使用してきましたが、うまく機能します。

これらの方法のいずれかが役立つことを願っています! お知らせいただければ、より具体的なコード スニペットの生成をお手伝いできます。

編集:

Console.ReadLine()一見したところ、が のナビゲートをフリーズさせようとしていると推測wb.Navigate("https://www.thewebsiteiwanttogo.com/product.aspx");できます。ハンドラーに別のifステートメントを追加して、. 例えば:Document.Completedwb.Navigate("https://www.thewebsiteiwanttogo.com/product.aspx");wb.DocumentText

static void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    if (wb.Url.ToString().IndexOf("login.aspx") > -1)
    {
        wb.Document.GetElementById("txtnumber").SetAttribute("value", "000001");
        wb.Document.GetElementById("txtUserName").SetAttribute("value", "myusername");
        wb.Document.GetElementById("txtPassword").SetAttribute("value", "mypassword");
        wb.Document.GetElementById("btnLogin").InvokeMember("click");
    }
    else if(wb.Url.ToString().IndexOf("product.aspx") > -1)
    {
        Console.WriteLine(wb.DocumentText);
        Console.ReadLine();
        Application.Exit();
    }
    else
    {
        //wb.Document.Body  you are logged in do whatever you want here.
        await Task.Delay(1000); //wait for 1 second just to let the WB catch up
        wb.Navigate("https://www.thewebsiteiwanttogo.com/product.aspx");
    }
}
于 2015-03-27T17:40:51.433 に答える