onchange и onclick не работают последовательно - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь очистить данные с веб-страницы. В этом процессе мне нужно изменить один из выпадающий этой веб-страницы. Я был в состоянии сделать это. Но когда я вручную меняю выпадающий, веб-страница меняет свое содержимое, как изображения и некоторый другой текст. Но когда я это делаю используя VBA, он этого не делает. Я проверял свой код несколько раз. Так что, если я запускаю программу 10 раз это изменит содержание 1 или 2 раза. Поэтому я не понимаю, что происходит

Это HTML-код этой выпадающей области.

<tbody>
<tr>
<td class="label"><label for="pa_product">Product</label></td>
<td class="value"><select id="pa_product" name="attribute_pa_product" data-attribute_name="attribute_pa_product">
<option value="">Choose an option…</option>
<option value="air-xs-2-octo-16-inch" class="attached enabled">AIR XS 2 Octo 16 Inch</option>
<option value="air-xs-2-octo-18-inch" class="attached enabled">AIR XS 2 Octo 18 Inch</option>
<option value="air-xs-2-octo-20-inch" class="attached enabled">AIR XS 2 Octo 20 Inch</option>
</select> <a class="reset_variations" href="#reset">Clear selection</a></td>
</tr>
</tbody>

И это код, который я разработал. Я думаю, что onchange и onclick работают редко.

    Do
    DoEvents
    Loop Until objIE.readystate = 4

    'Body(HTML)
    'MsgBox objIE.document.getElementById("tab-description").outerHTML, , "OHTML"
    'MsgBox objIE.document.getElementById("tab-description").innerHTML, , "IHTML"
    'MsgBox objIE.document.getElementById("tab-description").innerText, , "ITex"
    WS.Range("D" & i).Value = objIE.document.getElementById("tab-description").outerHTML

    'Option 1 value
    'MsgBox objIE.document.getElementById("pa_product").outerHTML
    'MsgBox objIE.document.getElementById("pa_product").innerHTML
    'MsgBox objIE.document.getElementById("pa_product").innerText


    objIE.document.getElementById("pa_product").selectedindex = 1
    Application.Wait (Now + TimeValue("0:00:01"))
    'modify the web page for that selected item
    'For x = 1 To 5
    'objIE.document.getElementById("pa_product").selectedindex = 1
    Application.Wait (Now + TimeValue("0:00:03"))
    objIE.document.getElementById("pa_product").FireEvent ("onchange")
    objIE.document.getElementById("pa_product").FireEvent ("Onclick")
    objIE.document.getElementById("pa_product").FireEvent ("onmousedown")
    'Next x

    Application.Wait (Now + TimeValue("0:00:03"))

    WS.Range("J" & i).Value = objIE.document.getElementById("pa_product").Item(1).innerText

onchange и onclick не работают последовательно

Сначала я использовал одно событие. Но безуспешно. Поэтому я попытался использовать все события, которые нашел так. FireAllEvents (objIE.document.getElementById ("pa_product")) Функция FireAllEvents (ByRef objHTML)

Function FireAllEvents(ByRef objHTML)
With objHTML
    .FireEvent ("onblur")
    .FireEvent ("onchange")
    .FireEvent ("oncontextmenu")
    .FireEvent ("onfocus")
    .FireEvent ("oninput")
    .FireEvent ("onreset")
    '.FireEvent ("onsearch")
    .FireEvent ("onkeydown")
    .FireEvent ("onkeypress")
    .FireEvent ("onkeyup")
    .FireEvent ("onclick")
End With
End Function

тогда я назвал эту функцию вот так

    FireAllEvents (objIE.document.getElementById("pa_product"))

    Application.Wait (Now + TimeValue("0:00:03"))

    WS_Oceanic.Range("J" & i).Value = objIE.document.getElementById("pa_product").Item(1).innerText
    objIE.document.getElementById("pa_product").Click   

Но это тоже не сработало.
Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Иногда вам нужно сфокусировать и расфокусировать элемент, чтобы он обнаружил какие-то события, как я обнаружил. Код ниже работал надежно для меня, хотя всего несколько тестов.

Вместо того, чтобы использовать выбранный индекс, вы также можете использовать значение параметра, чтобы установить значение выбора, что я и сделал ниже.

Public Sub SOTest()
    Dim ie      As Object: Set ie = CreateObject("InternetExplorer.Application")
    Dim ele     As Object
    Const url   As String = "https://oceanicaus.com.au/products/oceanic-airxs-2-octopus"

    With ie
        .Navigate url
        .Visible = True

        Do Until .readystate = 4 And Not .busy
            DoEvents
        Loop

        Set ele = .document.getElementByID("pa_product")

        With ele
            .Focus
            .Value = "air-xs-2-octo-16-inch"
            .fireEvent ("onChange")
            .document.getElementsByTagName("button")(0).Focus
        End With

    End With
End Sub
0 голосов
/ 02 ноября 2018

Это очень просто с селеновой основной оболочкой для VBA. После установки selenium basic вы добавляете ссылку на Selenium Type Library через VBE> Инструменты> Ссылки

Option Explicit
Public Sub MakeSelection()
    Dim d As WebDriver
    Set d = New ChromeDriver
    Const URL = "https://oceanicaus.com.au/products/oceanic-airxs-2-octopus/"

    With d
        .Start "Chrome"
        .get URL
        .FindElementById("pa_product").AsSelect.SelectByIndex 1   'You can also use  .SelectByText

        Stop
        .Quit
    End With
End Sub
...