请问如何自动填写IE中的表单? ( 积分: 100 )

  • 主题发起人 主题发起人 gray110
  • 开始时间 开始时间
G

gray110

Unregistered / Unconfirmed
GUEST, unregistred user!
请问如何得到表单中的所有元素名和值?
我看到有个软件是用twebbrowser做的,里面有个表单分析的功能,不知道是怎么做的
http://www.haowj.com/

在软件网页浏览一页里的工具条里

哪位高手能给段代码启发一下?
 
请问如何得到表单中的所有元素名和值?
我看到有个软件是用twebbrowser做的,里面有个表单分析的功能,不知道是怎么做的
http://www.haowj.com/

在软件网页浏览一页里的工具条里

哪位高手能给段代码启发一下?
 
通过IE接口做,DELPHI盒子上有一个QQ自动申请的源码可能会给你一点启发的.
 
那个程序过期了,是2003的,无法测试,也看不懂
 
用IHTMLDocument2接口吧,它已经把网页中的元素封装成对象,尽管调用就是了。
在uses里加入MsHTML.
var
Doc:IHTMLDocument2;
ElemColl:IHTMLElementCollection;
Element:IHTMLElement;
FormElement:IHTMLFormElement;//定义表单对象
FormCollection:IHTMLElementCollection;//定义表单元素对象
i:integer;
begin
Doc:=WebBrowser1.Document as IHTMLDocument2;
ElemColl:=Doc.all;//取得网页中所有的元素
for i:=0 to ElemColl.length -1 do
Element:=Element.item(i,emptyparam) as IHTMLElement;
if Element.tagname='FORM' then//找到表单
begin
try
FormElement:=ElemColl.item(i,emptyparam) as IHTMLFormElement;
……
接下来,就是发挥你的所能了!详细的内容请参考MSDN里面的资料,你搜索IHTMLDocumen2就可以得到你想要的资料了!
 
不知为何在
Element.item//后面提示错误
 
不好意思,应该是:
ElemColl.item
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OleCtrls, SHDocVw, StdCtrls,MsHTML;

type
TForm1 = class(TForm)
WebBrowser1: TWebBrowser;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
WebBrowser1.Navigate('126.COM');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
Doc:IHTMLDocument2;
ElemColl:IHTMLElementCollection;
Element:IHTMLElement;
FormElement:IHTMLFormElement;//定义表单对象
FormCollection:IHTMLElementCollection;//定义表单元素对象
i:integer;
begin
Doc:=WebBrowser1.Document as IHTMLDocument2;
ElemColl:=Doc.all;//取得网页中所有的元素
for i:=0 to ElemColl.length -1 do
Element:=ElemColl.item(i,emptyparam) as IHTMLElement;
if Element.tagname='FORM' then//找到表单
begin
try
FormElement:=ElemColl.item(i,emptyparam) as IHTMLFormElement;
except

END;

end;
END;
end.




请问要加什么才能填表

俺是新手
 
可以了
原来还要查看网页代码控件的NEME
 
介绍一些相关的资料吧:
MSHTML是微软公司的一个COM组件,该组件封装了HTML语言中的所有元素及其属性,通过其提供的标准接口,可以访问指定网页的所有元素.MSHTML对象模型是由一些对象和集合组成的.处于根部的是HTML,描述了打开页面的1个窗口,包括一系列集合和对象。如Frames集合,History,Location,Navigator,Document,Vi—sum,Event对象等.其中描述呈现在客户窗口实际网页的是Document对象。由一系列的属性、方法、对象和集合组成.其中All集合中包含网页中所有标记(Tag)元素,其主要的方法和属性有:
(1)Length(长度):即标记出现的个数,可以把标记的集合理解为从0开始的一维数组,其次序按照标记在网页位置排列;
(2)Tags(标记):用于过滤出给定标记的集合,如Doc.Al1.Tags(P)得到所有分段标记P;
(3)Item(项目):用于选择集合中的某1个元素,如object.item(0)得到集合的第1个元素,而object.item(i)得到第i+1个元素.
此外,IHTMLElement也是个常用的集合对象,代表网页中指定标记的集合,通过这个集合对象,可以得到网页上特定标记的内容.IHTMLElement有4个主要属性:
(1)InnerText:开始标记和结束标记之间的文本;
(2)InnerHTML:开始标记和结束标记之间的文本和HTML;
(3)OuterText:对象的文本;
(4)OuterHTML:对象的文本和HTML.
 
我觉得这种方法不错。
procedure TForm1.Button1Click(Sender: TObject);
var
Doc:IHTMLDocument2;
input:OleVariant;
userinputelement,pwdinputelement:ihtmlinputelement;
begin
doc:=webbrowser1.document as ihtmldocument2;
userinputelement:=(doc.all.item('user'(也就是网页中用户名控件的名字),0) as ihtmlinputelement);
userinputelement.value:=edit1.text;(也就是你要向网页输入的东西)
pwdinputelement:=(doc.all.item('password',0) as ihtmlinputelement);
pwdinputelement:=edit2.text;
input:=doc.all.item('submit',0);
input.click;
end;
 
很早以前的一个QQ申请程序
www.hitekersoft.com/download/QQ.rar
 
TO xd1972
你的方法比较简洁,就点击

这是QQ的 (登陆)
<TD class=lgtd2 width=40><INPUT style="WIDTH: 40px; HEIGHT: 20px"
type=image src="腾讯首页.files/bt_log.gif" name=image></TD>

名字是 submit=image

这是源码仓库的 (登陆)

<INPUT onclick="jacascript:return login_true();"
type=image
src="源码仓库-delphi源码免费下载,delphi源代码、控件下载 -.files/user_login_button.gif"
align=absMiddle border=0



submit=???????????
 
QQ 的可以通过
就是源码仓库
submit就是不知什么了,

还有做一个填表的这么麻烦.还要用工具查看源代码
能不能在程序里查看呢
 
我靠
你就是想要源码仓库的商业代码呀
我这里都有
email:clickmouse@126.com
联系
 
TO zyt_1978
我不知你是怎么想的,
我只是举个例子,如何点击提交的按钮.
 
TO:我要学
呵呵,你提的问题我也正在查找答案,网页上有很多按钮是没有名字的,但我查找过(呵呵,查了NN个小时),曾看过有人提出个思路:既然用MSHTML可以提取网页中的所有元素,那么MSHTML就应该自动为那些没有名字的按钮提供一个不重复的代号,只是怎样才能让我们提取出来,这需要高手们为我们解答了.
不过我用了一个折衷的方法,因为"登录"按钮一般都是网页中默认的回车按钮,所以可以用下代码来代替前面的点击按钮.
procedure TForm1.Button1Click(Sender: TObject);
var
Doc:IHTMLDocument2;
[red]input:OleVariant;[/red]
(form:ithmlformelement:)
userinputelement,pwdinputelement:ihtmlinputelement;

begin
doc:=webbrowser1.document as ihtmldocument2;
userinputelement:=(doc.all.item('user'(也就是网页中用户名控件的名字),0) as ihtmlinputelement);
userinputelement.value:=edit1.text;(也就是你要向网页输入的东西)
pwdinputelement:=(doc.all.item('password',0) as ihtmlinputelement);
pwdinputelement:=edit2.text;
[red]input:=doc.all.item('submit',0);
input.click;[/red]
(form:=(doc.all.item('login_form',0) as ihtmlformelement):
form.submit;)
end;
把红色的部份用括号里的代码代替就可以了,这种方法基本上可以适用所用的登录地方.

PS:TO:我要学,你说的在程序里查看指的是什么啊?是网页源代码吗?
既然要自动登录,总得知道网页中控件的名字吧,否则怎么让程序来自动填充你的东西呢?
 
就是嘛
那些按钮根本就是图片,没有名字的,
有代高人指点
 
可以模拟鼠标键盘发送消息
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OleCtrls, SHDocVw, StdCtrls, ExtCtrls, ComCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Edit2: TEdit;
Panel1: TPanel;
WebBrowser1: TWebBrowser;
Label1: TLabel;
Button3: TButton;
StatusBar1: TStatusBar;
Edit3: TEdit;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;
public
{ Public declarations }
end;

var
Form1: TForm1;
HotKeyID: Integer;
b:boolean;

implementation

{$R *.dfm}
procedure tform1.WMHotKey(var msg:twmhotkey);
begin
////
if Msg.HotKey = HotKeyID then
begin
b:=true;
end;
end;


procedure TForm1.Button2Click(Sender: TObject);
var url_str:string;
begin
button2.Enabled:=false;
b:=false;
url_str:='http://mobile.client.qq.com/cgi-bin/guide.cgi?mobileno='+edit1.Text+'&qq='+edit3.Text+'&command=2&service=3&reg.x=30&reg.y=29';

while not b do
begin

WebBrowser1.Navigate(url_str);
while WebBrowser1.ReadyState <READYSTATE_COMPLETE do
Application.ProcessMessages;


webbrowser1.Navigate('about:blank');
end;

button2.Enabled :=true;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
HotKeyID := GlobalAddAtom(PChar('HotKey')) - $C000;
RegisterHotKey(Handle, HotKeyID, 0, VK_F1);
b:=false;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
application.Terminate;
end;

procedure TForm1.Button3Click(Sender: TObject);
var gh:hwnd;
R:TRect;
url_str:string;
i:integer;
begin
button3.Enabled:=false;
b:=false;
gh :=form1.Handle;
GetWindowRect(gh,r);

url_str:='http://mobile.client.qq.com/cgi-bin/guide.cgi?mobileno='+edit1.Text+'&qq='+edit3.Text+'&command=2&service=3&reg.x=30&reg.y=29';
WebBrowser1.Navigate(url_str);
while WebBrowser1.ReadyState <READYSTATE_COMPLETE do
Application.ProcessMessages;

for i:=strtoint(edit2.Text) to 99999999 do
begin
webbrowser1.OleObject.document.form0.checkwd.value:=inttostr(i);

SetCursorPos(r.Left+450,r.top+420);
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
Keybd_event(13,MapVirtualkey(13,0),0,0);


while (WebBrowser1.LocationURL=url_str) do
Application.ProcessMessages;

SetCursorPos(r.Left+280,r.top+440);
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
Keybd_event(13,MapVirtualkey(13,0),0,0);

while (WebBrowser1.LocationURL<>url_str) do
Application.ProcessMessages;

edit2.Text :=inttostr(i);
if b then break;
end;

button3.Enabled:=true;

end;

end.
 

Similar threads

回复
0
查看
1K
不得闲
D
回复
0
查看
943
DelphiTeacher的专栏
D
D
回复
0
查看
882
DelphiTeacher的专栏
D
D
回复
0
查看
959
DelphiTeacher的专栏
D
D
回复
0
查看
786
DelphiTeacher的专栏
D
后退
顶部