找回密码
 加入
搜索
查看: 6040|回复: 14

[IE类操作] 【求助】_IEFormElementOptionSelect怎样检索含有 的列表框项目?【已解决】

  [复制链接]
发表于 2012-4-28 16:57:51 | 显示全部楼层 |阅读模式
本帖最后由 liangzz 于 2012-5-15 15:29 编辑

测试网页为
<html>
<head>
<title>Untitled</title>
</head>
<body>
<form name='frm1' onSubmit='javascript:alert("ExampleFormSubmitted");' method='post'>
<table cellspacing=6 cellpadding=6 border=1>
职务级别
<TD align=left><SELECT name=DutyLevel> 
<OPTION value="" selected>请选择</OPTION> 
<OPTION value=26010100>   国家级正职</OPTION> 
<OPTION value=26010200>   国家级副职</OPTION> 
<OPTION value=26010300>   省部级正职</OPTION> 
<OPTION value=26010400>   省部级副职</OPTION> 
<OPTION value=26010500>   厅局级正职</OPTION> 
<OPTION value=26010600>   厅局级副职</OPTION> 
</SELECT></TD></table>
</body>
</html>
=============================
使用代码
#include <IE.au3>
Dim $oIE
$oIE = _IECreate(@ScriptDir & "\testhtml.htm",0,1,1,0);创建一个IE浏览器窗口
Local $oForm = _IEFormGetObjByName($oIE, "frm1")
$oQuery = _IEFormElementGetObjByName ($oForm, "DutyLevel")
$value="   国家级正职"

_IEFormElementOptionSelect($oQuery, $Value, -1, "byText")
=============================
"byText"模式下,无论$value="&nbsp;&nbsp;&nbsp;国家级正职"还是$value="   国家级正职"或者$value="国家级正职"
都无法使目标列表框的数据更改为“国家级正职”

请注意,这里只讨论_IEFormElementOptionSelect的"byText"模式,其他模式不再讨论之列

请大家拔刀相助!!!!谢谢谢谢!
发表于 2012-4-28 17:09:04 | 显示全部楼层
html的option的">"呢?
发表于 2012-4-28 19:29:28 | 显示全部楼层
value 和 text不一样
发表于 2012-4-28 19:31:50 | 显示全部楼层
本帖最后由 风行者 于 2012-4-28 19:37 编辑

可以使用value和index模式选择

我用网页快捕直接生成的代码就可以得到:
;脚本生成于网页快捕

#include <IE.au3>
; #include <IEQuery.au3>
$oIE = _IEAttach("file:///C:/Documents%20and%20Settings/Administrator/桌面/a.html","url")
$Ele = _IEGetObjByName($oIE,"DutyLevel") ;注意相同name情况,需要第三参数
;_IEQuery通用获取元素对象
; $Ele = _IEQuery($oIE,"SELECT",'outertext=" 请选择    国家级正职    国家级副职    省部级正职    省部级副职    厅局级正职    厅局级副职"')
_IEFormElementOptionSelect($Ele,1,1,"byIndex") ;按0基索引选择下拉第一个
发表于 2012-4-28 20:24:01 | 显示全部楼层
回复 4# 风行者

老大, 您热心过头?
我看楼主写着:
"请注意,这里只讨论_IEFormElementOptionSelect的"byText"模式,其他模式不再讨论之列"
发表于 2012-4-28 20:27:34 | 显示全部楼层
_IEFormElementOptionSelect($Ele,26010100) ;按值
发表于 2012-4-28 20:47:41 | 显示全部楼层
&nbsp替换成空格呢?
发表于 2012-4-28 21:23:26 | 显示全部楼层
&nbsp 看上去是空格,但是编码不一样,udf里
是直接判断是否相等的,下面是部分代码
$oItems = $o_object.options
For $oItem In $oItems
                                If String($oItem.text) = $s_string Then

但是这样判断并不会相等,测试转换几种编码都不成功
发表于 2012-4-29 22:24:40 | 显示全部楼层
不知au3内部是用什么编码判断的,以下思路可以暂时不管它。
#include <IE.au3>

Local $oIE = _IECreate(@ScriptDir & "\testhtml.htm");创建一个IE浏览器窗口
Local $oOption = _IETagNameGetCollection($oIE, "Option", 2)
Local $oQuery = $oOption.text
Local $oForm = _IEFormGetObjByName($oIE, "frm1")
$oSelect = _IEFormElementGetObjByName($oForm, "DutyLevel")
Sleep(1000)
_IEFormElementOptionSelect($oSelect, $oQuery, 1, "byText")
发表于 2012-4-29 23:11:04 | 显示全部楼层
风行者 发表于 2012-4-28 20:27
<html>
<head>
<title>Untitled</title>
</head>
<body>
<form name='frm1' onSubmit='javascript:alert("ExampleFormSubmitted");' method='post'>
<table cellspacing=6 cellpadding=6 border=1>
职务级别
<TD align=left><SELECT name=DutyLevel onChange="alert(this.value)"> 
<OPTION value="" selected>请选择</OPTION> 
<OPTION value=26010100>   国家级正职</OPTION> 
<OPTION value=26010200>   国家级副职</OPTION> 
<OPTION value=26010300>   省部级正职</OPTION> 
<OPTION value=26010400>   省部级副职</OPTION> 
<OPTION value=26010500>   厅局级正职</OPTION> 
<OPTION value=26010600>   厅局级副职</OPTION> 
</SELECT></TD></table>
</body>
</html>
发表于 2012-4-30 07:33:47 | 显示全部楼层
目前所知$oItem.text获取&nbsp;的ascii值为十进制160,是扩展ascii码,而非普通的空格(ascii码为十进制32)。是HTML DOM option对象的text属性所决定。还是用9楼的方法吧,仍为byText模式,以夷制夷吧
 楼主| 发表于 2012-4-30 11:55:52 | 显示全部楼层
非常感谢大家的热心帮忙,我试了一下,9楼的方法似乎对头(因为我那个表单里并非只有1个option对象,还需测试),非常感谢!有消息再麻烦大家!感谢风行者、user3000、komaau3、shqf、lpxx等发言以及未发言者的关注和指点!
发表于 2012-5-1 15:07:30 | 显示全部楼层
已完美解决楼主的问题。原想改变Scite的全局设置,想让ascii值为160(十进制)的字符能复制au3脚本文件中,却总不能如愿。后想出如下方法可解决:
#include <IE.au3>
Local $oIE = _IECreate(@ScriptDir & "\test.html")
Local $oOption = _IETagNameGetCollection($oIE, "Option", 2)
Local $oQuery = $oOption.text
Local $oFile = FileOpen(@ScriptDir & "\1.txt", 258);使用 Unicode UTF8 (无BOM)写模式
FileWrite($oFile, $oQuery)
FileClose($oFile)
1.txt中得到好$oQuery的值,其&nbsp;的已转换ascii值为十进制160,是扩展ascii码,而非普通的空格(ascii码为十进制32)。
再将如下代码复制到一个文本文件,如2.txt中:
#include <IE.au3>
Local $oIE = _IECreate(@ScriptDir & "\test.html")
Local $oQuery = "   国家级副职"
Local $oForm = _IEFormGetObjByName($oIE, "frm1")
$oSelect = _IEFormElementGetObjByName($oForm, "DutyLevel")
Sleep(1000)
_IEFormElementOptionSelect($oSelect, $oQuery, 1, "byText")
注意上面$oQuery的值前为三个普通空格,用1.txt中的内容替换$oQuery的值,再整个文件粘贴加Scite中,再运行吧, byText模式已没有问题了。编译后也一样呵。

评分

参与人数 1金钱 +30 贡献 +2 收起 理由
afan + 30 + 2

查看全部评分

 楼主| 发表于 2012-5-15 15:27:48 | 显示全部楼层
天才啊!非常感谢shqf!!!!!!
 楼主| 发表于 2012-6-15 09:36:18 | 显示全部楼层
shqf大哥的解决方案拜读了,但总觉得有些繁琐,以下是我利用for循环进行检索的解决方案,大家看看

#include <IE.au3>
$oIE = _IECreate(@ScriptDir & "\test.html",0,1,1,0);创建一个IE浏览器窗口
Local $oForm = _IEFormGetObjByName($oIE, "frm1")
$oQuery = _IEFormElementGetObjByName($oForm, "DutyLevel")
For $i=1 To 100;假设Option列表项目不满100个
        $oOption = _IETagNameGetCollection($oQuery, "Option", $i)
        $oTxt = $oOption.text
        If StringStripWS($oTxt,8)="0" Then ExitLoop;若检索到Option列表项目长度为0即终止循环检索
        If StringInStr($oTxt,"国家级副职") Then
                _IEFormElementOptionSelect($oQuery, $i, 1, "byIndex")
                ExitLoop
        EndIf
Next
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-18 23:40 , Processed in 0.081222 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表