webBrowser 模拟鼠标点击问题

hxl126 2011-06-23 04:33:24
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的单击事件里,要怎么写才不会出错
...全文
219 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ADSLAN 2011-06-25
  • 打赏
  • 举报
回复
以前用WEBBROWSER写网络程序 也是用LZ这招

用一个Timer1 里边
检测 if Web.ReadyState = 4 then
再检测 URL= ‘目标网址’ 然后timer1 停止
然后进行后续操作。

老是要判断网页是否完全加载 不方便
有空 直接学习IDHTTP
hxl126 2011-06-24
  • 打赏
  • 举报
回复
加Timer延迟确实可以,有没有其他什么更好的方法可以直接判断呢?

documentcomplete事件里
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就是出错
浩南_哥 2011-06-24
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 hxl126 的回复:]

登录的后转向的页面是所有flash列表的界面,我在登录后用wb.Navigate('www.xxx.com/xxxx')某个特定用户的Flash页面
[/Quote]
要不你可以试试加个Timer,在页面加载完成后延迟几秒在执行Wb.OleObject.document.getElementsByTagName('input').item(2).click
hxl126 2011-06-24
  • 打赏
  • 举报
回复
登录的后转向的页面是所有flash列表的界面,我在登录后用wb.Navigate('www.xxx.com/xxxx')某个特定用户的Flash页面
dongmei757 2011-06-24
  • 打赏
  • 举报
回复
Wb.OleObject.document.getElementsByTagName('input').item(2).click; //登录的序号
如果上面一行是执行登录操作,下面的一行就不必要要了。因为执行完上面的操作,页面就要自动转向下一页面。
wb.Navigate('www.xxx.com/xxxx'); //转到其他页面 把这行删了//

看看你转向后的页面对不对?

showmessage(url);看是不是你要执行Wb.OleObject.document.getElementsByTagName('input').item(3).click的页面
hxl126 2011-06-24
  • 打赏
  • 举报
回复
if (Wb.ReadyState = READYSTATE_COMPLETE) then
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;顺利执行?
大肚肥肥 2011-06-24
  • 打赏
  • 举报
回复
好复杂,帮顶。。
dongmei757 2011-06-23
  • 打赏
  • 举报
回复
要判断一下转向后的网页是否下载完毕:
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比较,

如果完全相同再执行你的点击代码。
hxl126 2011-06-23
  • 打赏
  • 举报
回复
if url = ''www.xxx.com/xxxx' then
Wb.OleObject.document.getElementsByTagName('input').item(3).click
错误提示跟前面的一样?

能否写下判断代码,谢谢!
bdmh 2011-06-23
  • 打赏
  • 举报
回复
Navigate后,你没有保证网页已经下载完毕,这样就找不到按钮,访问必然出错,你最好在documentcomplete事件中判断一下是否完成,然后再点击
浩南_哥 2011-06-23
  • 打赏
  • 举报
回复
procedure TfrmWebClient.wbNoticeDocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);

根据URL判断下试试
hxl126 2011-06-23
  • 打赏
  • 举报
回复
怎么样才能知道,是第一个页面加载完了还是第2个页面加载完成了?
浩南_哥 2011-06-23
  • 打赏
  • 举报
回复
wb.Navigate('www.xxx.com/xxxx'); //转到其他页面
没有加载完成,你就直接用Wb.OleObject.document.getElementsByTagName('input').item(3).click肯定出错了
得等待wb.Navigate('www.xxx.com/xxxx')加载完成后在执行Wb.OleObject.document.getElementsByTagName('input').item(3).click
可以考虑在OnDocumentComplete中做相应的处理

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧