C# 对多个页面使用webbrowser
我正在做一个项目。在我的mssql服务器上,我有很多URL,我需要检查我是否可以登录。以下是我目前的代码:C# 对多个页面使用webbrowser,c#,sql-server,C#,Sql Server,我正在做一个项目。在我的mssql服务器上,我有很多URL,我需要检查我是否可以登录。以下是我目前的代码: public List<WebBrowser> myBrowsers = new List<WebBrowser>(); private void button3_Click(object sender, EventArgs e) { SqlConnection connection = new SqlConnect
public List<WebBrowser> myBrowsers = new List<WebBrowser>();
private void button3_Click(object sender, EventArgs e)
{
SqlConnection connection = new SqlConnection(connectionString);
connection.Open();
SiteeeID = Convert.ToInt32(listBox1.SelectedValue);
string url = "select http,username,pass,userID,passID,butonID from AyrintiSite where username!=''";
DataTable dt = new DataTable();
using (SqlConnection cn = new SqlConnection(connectionString))
{
using (SqlCommand cm = new SqlCommand(url, cn))
{
cn.Open();
dt.Load(cm.ExecuteReader());
}
}
for (int i = 0; i < dt.Rows.Count; i++)
{
WebBrowser browser = new WebBrowser();
browser.DocumentCompleted += webBrowserDocumentCompleted;
browser.Navigate(dt.Rows[i][0].ToString());
myBrowsers.Add(browser);
}
}
private void webBrowserDocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if (e.Url.AbsolutePath != (sender as WebBrowser).Url.AbsolutePath)
return;
WebBrowser browser = sender as WebBrowser;
browser.Document.GetElementById("KullaniciAdiTextBox").SetAttribute("value", "username");
browser.Document.GetElementById("SifreTextBox").SetAttribute("value", "pass");
browser.Document.GetElementById("SistemeGirImageButton").InvokeMember("click");
browser.DocumentCompleted -= webBrowserDocumentCompleted;
browser.DocumentCompleted += webBrowserDestroyOnCompletion;
}
private void webBrowserDestroyOnCompletion(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if (e.Url.AbsolutePath != (sender as WebBrowser).Url.AbsolutePath)
return;
if (e.Url.AbsolutePath.Contains("Login"))
{
//send e-mail
}
WebBrowser browser = sender as WebBrowser;
browser.Dispose();
myBrowsers.Remove(browser);
}
public List myBrowsers=new List();
私有无效按钮3\u单击(对象发送者,事件参数e)
{
SqlConnection连接=新的SqlConnection(connectionString);
connection.Open();
siteeid=Convert.ToInt32(列表框1.SelectedValue);
string url=“从AyrintiSite中选择http、用户名、密码、用户ID、密码ID和butonID,其中用户名!=”;
DataTable dt=新的DataTable();
使用(SqlConnection cn=newsqlconnection(connectionString))
{
使用(SqlCommand cm=newsqlcommand(url,cn))
{
cn.Open();
dt.Load(cm.ExecuteReader());
}
}
对于(int i=0;i
现在我的数据表中有17页。其中10-12人可以正确登录,但其他人不能,我的程序会向我发送电子邮件。我在我的数据库里查了一千遍都没问题,他们都应该登录。我的代码有错误吗?导航到DocumentCompleted事件中的下一个URL 声明pageIndex变量以将索引保留在dt.rows中:
int pageIndex=0 ;
将dt.rows上的循环替换为以下内容:
WebBrowser browser = new WebBrowser();
browser.DocumentCompleted += webBrowserDocumentCompleted;
browser.Navigate(dt.Rows[pageIndex][0].ToString());
DocumentCompleted事件中dt.rows上的“循环”:
private void webBrowserDocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if (e.Url.AbsolutePath != (sender as WebBrowser).Url.AbsolutePath) return;
WebBrowser browser = sender as WebBrowser;
browser.Document.GetElementById( "KullaniciAdiTextBox").SetAttribute("value", "username");
browser.Document.GetElementById( "SifreTextBox").SetAttribute("value", "pass");
browser.Document.GetElementById( "SistemeGirImageButton").InvokeMember("click");
pageIndex++ ;
If (pageIndex<dt.Rows.Count) browser.Navigate(dt.Rows[pageIndex][0].ToString());
}
private void webBrowserDocumentCompleted已完成(对象发送方,WebBrowserDocumentCompletedEventArgs e)
{
if(e.Url.AbsolutePath!=(发件人为WebBrowser).Url.AbsolutePath)返回;
WebBrowser browser=发件人作为WebBrowser;
browser.Document.GetElementById(“KullaniciAdiTextBox”).SetAttribute(“值”、“用户名”);
browser.Document.GetElementById(“SifreTextBox”).SetAttribute(“value”、“pass”);
browser.Document.GetElementById(“SistemeGirImageButton”).InvokeMember(“单击”);
pageIndex++;
If(pageIndex may helpBefore Navigate()方法调用构造函数:webBrowser1=new WebBrowser();如果创建一个新的WebBrowser,您将丢失cookies。您的方法中存在一个问题,因为您没有在循环中等待文档完成事件。解决方案是执行Navigate()到第一个Url,而不是循环。然后,在DocumentCompleted事件中,执行一些操作并导航()到下一个Url。我用您的建议补充了我的问题。您可以再次检查吗?@jdwengt谢谢您,但我无法在DocumentCompleted事件中从datatable获取值。我如何才能做到这一点?将“datatable dt”声明为类似“MyBrowser”的表单变量(不要在按钮单击过程中重新声明)。