我正在尝试编程登录到ESPN.com之类的网站。设置网站的设置方式是我单击主页上的登录按钮,在屏幕中间显示弹出窗口中的登录,背景略微着色。我的目标是以编程方式获取该弹出框,提供用户名和密码,然后提交 - 希望将cookie返回给我作为身份验证。但是,由于JavaScript用于显示表单,因此我不一定可以轻松地通过主页的HTML访问表单的输入标签。
我尝试研究了诸如HTTPCLIENT和HTTPWEBREQUEST等各种解决方案,但是由于使用JavaScript显示登录表单,因此WebBrowser似乎是最好的。由于我不一定容易访问该表单的输入标签,因此WebBrowser似乎是捕获弹出窗口的输入元素的最佳选择。
class ESPNLoginViewModel
{
private string Url;
private WebBrowser webBrowser1 = new WebBrowser();
private SHDocVw.WebBrowser_V1 Web_V1;
public ESPNLoginViewModel()
{
Initialize();
}
private void Initialize()
{
Url = "http://www.espn.com/";
Login();
}
private void Login()
{
webBrowser1.Navigate(Url);
webBrowser1.DocumentCompleted +=
new WebBrowserDocumentCompletedEventHandler(webpage_DocumentCompleted);
Web_V1 = (SHDocVw.WebBrowser_V1)this.webBrowser1.ActiveXInstance;
Web_V1.NewWindow += new SHDocVw.DWebBrowserEvents_NewWindowEventHandler(Web_V1_NewWindow);
}
//This never gets executed
private void Web_V1_NewWindow(string URL, int Flags, string TargetFrameName, ref object PostData, string Headers, ref bool Processed)
{
//I'll start determing how to code this once I'm able to get this invoked
}
private void webpage_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
HtmlElement loginButton = webBrowser1.Document.GetElementsByTagName("button")[5];
loginButton.InvokeMember("click");
//I've also tried the below InvokeScript method to see if executing the javascript that
//is called when the Log In button is clicked, however Web_V1_NewWindow still wasn't called.
//webBrowser1.Document.InvokeScript("buildOverlay");
}
}
我希望在调用InvokeMember(" click"(方法时调用Web_v1_newwindow处理程序。但是,代码执行仅通过WebPage_documentCompleted处理程序运行,而无需拨打Web_v1_newwindow的任何呼叫。可能是我需要使用与InvokeMember("单击"(不同的方法来调用登录按钮的点击事件处理程序。或者我可能需要完全尝试完全不同的东西。我不是100%确定web_v1.newwindow是适合我需求的正确方法,但是我看到Newwindow在处理弹出窗口时经常使用,所以我认为我应该尝试一下。
>我花了大量时间在此方面都将不胜感激。
我知道这是晚答案。但这将帮助别人。您可以通过遵循
从帧元素提取值// Get frame using frame ID
HtmlWindow frameWindow = (from HtmlWindow win
in WbBrowser.Document.Window.Frames select win)
.Where(x => string.Compare(x.WindowFrameElement.Id, "frm1") == 0)
.FirstOrDefault();
// Get first frame textbox with ID
HtmlElement txtElement = (from HtmlElement element
in frameWindow.Document.GetElementsByTagName("input")
select element)
.Where(x => string.Compare(x.Id, "txt") == 0).FirstOrDefault();
// Check txtElement is nul or not
if(txtElement != null)
{
Label1.Text = txtElement.GetAttribute("value");
}
有关更多详细信息检查本文