文档结构
“ Form0”-表单
--“ panel2”-面板
---“ Frm5UC”-自定义项
----“ webBrowser1”-浏览器
应用逻辑:
-转到“ webBrowser1”中的页面;
-输入登录名;
-输入密码;
-点击“登录”按钮。
如果我通过代码(这是“ Method_0()”方法)执行逻辑,则表单没有时间在“ Authorization()”方法中加载。 我得到“ webBrowser1.Document = null”, 错误“对象链接未指示对象实例。”
如果我通过界面执行所有操作,则一切正常。
如何使逻辑以编程方式运行?
private void Frm5UC_Load(object sender, EventArgs e)
{
webBrowser1.Visible = true;
// *** TESTS ***
Method_0();
}
#region *** TESTS ***
public void Method_0()
{
Method_1();
// Method_2();
}
public void Method_1()
{
textBox2.Text = "_domain_com";
textBox1.Text = @"domain_com/login/";
button1.PerformClick();
}
public void Method_2() // Авторизация
{
Authorization();
}
#endregion *** TESTS ***
private void button1_Click(object sender, EventArgs e)
{
webBrowser1.Navigate(textBox1.Text);
}
private void button2_Click(object sender, EventArgs e)
{
Authorization();
}
public void Authorization() // Авторизация
{
foreach (HtmlElement he in webBrowser1.Document.GetElementsByTagName("input"))
{
if (he.GetAttribute("name") == "login[login]")
{
he.SetAttribute("value", "login798");
}
}
// Code "enter password"
// Code "Press the button"
}
更新。
我尝试使用事件“ DocumentCompleted”。
添加了变量“ bool statusAuthorization;”。
结果: -将打开一个带有用于输入登录名/密码的字段的页面; 什么也没有发生。 该代码未输入登录名/密码。
我尝试进行调试。
逐步遍历整个代码。
没有错误。一切正常,但是浏览器中的表单无法打开。
如果我通过界面登录,则一切正常。
bool statusAuthorization;
private void Frm5UC_Load(object sender, EventArgs e)
{
webBrowser1.Visible = true;
statusAuthorization = true; // !!! CHANGES
// *** ТЕСТ ***
Method_0();
}
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if (webBrowser1.ReadyState != WebBrowserReadyState.Complete) return;
if (statusAuthorization == true)
{
Authorization();
}
}
#region *** TESTS ***
public void Method_0()
{
Method_1();
// Method_2();
}
public void Method_1()
{
textBox2.Text = "_domain_com";
textBox1.Text = @"domain_com/login/";
button1.PerformClick();
}
public void Method_2() // Авторизация
{
Authorization();
}
#endregion *** TESTS ***
private void button1_Click(object sender, EventArgs e)
{
webBrowser1.Navigate(textBox1.Text);
}
private void button2_Click(object sender, EventArgs e)
{
Authorization();
}
public void Authorization() // Авторизация
{
foreach (HtmlElement he in webBrowser1.Document.GetElementsByTagName("input"))
{
if (he.GetAttribute("name") == "login[login]")
{
he.SetAttribute("value", "login798");
}
}
// Code "enter password"
// Code "Press the button"
statusAuthorization = false; // !!! CHANGES
}
更新
结果:表单一次又一次地加载。
private void Frm5UC_Load(object sender, EventArgs e)
{
string s = "stop";
webBrowser1.Visible = true;
webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(DocumentCompletedHandler);
// *** ТЕСТ ***
Method_1();
}
private void DocumentCompletedHandler(object sender, WebBrowserDocumentCompletedEventArgs e)
{
//Done!
Authorization();
}
答案 0 :(得分:0)
尝试一下:
bool statusAuthorization;
private void Frm5UC_Load(object sender, EventArgs e)
{
webBrowser1.Visible = true;
statusAuthorization = true; // !!! CHANGES
// *** ТЕСТ ***
}
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if (webBrowser1.ReadyState != WebBrowserReadyState.Complete) return;
if (statusAuthorization == true && webBrowser1.Document != null)
{ Method_1();
Authorization();
}
}
#region *** TESTS ***
public void Method_1()
{
textBox2.Text = "_domain_com";
textBox1.Text = @"domain_com/login/";
}
private void button1_Click(object sender, EventArgs e)
{Method_1();
Authorization();
}
public void Authorization() // Авторизация
{
foreach (HtmlElement he in webBrowser1.Document.GetElementsByTagName("input"))
{
if (he.GetAttribute("name") == "login[login]")
{
he.SetAttribute("value", "login798");
}
}
// Code "enter password"
// Code "Press the button"
statusAuthorization = false; // !!! CHANGES
}