我前一段时间问question,但似乎没有答案,所以我尝试使用替代解决方案,但我现在卡住了,请看下面的代码:
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,但之后我想调用另一个按顺序导航得到一个结果。现在使用上面的代码它不起作用,因为它总是需要第二个,并且它不适用于我把它放在事件中因为我想要的是这样的:
有人可以提供解决方案吗?
编辑:
也许我提供的代码示例具有误导性,我想要的是:
foreach(url in urls)
{
Webborwser1.Navigate(url);
//Then wait for the above to complete and get the result from the event, then continue
}
答案 0 :(得分: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();
}
}