问题:使用delphi +twebbrowser进行页面访问的时候.如何最后提交填写的表单.
一般应该是很简单的.
procedure websubmit(WB: TWebBrowser; FieldName: string);
var
I: Integer;
FormNr, ItemNr : integer;
TheForm : Variant;
o : Olevariant;
begin
//判断是否存在form对象
if WB.OleObject.Document.All.Tags('FORM').Length = 0 then
begin
ShowMessage('Error: no FORM found on page');
Exit;
end;
for FormNr := 0 to WB.OleObject.Document.Forms.Length - 1 do
begin
//取得每一个form对象
TheForm := WB.OleObject.Document.Forms.Item(FormNr);
for ItemNr := 0 to TheForm.Length - 1 do
begin
try
//根据form对象中的的元素名确定是否是需要提交的那个按钮
//form对象包括input,select button等
//比如<input type=submit name='aaaa">
//则name为 aaaa
if TheForm.Item(ItemNr).Name = FieldName then
begin
TheForm.Item(ItemNr).CLICK; //模拟点击
exit;
end;
except
Break;
end;
end;
end;
end;
上面代码看起来很是正确,不过如果用户的按钮或者说button为:
这个样子的.你会发现永远都不会给提交.
为什么因为在msdn帮助中明确说明了上面的那个item不支持input type=image对象的.
那如何才能提交那样的其实很简单改用以下代码.可以简化整个的提交过程
procedure websubmit(WB: TWebBrowser; FieldName: string);
var
I: Integer;
FormNr, ItemNr : integer;
TheForm : Variant;
o : Olevariant;
begin
if WB.OleObject.Document.All.Tags('FORM').Length = 0 then
begin
ShowMessage('Error: no FORM found on page');
Exit;
end;
try
//提交指定名字的标签
Wb.oleobject.document.all.namedItem(FieldName).click;
except
exit;
end;
end;
如此极大简化了提交同时也满足了所有可能标签的提交动作.
一般而言使用twebbrowser来提交个人认为是一种比较好的方式.因为如果使用idhttp,可能出现用户页面需要通过调用script做一些处理后提交的问题.使用idhttp是无法捕获的.
而使用twebbrowser则完全模拟一个用户的操作过程.可以减少对页面的分析难度.做到准确提交.
不过在程序提交的时候还有一个问题必须要注意.如果程序本身还没有能运行完成也就是说twebbrowser的状态还没有complete的时候,千万不要通过程序提交那样会出现异常的.这点千万注意呀.
……