使用vba按钮单击是抛出错误

时间:2014-08-31 04:01:29

标签: vba web-scraping

我需要点击网页中的按钮,但网页中有多个具有相同属性的元素,我的代码显示错误消息。

在跟踪和错误基础中,我试图逐个点击每个元素,即使我无法获得所需的东西。

请在下面找到我的代码

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

2 个答案:

答案 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)

POST请求:

我检查了使用Fiddler进行邮政编码搜索的过程,发现有一个POST请求:

Fiddler

注意:

因为我最初是从登录页面导航的,所以需要设置已经存在的cookie。

在POST请求正文中有以下表单参数(显示示例):

Sample

我仅使用zip参数到提到的标头URL进行了POST请求。我注意到响应是一个JSON字符串。

我用JSONConverter将这个字符串解析为一个JSON对象(一个字典)。该字典对象的键为:

  1. 列表
  2. styleSet
  3. serviceProviders
  4. 页面
  5. 卖家
  6. 剩余结果

每个键都可用于进一步检索字典集合。

例如Set a = JSON("listings") 'collection of dictionaries

对于listings,这是我将在下面解析的主题,集合中的每本词典都是一种媒介。字典的键是列出的属性。这里的信息比页面上立即显示的要多得多。

让我们以列出的第一个载具为我使用的"10001"的测试邮政编码。当手动选择时,返回此结果:

Website listing

将其与来自JSON请求的关联POST响应信息进行比较(这只是该车辆所有可用列出信息中的一部分!):

JSON response


VBA:

我使用前面提到的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