无法使我的脚本停止打印错误的结果

时间:2019-03-10 13:01:58

标签: vba web-scraping internet-explorer-11

我已经使用IE在vba中创建了一个脚本,以在网页中填写少量输入,以便到达新页面,并根据在输入框中输入的一些值来检查某些项目的可用性。

向您介绍:脚本当前正在执行的操作:

  1. 从登录页面中选择Buy Bricks
  2. 输入年龄30和国家/地区United Kingdom,然后单击submit按钮
  3. 在下一页上,在Element/design数字框中输入Lego件的唯一标识号以填充结果。
  

我的脚本可以满足上述所有要求。但是,当我尝试使用三个不同的数字时,例如4219725765467230223中,我看到中间765467的那个不会填充任何结果,但是它将打印先前编号的结果。

下面的脚本中的for loop中都使用了这三个数字。

在没有结果而不是打印错误结果的情况下,如何使脚本什么也不打印?

Site address

到目前为止,我的脚本是:(无法消除硬编码延迟)

Sub GetDetails()
    Const timeOut = 10
    Dim IE As New InternetExplorer, Html As HTMLDocument
    Dim elem As Object, post As Object, inputNum As Variant
    Dim ageInput As Object, itm As Object, T As Date

    With IE
        .Visible = True
        .navigate "https://www.lego.com/en-gb/service/replacementparts"
        While .Busy Or .readyState < 4: DoEvents: Wend
        Set Html = .document
        Dim event_onChange As Object
        Set event_onChange = .document.createEvent("HTMLEvents")
        event_onChange.initEvent "change", True, False

        Html.querySelectorAll(".arrow-list-info")(2).Click

        Do: Set ageInput = Html.querySelector("input[id*='How old']"): DoEvents: Loop While ageInput Is Nothing
        ageInput.innerText = 30
        Html.querySelector("[label='United Kingdom").Selected = True
        Html.querySelector("select").dispatchEvent event_onChange
        Html.querySelector("[ng-click='startFlow()'").Click

        While .Busy Or .readyState < 4: DoEvents: Wend
        Set Html = .document

        For Each inputNum In [{4219725,765467,230223}]
            T = Timer
            Do: Set post = Html.querySelector("[placeholder='Element/design number']"): DoEvents: Loop While post Is Nothing
            post.ScrollIntoView
            post.Focus
            post.innerText = inputNum
            Html.querySelector("button[ng-click='searchItemNumber()']").Click

            'Can't kick out this hardcoded delay
            Application.Wait Now + TimeValue("00:00:02")

            Do
                Set elem = Html.querySelector("div.list-item")
                If Timer - T > timeOut Then Exit Do
                DoEvents
            Loop While elem Is Nothing

            Set itm = Html.querySelector("h6.title")
            If Not itm Is Nothing Then
                Debug.Print itm.innerText
            Else:
                Debug.Print "Found Nothing"
            End If
        Next inputNum
        Stop
    End With
End Sub

1 个答案:

答案 0 :(得分:4)

所以这需要整理,但可以。我摆脱了明确的等待,并添加了一个等待微调框消失的等待。对于“无结果”部分,我希望在html中找到一个找不到的附加元素。

Option Explicit
Public Sub GetDetails()
    Const timeOut = 10
    Dim ie As New InternetExplorer, html As HTMLDocument
    Dim elem As Object, post As Object, inputNum As Variant
    Dim ageInput As Object, itm As Object, t As Date

    With ie
        .Visible = True
        .navigate "https://www.lego.com/en-gb/service/replacementparts"

        While .Busy Or .readyState < 4: DoEvents: Wend

        Set html = .document

        Dim event_onChange As Object
        Set event_onChange = .document.createEvent("HTMLEvents")
        event_onChange.initEvent "change", True, False

        html.querySelectorAll(".arrow-list-info")(2).Click

        Do: Set ageInput = html.querySelector("input[id*='How old']"): DoEvents: Loop While ageInput Is Nothing

        ageInput.innerText = 30
        html.querySelector("[label='United Kingdom']").Selected = True
        html.querySelector("select").dispatchEvent event_onChange
        html.querySelector("[ng-click='startFlow()']").Click

        While .Busy Or .readyState < 4: DoEvents: Wend

        For Each inputNum In [{4219725,765467,230223}]

                Do: Set post = .document.querySelector("[placeholder='Element/design number']"): DoEvents: Loop While post Is Nothing

                post.Focus
                post.innerText = inputNum
                html.querySelector("button[ng-click='searchItemNumber()']").Click

                Do
                Loop While .document.querySelectorAll(".basic-search-btn .icon-spinner-arrows").Length > 0

            t = Timer
            Do
                Set elem = html.querySelector("div.list-item")
                If Timer - t > timeOut Then Exit Do
                DoEvents
            Loop While elem Is Nothing

            Set elem = Nothing
            Set itm = html.querySelector("h6.title")

            If html.querySelectorAll(".alert.alert-info.margin-top.ng-hide").Length = 1 Then
                Debug.Print "Found nothing"
            Else
                Debug.Print itm.innerText
            End If
            Set itm = Nothing
        Next inputNum
        ie.Quit
    End With
End Sub