procedure TForm1.Button3Click(Sender: TObject);
var
Doc:IHTMLDocument2;
UserName:IHTMLInputElement;
Password: IHTMLInputElement;
begin
wb.Navigate('http://www.xxx.com/login/');
while wb.ReadyState<>4 do
Application.ProcessMessages; FUserName := GetUserName; //获取用户名
if FUserName <> '' then
begin
Doc := wb.Document as IHTMLDocument2;
UserName := Doc.all.item('username',varEmpty) as IHTMLInputElement;
UserName.value:=FUserName;
Password := Doc.all.item('password',varEmpty) as IHTMLInputElement;
Password.value := '530251';
end;
Wb.OleObject.document.getElementsByTagName('input').item(2).click; //登录的序号 wb.Navigate('www.xxx.com/xxxx'); //转到其他页面
Wb.OleObject.document.getElementsByTagName('input').item(3).click; //新页面的button的序号
end;执行会出现错误:Access violation at address 004657CDF in module 'test.exe'. Read of address 00000000如果把上面最后一句:
Wb.OleObject.document.getElementsByTagName('input').item(3).click;
放在另一个Button里执行就不会出错。请问放在同一个Button的单击事件里,要怎么写才不会出错
var
Doc:IHTMLDocument2;
UserName:IHTMLInputElement;
Password: IHTMLInputElement;
begin
wb.Navigate('http://www.xxx.com/login/');
while wb.ReadyState<>4 do
Application.ProcessMessages; FUserName := GetUserName; //获取用户名
if FUserName <> '' then
begin
Doc := wb.Document as IHTMLDocument2;
UserName := Doc.all.item('username',varEmpty) as IHTMLInputElement;
UserName.value:=FUserName;
Password := Doc.all.item('password',varEmpty) as IHTMLInputElement;
Password.value := '530251';
end;
Wb.OleObject.document.getElementsByTagName('input').item(2).click; //登录的序号 wb.Navigate('www.xxx.com/xxxx'); //转到其他页面
Wb.OleObject.document.getElementsByTagName('input').item(3).click; //新页面的button的序号
end;执行会出现错误:Access violation at address 004657CDF in module 'test.exe'. Read of address 00000000如果把上面最后一句:
Wb.OleObject.document.getElementsByTagName('input').item(3).click;
放在另一个Button里执行就不会出错。请问放在同一个Button的单击事件里,要怎么写才不会出错
没有加载完成,你就直接用Wb.OleObject.document.getElementsByTagName('input').item(3).click肯定出错了
得等待wb.Navigate('www.xxx.com/xxxx')加载完成后在执行Wb.OleObject.document.getElementsByTagName('input').item(3).click
可以考虑在OnDocumentComplete中做相应的处理
const pDisp: IDispatch; var URL: OleVariant);根据URL判断下试试
Wb.OleObject.document.getElementsByTagName('input').item(3).click
错误提示跟前面的一样?能否写下判断代码,谢谢!
if not(web.busy) then begin
if Web.ReadyState = READYSTATE_COMPLETE then
if Web.Application = pDisp then
......根据情况定另外要获得转向后的网页地址,URL :=(web.Document as IHTMLDocument2).url;
与www.xxx.com/xxxx比较,如果完全相同再执行你的点击代码。
begin
URL :=(wb.Document as IHTMLDocument2).url;
if URL = 'www.xxx.com/xxxx' then
begin
Wb.OleObject.document.getElementsByTagName('input').item(3).click;
end;
end; 也是一样的错误的提示,会不会跟www.xxx.com/xxxx页面会播放一段flash视频有关,如果这样要怎么写代码才能让Wb.OleObject.document.getElementsByTagName('input').item(3).click;顺利执行?
如果上面一行是执行登录操作,下面的一行就不必要要了。因为执行完上面的操作,页面就要自动转向下一页面。
wb.Navigate('www.xxx.com/xxxx'); //转到其他页面 把这行删了//看看你转向后的页面对不对?showmessage(url);看是不是你要执行Wb.OleObject.document.getElementsByTagName('input').item(3).click的页面
if (Wb.ReadyState = READYSTATE_COMPLETE) then
begin
URL :=(wb.Document as IHTMLDocument2).url;
if URL = 'www.xxx.com/xxxx' then
begin
Application.message('', '', mb_ok);
//Wb.OleObject.document.getElementsByTagName('input').item(3).click;
end;
end;执行时弹出对话框,关闭之后马上就能显示网页,换成Wb.OleObject.document.getElementsByTagName('input').item(3).click就是出错
检测 if Web.ReadyState = 4 then
再检测 URL= ‘目标网址’ 然后timer1 停止
然后进行后续操作。老是要判断网页是否完全加载 不方便
有空 直接学习IDHTTP