0

少し前にこの質問をしましたが、答えがないようです。別の解決策を試してみましたが、今は行き詰まっています。次のコードを参照してください。

        WebBrowser objWebBrowser = new WebBrowser();
        objWebBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(objWebBrowser_DocumentCompleted);
        objWebBrowser.Navigate("http://www.website.com/login.php?user=xxx&pass=xxx");
        objWebBrowser.Navigate("http://www.website.com/page.php?link=url");

そして、ここにイベントコードがあります:

        WebBrowser objWebBrowser = (WebBrowser)sender;
        String data = new StreamReader(objWebBrowser.DocumentStream).ReadToEnd();

ドキュメントが読み込まれる前にWebBrowser.Document.Cookiesを使用することは不可能なので、最初にログインページをナビゲートする必要があります。これにより、Cookieが自動的に保存されますが、その後、他のナビゲートを呼び出して、結果。上記のコードを使用すると、常に2番目のコードが必要になるため、機能しません。また、イベントに配置しても機能しません。必要なものは次のようになります。

  • ログインページでナビゲートし、Cookieを1回だけ保存します。
  • 結果を取得するたびに異なるURLを渡します。

誰かが解決策を与えることができますか?

編集:

たぶん私が提供したコードのサンプルは誤解を招くものでした、私が欲しいのは:

foreach(url in urls)
{
  Webborwser1.Navigate(url);
  //Then wait for the above to complete and get the result from the event, then continue
}
4

1 に答える 1

0

許可されていない場合は、Navigate へのブロッキング呼び出しをシミュレートしたいと思います。これを実現する方法や、必要なものを取得するための他の方法はおそらくたくさんありますが、ここでは、作業を開始するのに役立つコードをいくつか簡単に作成しました。

ここでやろうとしていることについてご不明な点がございましたら、お知らせください。もっとスマートな解決策があると思わせる「ハック」のように感じることは認めますが、とにかく....

bool authorized = false;
bool navigated;
WebBrowser objWebBrowser = new WebBrowser();
void GetResults(string url)
{
    if(!authorized)
    {
        NavigateAndBlockWithSpinLock("http://www.website.com/login.php?user=xxx&pass=xxx");
        authorized = true;
    }
    objWebBrowser.Navigate(url);
}

void NavigateAndBlockWithSpinLock(string url)
{
    navigated = false;

    objWebBrowser.DocumentCompleted += NavigateDone;

    objWebBrowser.Navigate(url);

    int count = 0;
    while(!navigated && count++ < 10)
        Thread.Sleep(1000);

    objWebBrowser.DocumentCompleted -= NavigateDone;

    if(!navigated)
        throw new Exception("fail");
}

void NavigateDone(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    navigated = true;
}

void objWebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    if(authorized)
    {
        WebBrowser objWebBrowser = (WebBrowser)sender;
        String data = new StreamReader(objWebBrowser.DocumentStream).ReadToEnd();
    }
}
于 2013-01-28T08:24:51.787 に答える