我的代码启动IE 11页面,点击链接然后尝试填写两个下拉列表。第一个使用值"2012"
成功填写。但第二个没有填入值"TOYOTA"
。
尽管第二个下拉列表不再显示命令“select”,但它不会显示"TOYOTA"
。换句话说,它从命令“select”变为空白。第一个下拉列表正确地从命令“select”变为"2012"
。
我认为这可能与第二个下拉列表将显示取决于第一个下拉列表实际选择的值的事实有关。并且需要一些onchange或fireevent命令。
我一直在网上搜索很多,我发现了类似的问题,我试图用它来解决问题。一般来说,我尝试过的代码有两种主要变体。如果有人能够运行此代码和/或建议我,我将一如既往地感激不尽。第一个是这样的:
Sub GetQuote()
Dim IE As Object
Set IE = CreateObject("InternetExplorer.Application")
IE.navigate ("website")
IE.Visible = True
Do
DoEvents
Loop Until IE.readystate = 4
Dim e
Set e = IE.document.getElementsByClassname("id name of button")(1)
e.Click
Application.Wait (Now + TimeValue("00:00:02"))
Do
DoEvents
Loop Until IE.readystate = 4
Dim z As Object
Set z = IE.document.getElementbyid("vehicleYearOfManufactureList")
z.Focus
z.SelectedIndex = 4
z.FireEvent ("onchange")
Application.Wait (Now + TimeValue("00:00:02"))
Dim y As Object
Set y = IE.document.getElementbyid("vehicleMakeList")
y.Focus
y.Value = "TOYOTA"
y.FireEvent ("onchange")
End Sub
第二个是这样的:
Sub GetQuote()
Dim IE As Object
Set IE = CreateObject("InternetExplorer.Application")
IE.navigate ("website")
IE.Visible = True
Do
DoEvents
Loop Until IE.readystate = 4
Dim e
Set e = IE.document.getElementsByClassname("sg-Btn sg-Btn--primary")(1)
e.Click
Application.Wait (Now + TimeValue("00:00:02"))
Do
DoEvents
Loop Until IE.readystate = 4
Dim z As Object
Set evt = IE.document.createEvent("HTMLEvents")
evt.initEvent "change", True, False
Set z = IE.document.getElementbyid("vehicleYearOfManufactureList")
z.SelectedIndex = 4
z.dispatchEvent evt
Application.Wait (Now + TimeValue("00:00:02"))
Dim y As Object
Set evt = IE.document.createEvent("HTMLEvents")
evt.initEvent "change", True, False
Set y = IE.document.getElementbyid("vehicleMakeList")
y.Value = "TOYOTA"
y.dispatchEvent evt
End Sub
以下是我要用“TOYOTA”填写的第二个下拉列表的源代码(当我在第二个下拉列表上盘旋时,我注意到的一件事是,而不是现在我的光标的常用箭头显示一个带有黑色圆圈的手,其中有一个穿透它,这似乎与第二个下拉列表似乎无法选择的事实一致):
<option value="">Select</option><optgroup label="Common Makes" id="commonVehicleMakeOptionGroup"><option value="AUDI">Audi</option><option value="BMW">BMW</option><option value="FORD">Ford</option><option value="HOLDEN">Holden</option><option value="HONDA">Honda</option><option value="HYUNDAI">Hyundai</option><option value="KIA">Kia</option><option value="MAZDA">Mazda</option><option value="MERCEDES-BENZ">Mercedes-Benz</option><option value="MITSUBISHI">Mitsubishi</option><option value="NISSAN">Nissan</option><option value="SUBARU">Subaru</option><option value="TOYOTA">Toyota</option><option value="VOLKSWAGEN">Volkswagen</option><option disabled="disabled"></option></optgroup><optgroup label="All Makes" id="allVehicleMakeOptionGroup"><option value="ABARTH">Abarth</option><option value="ALFA ROMEO">Alfa Romeo</option><option value="ASTON MARTIN">Aston Martin</option><option value="AUDI">Audi</option><option value="BENTLEY">Bentley</option><option value="BMW">BMW</option><option value="CHERY">Chery</option><option value="CHRYSLER">Chrysler</option><option value="CITROEN">Citroen</option><option value="DODGE">Dodge</option><option value="FIAT">Fiat</option><option value="FORD">Ford</option><option value="FOTON">Foton</option><option value="GEELY">Geely</option><option value="GREAT WALL MOTORS">Great Wall Motors</option><option value="HOLDEN">Holden</option><option value="HONDA">Honda</option><option value="HSV">HSV</option><option value="HYUNDAI">Hyundai</option><option value="INFINITI">Infiniti</option><option value="ISUZU">Isuzu</option><option value="IVECO">Iveco</option><option value="JAGUAR">Jaguar</option><option value="JEEP">Jeep</option><option value="KIA">Kia</option><option value="LAND ROVER">Land Rover</option><option value="LEXUS">Lexus</option><option value="LOTUS">Lotus</option><option value="MAHINDRA">Mahindra</option><option value="MAZDA">Mazda</option><option value="MERCEDES-BENZ">Mercedes-Benz</option><option value="MINI">Mini</option><option value="MITSUBISHI">Mitsubishi</option><option value="NISSAN">Nissan</option><option value="OPEL">Opel</option><option value="PEUGEOT">Peugeot</option><option value="PORSCHE">Porsche</option><option value="PROTON">Proton</option><option value="RANGE ROVER">Range Rover</option><option value="RENAULT">Renault</option><option value="SAAB">Saab</option><option value="SKODA">Skoda</option><option value="SMART">Smart</option><option value="SSANGYONG">Ssangyong</option><option value="SUBARU">Subaru</option><option value="SUZUKI">Suzuki</option><option value="TATA">Tata</option><option value="TOYOTA">Toyota</option><option value="VOLKSWAGEN">Volkswagen</option><option value="VOLVO">Volvo</option></optgroup></select>
答案 0 :(得分:3)
在下拉列表中选择选项的最佳方法是使用selectedIndex
属性或为其中一个selected = True
元素设置<option>
。之后,您可以自己触发onchange
事件。由于您的网页使用AJAX根据您的选择初始化更多列表,因此您必须等待其完成才能继续。
我很无聊,决定自己开车。我刚刚从下拉列表中选择了一个选项所需的功能,并且将onchange
事件触发到SelectOption()
函数。可能有更复杂的方法等待事件完成(例如检查ie.busy
或ie.readystate
)但我在设置每个选项后只是睡了几秒钟。
Set d = ie.document
SelectOption d, "vehicleYearOfManufactureList", "2012"
SelectOption d, "vehicleMakeList", "Toyota"
SelectOption d, "vehicleModelList", "Camry"
SelectOption d, "vehicleTransmissionList", "Auto"
SelectOption d, "vehicleNumberOfCylindersList", "4"
SelectOption d, "vehicleBodyTypeList", "4D Sedan"
' If you want to click the button when you're done...
d.getElementById("findcar").Click
MsgBox "Completed selections"
Function SelectOption(doc, strID, strText)
Dim e
Set e = doc.getElementById(strID)
If e Is Nothing Then
MsgBox "Could not find ID = " & strText
Exit Function
End If
' Select the option that matches our text...
Dim o
For Each o In e.Options
If StrComp(o.Text, strText, vbTextCompare) = 0 Then
o.Selected = True
Exit For
End If
Next
If e.SelectedIndex = 0 Then
MsgBox "Could not set value of " & strID & " to " & strText
Exit Function
End If
' Fire the onChange event...
Dim objEvent
Set objEvent = doc.createEvent("HTMLEvents")
objEvent.initEvent "change", False, True
e.dispatchEvent objEvent
' Wait a few seconds for the event to complete...
WScript.Sleep 3000
SelectOption = True
End Function
我在Windows脚本宿主中这样做了,所以我可以使用WScript.Sleep()
。您只需要将Application.Wait()
替换为VBA。
答案 1 :(得分:1)
您的实际网址在哪里?或者,它是否在公司防火墙后面,所以这里没有人可以看到它?无论如何,你的脚本应该是这样的。 。 。
Sub passValueToComboBox1()
Dim ie As Object
Dim oHTML_Element As IHTMLElement
Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True
ie.navigate "http://somehting.net/excel/combobox/index.php"
While ie.Busy Or ie.readyState <> 4: DoEvents: Wend
Set oHTML_Element = ie.document.getElementsByName("selectedReportClass")(0)
If Not oHTML_Element Is Nothing Then oHTML_Element.Value = "com.report.FUBU1"
For Each oHTML_Element In ie.document.getElementsByTagName("input")
If oHTML_Element.Type = "submit" Then oHTML_Element.Click: Exit For
Next
End Sub