2008年5月27日 星期二

開發 IE 瀏覽器的 Toolbar:自動程式

經過前幾篇的學習後,已經足以製作一個自動化跨網頁執行的程式了。

模擬畫面如下,假設有三階段的網頁,第一頁是 login 介面,第二頁是 login 後可以取得的資料來源,第三頁是要將資料複製到其他網站的介面:



HTML 內容如下:


<html>
<head>
<title>test page</title>
</head>
<body>

<table>
<tr valign="top">

<td>
<h3>頁面一:登入</h3>

<form>
uid: <input type="text" name="uid"><br>
pwd: <input type="text" name="pwd"><br>
<input type="submit">
</form>
</td>

<td>
<h3>頁面二:複製資料</h3>

<form>
owner:<br>
<input type="text" name="owner" value="邦邦"><br>
status:<br>
<textarea name="status" rows="5" cols="20">
測試123
測試456
測試789
</textarea><br>
<input type="submit">
</form>
</td>

<td>
<h3>頁面三:貼上資料</h3>

<form>
owner:<br>
<input type="text" name="owner2"><br>
status:<br>
<textarea name="status2" rows="5" cols="20"></textarea><br>
<input type="submit">
</form>
</td>

</tr>
</table>

</body>
</html>


C# 的原始碼如下:



/*
* override BandObjectLib 的 OnExplorerAttached,可於此處設定監聽 browser 的事件
*/
protected override void OnExplorerAttached(EventArgs ea)
{
this.Explorer.DocumentComplete += new DWebBrowserEvents2_DocumentCompleteEventHandler(this.OnDocumentComplete);
}

/*
* 監聽網頁載入完成的事件
*/
private void OnDocumentComplete(object frame, ref object urlObj)
{
string rooturl = ((this.Explorer as IWebBrowser2).Document as IHTMLDocument2).url;

IWebBrowser2 webBrowser = (IWebBrowser2)frame;
IHTMLDocument2 document = (IHTMLDocument2)webBrowser.Document;

//MessageBox.Show("[OnDocumentComplete]\n" + document.title + "\n" + document.url);

if(step!=-1)
startProcess();
}

/*
* 按鈕一,連到指定頁面
*/
private void button1_Click(object sender, System.EventArgs e)
{
IWebBrowser2 webBrowser = (IWebBrowser2)this.Explorer;

object Null = System.Reflection.Missing.Value;
webBrowser.Navigate("http://127.0.0.1/temp/test.html", ref Null, ref Null, ref Null, ref Null);
}

private int step = -1;
private string data_owner = "";
private string data_status = "";

/*
* 按鈕二,開始自動化作業
*/
private void button2_Click(object sender, System.EventArgs e)
{
step = 0;
startProcess();
}

/*
* 自動化作業程序
*/
private void startProcess()
{
IWebBrowser2 webBrowser = (IWebBrowser2)this.Explorer;
IHTMLDocument2 document = (IHTMLDocument2)webBrowser.Document;

step++;

if(step==1)
{
/*
* 程序一,登入
*/
HTMLFormElementClass loginForm = document.forms.item(0, 0) as HTMLFormElementClass;
HTMLInputTextElement uid = loginForm.item("uid", 0) as HTMLInputTextElement;
HTMLInputTextElement pwd = loginForm.item("pwd", 0) as HTMLInputTextElement;

uid.value = "username";
pwd.value = "password";

MessageBox.Show("填入帳密,自動送出!");
loginForm.submit();
}
else if(step==2)
{
/*
* 程序二,複製資料
*/
HTMLFormElementClass sourceForm = document.forms.item(1, 0) as HTMLFormElementClass;
HTMLInputTextElement owner = sourceForm.item("owner", 0) as HTMLInputTextElement;
HTMLTextAreaElement status = sourceForm.item("status", 0) as HTMLTextAreaElement;

data_owner = owner.value;
data_status = status.value;

MessageBox.Show("複製資料:\nowner=" + data_owner + "\nstatus=" + data_status + "\n到目標網頁!");

object Null = System.Reflection.Missing.Value;
webBrowser.Navigate("http://127.0.0.1/temp/test.html", ref Null, ref Null, ref Null, ref Null);
}
else if(step==3)
{
/*
* 程序三,貼上資料
*/
HTMLFormElementClass targetForm = document.forms.item(2, 0) as HTMLFormElementClass;
HTMLInputTextElement owner = targetForm.item("owner2", 0) as HTMLInputTextElement;
HTMLTextAreaElement status = targetForm.item("status2", 0) as HTMLTextAreaElement;

owner.value = data_owner;
status.value = data_status;

MessageBox.Show("複製完成");
}
}


執行畫面如下,當按下第二個按鈕,開始自動化程序時,會自動填入帳密,並將表單送出:



到了資料來源頁面,僅將指定的資料複製起來:



到了目標頁面,將剛才複製的資料貼進文字輸入介面中:



完成!

沒有留言: