我正在尝试以编程方式登录到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(“ click”)的方法来调用“登录”按钮的click事件处理程序。或者,我可能需要尝试完全不同的东西。我不是100%肯定Web_V1.NewWindow是满足我需求的正确方法,但是我已经看到NewWindow在处理弹出窗口时经常使用,所以我想应该尝试一下。
由于我在此上花费了很多时间,因此任何帮助将不胜感激。
答案 0 :(得分:0)
我知道答案很晚。但这会帮助别人。 您可以按照以下步骤从FRAME元素中提取值:
// 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");
}
有关更多详细信息,请检查 this article