我需要点击网页中的按钮,但网页中有多个具有相同属性的元素,我的代码显示错误消息。
在跟踪和错误基础中,我试图逐个点击每个元素,即使我无法获得所需的东西。
请在下面找到我的代码
Set objIE = CreateObject("InternetExplorer.Application")
With objIE
.Visible = True
.navigate "http://www.cargurus.com/"
Do While .busy Or _
.readyState <> 4
DoEvents
Loop
Set what = .document.getElementsByName("zip")
what.Item(0).Value = "606061"
Set Search = .document.getElementByClass("btn btn-warning")'Here i need to find the button and click using.
Search.Item(0).click ' I tried to iterate different values up to 4
End With
答案 0 :(得分:0)
首先:哪个城市应该有邮政编码606061?
第二:没有方法document.getElementByClass
,只有document.getElementsByClassName
。
第三:如果你有一个INPUT元素,那么你还有INPUTElement.form的FORM元素。因此,您只需使用INPUTElement.form.submit()提交表单。
...
Set what = .document.getElementsByName("zip")
what.Item(0).Value = "60601"
what.Item(0).form.submit
'Set Search = .document.getElementsByClassName("btn btn-warning")
'Search.Item(1).Click
...
问候
阿克塞尔
答案 1 :(得分:0)
我检查了使用Fiddler进行邮政编码搜索的过程,发现有一个POST请求:
注意:
因为我最初是从登录页面导航的,所以需要设置已经存在的cookie。
在POST请求正文中有以下表单参数(显示示例):
我仅使用zip
参数到提到的标头URL进行了POST请求。我注意到响应是一个JSON字符串。
我用JSONConverter将这个字符串解析为一个JSON对象(一个字典)。该字典对象的键为:
每个键都可用于进一步检索字典集合。
例如Set a = JSON("listings") 'collection of dictionaries
对于listings
,这是我将在下面解析的主题,集合中的每本词典都是一种媒介。字典的键是列出的属性。这里的信息比页面上立即显示的要多得多。
让我们以列出的第一个载具为我使用的"10001"
的测试邮政编码。当手动选择时,返回此结果:
将其与来自JSON
请求的关联POST
响应信息进行比较(这只是该车辆所有可用列出信息中的一部分!):
我使用前面提到的JSONConverter将POST响应解析为字典对象,然后处理“列表”集合。有很多数据。我最初将其打印到立即窗口中。我还打印到一个文本文件(不包含在代码中)。待办事项:研究如何合理地处理返回的数据量。
Option Explicit
Public Sub GetSInfo()
Dim objHTTP As Object, JSON As Object
Const ZIP As String = "10001"
Const URL = "https://www.cargurus.com//Cars/inventorylisting/ajaxFetchSubsetInventoryListing.action?sourceContext=carGurusHomePageModel "
Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
Dim sBody As String
sBody = "zip=" & ZIP
With objHTTP
.SetTimeouts 10000, 10000, 10000, 10000
.Open "POST", URL, False
.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
.setRequestHeader "Content-type", "application/x-www-form-urlencoded"
On Error Resume Next
.send (sBody)
If Err.Number = 0 Then
If .Status = "200" Then
Set JSON = JsonConverter.ParseJson(.responseText)
WriteTxtFile (.responseText)
Else
Debug.Print "HTTP " & .Status & " " & .statusText
Exit Sub
End If
Else
Debug.Print "Error " & Err.Number & " " & Err.Source & " " & Err.Description
Exit Sub
End If
On Error GoTo 0
End With
'Debug.Print TypeName(JSON) 'Dictionary object
Dim key As Variant
' For Each key In JSON.keys
' Debug.Print key
' Next key
'
' listings
'styleSet
'serviceProviders
'Page
'sellers
'remainingResults
Dim a As Object, i As Long, j As Long
Set a = JSON("listings") 'collection of dictionaries
For i = 1 To a.Count
For Each key In a(i).keys
Select Case TypeName(a(i)(key))
Case "Collection"
For j = 1 To a(i)(key).Count
Debug.Print key & " " & a(i)(key)(j)
Next j
Case Else
Debug.Print key & " " & a(i)(key)
End Select
Next key
Next i
End Sub
参考:
除了添加JSONConverter.bas
外,您还需要执行VBE>工具>引用> Microsoft Scripting Runtime