使用 WF4 設計四個流程自動化操作瀏覽器:Google 搜尋、博客園登入、留言/推薦、定時循環回覆。核心為三個自訂 CodeActivity 操作 IE COM 物件。
[Designer(typeof(VisitPageDesigner))]
public sealed class VisitPage : CodeActivity
{
public InArgument<string> Url { get; set; }
public InArgument<int> WaitTime { get; set; }
protected override void Execute(CodeActivityContext context)
{
object missing = System.Reflection.Missing.Value;
Browser.TheInstance.Navigate(Url.Get(context), ref missing, ref missing, ref missing, ref missing);
Browser.TheInstance.Visible = true;
while (Browser.TheInstance.Busy)
Thread.Sleep(WaitTime.Get(context));
}
}
[Designer(typeof(InputDataExtensionDesigner))]
public sealed class InputDataExtension : CodeActivity
{
public InArgument<string> Type { get; set; } // TEXT/RADIO/CHECKBOX
public InArgument<string> InputID { get; set; }
public InArgument<string> Value { get; set; }
protected override void Execute(CodeActivityContext context)
{
var doc = Browser.TheInstance.Document as IHTMLDocument2;
var body = doc.body;
var children = body.all as IHTMLElementCollection;
foreach (IHTMLElement child in children)
{
if (child?.id == InputID.Get(context))
child.innerText = Value.Get(context);
}
}
}
[Designer(typeof(ClickDesigner))]
public sealed class ClickExtension : CodeActivity
{
public InArgument<string> ClickName { get; set; }
protected override void Execute(CodeActivityContext context)
{
var doc = Browser.TheInstance.Document as IHTMLDocument2;
var body = doc.body;
var children = body.all as IHTMLElementCollection;
foreach (IHTMLElement child in children)
{
if (child == null) continue;
if (child.id == ClickName.Get(context) || child.className == "diggit")
child.click();
}
}
}
此架構可擴充為自動化測試框架,將使用者操作封裝為可視化流程活動。