由于在维护一套B/S程序,程序在和其他系统进行交互时由于环境问题造成系统在派单至另外系统时派单不成功或者是其他系统在处理完后回单至本系统时回单消息丢失,以及在CRM系统派单至本系统后,定单流程无法正常启动等问题是都需要人为参与进行处理,由于每日工单,定单数量非常庞大,故在进行人为处理时工作量非常大。因此本人为了让自己的工作变得轻松故写了一个自动回单,自动重新执行以及自动重启流程的小程序。采用PB+WEBBROWSER进行。为了记录开发中的难点以及为了给后来人一个捷径特写此文章。
WEBBROWSER的基本属性都可以在BAIDU中查询到。具体就不写了。
在B/S程序设计中有些程序采用的是框架技术,有些是非框架。我们分开来说:
一:非框架
1: 对非框架中的表单进行填写。
首先我们根据表单的ID或者名称来得到该表单,最后在给表单赋值,也就是填写表单内容。
采用ID来比较简单,应为ID是唯一的 :
代码如下:
ole_webbrowser.object.document.getelementbyid("表单id").SetAttribute("value","需要填写的值");
表单的ID我们可以去查看该B/S的源码来看。IE都提供该功能。
采用名称比较麻烦,应为名称不是唯一的,所以我们必须要去看源码然后看看该表单的名称是第几个。最后在给该表单赋值
代码如下:
ole_webbrowser.object.document.getelementsbyname("表单名称").item(该名称的位置).SetAttribute("value","需要填写的值");
以上就可以对表单进行填值。
如果是多个表单我们可以按照上面的方法循环进行填写。
2:填值完成后的提交:
表单填写完成后我们需要提交,不管是查询还是更新。我们都可以进行该操作。
首先通过IE来查看源码,得到提交按钮的ID或者名称。最后我们根据ID或者名称来调用该按钮的ONCLICK事件。
代码如下:
根据ID:
ole_webbrowser.object.document.getelementbyid('表单ID').click;
根据名称 :
ole_webbrowser.object.document.getelementsbyname('表单名称').item(该名称的位置).click;
需要注意的是有些查询或者是更新会弹出JS的告警提示框,默认我们都是需要点击确定来执行。所以在提交前我们需要屏蔽警告框,并让程序人为我们点击的是 确定。
该段代码必须放到CLICK动作之前来进行。
代码如下:
ole_webbrowser.object.document.parentwindow.execscript('function confirm(){return true}','javascript');
该代码的意思是执行JS函数,并返回TRUE。这样就可以屏蔽告警框。同理ALERT等JS提示框都可以使用这种方法来进行屏蔽。
另外有些程序需要对某行进行操作。需要先选择该行,选择方式有很多,行前加CLECK控件或者之间点击改行等。所以我们在对这种情况进行操作时首先要分析源码,看源码中有没有提供对选择行或者点击CLECK的操作函数,如果提供了函数那么我们可以采用上面屏蔽弹出消息的方式来执行该函数。
代码如下:
ole_webbrowser.object.document.parentwindow.execscript('函数名称','javascript');
本人调用的代码如下:
ole_webbrowser.object.document.parentwindow.execscript('dispatchErrOper.reExecute()','javascript');
以上都是在我开发中遇到的情况。如果需要操作的记录比较多,我们可以采用循环方式来进行操作。我们只需要提供相应的数据就可以了。
另外在对进行查询或者更新时我们需要等待执行过程的返回情况,所以我们在处理时可以有两种方式。第一种用TIMER控件来,第二种采用PB的yield函数.
采用TIME函数时我们可以定时执行。当然在执行查询或更新按钮动作前先TIMER下。完了我们在TIMER中写代码来判断返回结果。这里调用FINDWINDOW函数来获取弹出窗口的句柄,如果大于0那么应该是执行完了。那么我们可以调用PB的SEND函数给该窗口发送CLOSE消息。来关闭该提示。为零情况那么就一直进行循环。直到弹出消息提示。
第二种就是利用YIELD函数
代码如下:
do while 1 = 1
这里内容
yield();
loop;
这样我们就可以对所有非框架下的b/s程序进行操作了。
二:框架
框架和非框架的区别就是在源代码中加入了IFRAME 标签 并在该标签内调用另外的页面。在对这种框架技术的B/S操作时我们只需要判断我们操作的内容在那个框架下,完了其余的操作和非框架的一样。只是在调用的时候有点区别。
区别是:
非框架:ole_webbrowser.object.document.getelementbyid
框架: ole_webbrowser.object.document.frames("框架名").document.getelementbyid
框架名:就是IFRAME 标签中的NAME字段。
完整程序界面如下:
首页代码:
string s_classname,s_window
integer l_i,i_hwnd
string s_order_code,s_code[]
s_code[] = order_code_array(mle_1.text)
if mle_1.linecount( ) > 0 and upperbound(s_code) > 0 then
//TIME控件停止
t_time1.stop( )
//将MLE控件清空
setnull(mle_1.text);
for l_i = 1 to upperbound(s_code)
//初始化
s_return = "";
if l_i<> upperbound(s_code) then
sle_1.text = "需处理:"+string( upperbound(s_code) )+"个。"+'已处理:'+string(l_i - 1)+'个。'+'正在处理第:'+string(l_i)+'个。剩余:'+string(upperbound(s_code) - l_i)+'个。';
else
sle_1.text = "需处理:"+string( upperbound(s_code) )+"个。"+'已处理:'+string(upperbound(s_code) )+'个。'+'正在处理第:0个。剩余:'+string(upperbound(s_code) - l_i)+'个。';
end if
s_order_code = s_code[l_i]
//设置时间选择为空
ole_webbrowser.object.Document.GetElementById("EFF_DATE").SetAttribute("value",'');
//给定单编码录入框填值
ole_webBrowser.object.Document.getElementsByName("orderCode").item(0).setattribute("value",s_order_code);
t_time4.start(1)
//点击查询按钮
ole_webbrowser.object.document.getelementsbyname('search').item(0).click;
do while 1 = 1
if s_return = 'true' then exit;
yield();
loop
next
t_time1.start( 1)
end if