注册 登录
编程论坛 VFP论坛

请高手帮忙解决VFP 使用webbrower 自动填表并提交的问题

yangmz 发布于 2021-08-19 11:32, 3133 次点击
刚学习用VFp webbrower 控件编程,以下是一段JSP代码:

<form action="change_w2.jsp?i=22024738&amp;tkn=LAcGKVGSIaQy7SDZP8I4-NwYwoCyTZr4iW:1loaHMXu3Y" method="post">
洗练石:<input name="count" size="15" type="text"/>
<input type="submit" value="确定" />
</form>

我的想法是:为的文本框赋值,并提交按钮。
我是这样做的:
文本框赋值:thisform.web1.document.all("count").SetAttribute("value","2")   *这句没有问题行运行,赋值2给文本框
提交按钮:我试图通过 thisform.web1.document.all(i).type 查找到类型为submit的数组为11,然后用以下方法提交:
  用thisform.web1.document.all(11).click()    *不行,死机
  用thisform.web1.document.all(11).InvokeMember("click")  *提示未的错误

提交按钮不知道如何写了,请高手帮忙解决一下

[此贴子已经被作者于2021-8-19 11:40编辑过]

25 回复
#2
吹水佬2021-08-19 11:48
给个网址才好测试
#3
吹水佬2021-08-20 09:15
试试:
程序代码:
cUrl = "http://game./mergecyhc5/treasure/change_w2.jsp?i=20347215&tkn=oMGidmQbaxEvkugMzELRo1h1TMNzYceBiWloaHMXu3Y"
oHttp = CREATEOBJECT("MSXML2.XMLHTTP")
oHttp.Open("POST", cUrl, 0)
oHttp.setRequestHeader("content-type", "application/x-www-form-urlencoded")
oHttp.Send("count=2")
cTxt = oHttp.ResponseText
? STREXTRACT(cTxt,"<body>","</body>")
#4
yangmz2021-08-20 10:48
回复 3楼 吹水佬
谢谢吹水佬!这段代码能行。不知道,新建的这个对象在其它电脑上是否需要进行额外的控件注册。
另外,如果采用html_DOM方式代码运行就更好了。
#5
吹水佬2021-08-20 11:25
回复 4楼 yangmz
windows环境应该就可以
#6
nbwww2021-08-22 07:27
回复 3楼 吹水佬


[此贴子已经被作者于2021-8-22 07:53编辑过]

#7
吹水佬2021-08-23 12:03
以下是引用yangmz在2021-8-20 10:48:52的发言:

如果采用html_DOM方式代码运行就更好了。

没见有定义的提交事件过程,用html_DOM方式可能不行。
可以试试用JS代码执行form的提交方法。
执行返回的结果
只有本站会员才能查看附件,请 登录

程序代码:
of = CREATEOBJECT("form1")
of.show(1)

DEFINE CLASS form1 AS Form
    width = 800
    height = 500
    ADD OBJECT cmd1 as commandbutton WITH left=10,top=10,height=25,caption="test"
    ADD OBJECT wb AS Olecontrol WITH top=40,width=800,height=460,Anchor=15,Visible=.T.,OleClass="Shell.Explorer.2"

    PROCEDURE Init
        this.wb.Silent = 1
        thisform.wb.Navigate("http://game./mergecyhc5/treasure/change_w2.jsp?i=20347215&tkn=oMGidmQbaxEvkugMzELRo1h1TMNzYceBiWloaHMXu3Y")
    ENDPROC

    PROCEDURE cmd1.click
        TEXT TO jsCode TEXTMERGE NOSHOW PRETEXT 15
            var fm=document.getElementsByTagName("form")[0];
            fm.elements[0].value=2;
            fm.submit();
        ENDTEXT
        thisform.wb.document.parentWindow.execScript(jsCode)
    ENDPROC
ENDDEFINE

#8
yangmz2021-08-23 21:22
回复 7楼 吹水佬
吹水佬高手啊
各种方法都能实现啊
最终,既然html dom方式不行,我还是选择Createobject("MSXML2.XMLHTTP")这个方法吧

我还是比较疑惑,明明通过调试器可以访问dom内的对象,如item,一编译后,就不能识别了。
是不是VFP真的老了?

#9
吹水佬2021-08-23 23:35
回复 8楼 yangmz
试试这样表达
fm = thisform.wb.document.getElementsByTagName("form").item(0)

fm = thisform.wb.document.getElementsByTagName("form").[0]
#10
yangmz2021-08-24 09:34
真搞不懂下面这句为第一个表单的第一个元素赋值为200

thiform.web1.document.getElementsByTagName("form").[0].item(0).setAttribute('value',200)

我在该语句前 SUSPEND 调试器跳出,我在监视窗口中运行这句,没有问题,正确运行,值为200。但是,我取消 SUSPEND 后运行,却提示未知名的错误,点击“挂起”,在调试器的监视窗口中运行该句,又变正确了。

我感觉头晕了,这是怎么回事啊?
#11
fown2021-08-24 10:43
搞那么复杂干啥啊,无非就是一个网页的填充

thisform.wb.Navigate("http://game.)
INKEY(2)

thisform.wb.Document.getElementsByTagName("input").item(0).value="200"
只有本站会员才能查看附件,请 登录
#12
fown2021-08-24 10:44
以下是引用yangmz在2021-8-24 09:34:02的发言:

真搞不懂下面这句为第一个表单的第一个元素赋值为200

thiform.web1.document.getElementsByTagName("form").[0].item(0).setAttribute('value',200)

我在该语句前 SUSPEND 调试器跳出,我在监视窗口中运行这句,没有问题,正确运行,值为200。但是,我取消 SUSPEND 后运行,却提示未知名的错误,点击“挂起”,在调试器的监视窗口中运行该句,又变正确了。

我感觉头晕了,这是怎么回事啊?

你要先学会跟踪网页,才能找到其真正的控件ID或者名称。
#13
yangmz2021-08-24 12:30
fown,你提供的这个代码:
INKEY(2)
thisform.wb.Document.getElementsByTagName("input").item(0).value="200"
能用。

但不知道 INKEY(2) 这句在这里起到什么作用?查手册 INKEY(2) 意思是等待2秒钟键盘输入。

删除 INKEY(2) 这句后,就提示 item 不是对象,出错,不能正确运行。
#14
yangmz2021-08-24 16:52
我猜想应该是该页面还没有完全加载,是dom不能正常运行的原因。
#15
吹水佬2021-08-24 17:00
以下是引用fown在2021-8-24 10:43:19的发言:

搞那么复杂干啥啊,无非就是一个网页的填充

从楼顶贴看,数据填充输入没问题,主要问题是提交失败。
#16
yangmz2021-08-24 18:43
估计是网页加载的问题,使用 inkey 就解决了访问对象的问题。现在还是提交的问题没有解决

thisform.web1.Document.getElementsByTagName("input").item(1).Click()     *使用按钮的 click 事件
thisform.web1.Document.getElementsByTagName("form").[0].submit           *使用表单的 submit 方法
   或thisform.web1.Document.getElementsByTagName("form").item(0).submit
thisform.web1.Document.forms(0).submit()                                 *使用表单的 submit 方法

以上三个语句理论上都能提交按钮,不知道为什么不能提交成功?

如果真不行,只能用XMLHTTP实现了

[此贴子已经被作者于2021-8-24 18:47编辑过]

#17
yangmz2021-08-24 23:50
最后,终于发现提交按钮不成功的问题所在,应该是 form 的 action 地址不完整,所以可以针对这个问题进行处理了。
感谢各位vfper。
VFP不过时,过时的是人啊!
#18
fown2021-08-25 07:51
以下是引用yangmz在2021-8-24 18:43:24的发言:

估计是网页加载的问题,使用 inkey 就解决了访问对象的问题。现在还是提交的问题没有解决

thisform.web1.Document.getElementsByTagName("input").item(1).Click()     *使用按钮的 click 事件
thisform.web1.Document.getElementsByTagName("form").[0].submit           *使用表单的 submit 方法
   或thisform.web1.Document.getElementsByTagName("form").item(0).submit
thisform.web1.Document.forms(0).submit()                                 *使用表单的 submit 方法

以上三个语句理论上都能提交按钮,不知道为什么不能提交成功?

如果真不行,只能用XMLHTTP实现了




眼睛做手术了,修养中,不能用电脑。要网页填充,首先要知道控件的根本。
它是input,调用他的事件,也要它有才行。


1.onfocus  当input 获取到焦点时触发

2.onblur  当input失去焦点时触发,注意:这个事件触发的前提是已经获取了焦点再失去焦点的时候才会触发该事件,用于判断标签为空。

3.onchange 当input失去焦点并且它的value值发生变化时触发,个人感觉可以用于注册时的确认密码。

4.onkeydown 按下按键时的事件触发,

5.onkeyup 当按键抬起的时候触发的事件,在该事件触发之前一定触发了onkeydown事件--相当于一个按键,两个事件,没怎么用过

6.onclick  主要是用于 input type=button,input作为一个按钮使用时的鼠标点击事件

7.onselect  当input里的内容文本被选中后执行,只要选择了就会触发,不是全部选中

8.oninput  当input的value值发生变化时就会触发,(与onchange的区别是不用等到失去焦点就可以触发了)
#19
yangmz2021-08-25 20:01
收藏中
#20
schtg2021-08-26 05:51
学习啦,谢谢!
#21
fown2021-08-26 09:20
以下是引用吹水佬在2021-8-24 17:00:48的发言:


从楼顶贴看,数据填充输入没问题,主要问题是提交失败。



可以用啊,详见图片红框
只有本站会员才能查看附件,请 登录
#22
吹水佬2021-08-26 11:09
以下是引用fown在2021-8-26 09:20:41的发言:

可以用啊,详见图片红框

可以用吗,用什么方法?
试过楼顶和16楼的提交好象不行:
用thisform.web1.document.all(11).click()    *不行,死机
用thisform.web1.document.all(11).InvokeMember("click")  *提示未的错误
thisform.web1.Document.getElementsByTagName("input").item(1).Click()     *使用按钮的 click 事件
thisform.web1.Document.getElementsByTagName("form").[0].submit           *使用表单的 submit 方法
   或thisform.web1.Document.getElementsByTagName("form").item(0).submit
thisform.web1.Document.forms(0).submit()   
#23
fown2021-08-26 15:06
以下是引用吹水佬在2021-8-26 11:09:31的发言:


可以用吗,用什么方法?
试过楼顶和16楼的提交好象不行:
用thisform.web1.document.all(11).click()    *不行,死机
用thisform.web1.document.all(11).InvokeMember("click")  *提示未的错误
thisform.web1.Document.getElementsByTagName("input").item(1).Click()     *使用按钮的 click 事件
thisform.web1.Document.getElementsByTagName("form").[0].submit           *使用表单的 submit 方法
   或thisform.web1.Document.getElementsByTagName("form").item(0).submit
thisform.web1.Document.forms(0).submit()   


你IE的版本是多少啊,要先关注这个。不同的IE,DOM引用不一样
#24
fown2021-08-26 15:21
thisform.wb.Document.getElementsByTagName("input").item(1).click
ie8可以运行
你可以试一下
MESSAGEBOX(thisform.wb.Document.getElementsByTagName("input").item(1).VALUE)
看看结果
#25
吹水佬2021-08-26 17:24
回复 24楼 fown
确实,IE7、IE8可以,IE9及以上提交不行。
#26
yangmz2021-08-26 20:59
我的操作系统是win10自带的microsoft edge

看来还得搞一个判断IE版本的代码了
MESSAGEBOX(thisform.wb.Document.getElementsByTagName("input").item(1).VALUE)  显示的是“确定”

thisform.wb.Document.getElementsByTagName("input").item(1).click   *以可运行,但提示找不到正确的网页地址,可能是因为地址不完整的原因,有了方向,我再研究一下应该没有问题
经过这一番的讨论,我学到了很多,谢谢。



[此贴子已经被作者于2021-8-26 21:11编辑过]

1