Функция нажатия кнопки на веб-странице не работает в макросе Excel

#excel #vba

#преуспеть #vba #excel

Вопрос:

Я пытаюсь создать автоматизацию отслеживания FedEx, но мне не удается нажать кнопку отслеживания. есть идеи, пожалуйста?

 Sub Fedex()
    
    Dim IE As Object
    Dim doc As HTMLDocument
    
    Set IE = New InternetExplorerMedium
    IE.Visible = True
    IE.navigate "https://www.fedex.com/en-us/home.html"
    
    Do While IE.Busy Or IE.READYSTATE = 4
    Loop
    
    Application.Wait (Now   TimeValue("0:00:07"))
    
    Set searchbx = IE.document.getElementsByName("trackingnumber")(0)
    searchbx.Value = "Howdy!"

    IE.document.getElementById("btnSingleTrack").Click

End Sub
  

Ответ №1:

Редактировать — сделайте это напрямую через параметр url

Вы можете управлять URL-адресом, по которому вы перемещаетесь. Посмотрите на следующий пример. Измените значение последнего параметра YourTrackingNumberHere на рабочий номер отслеживания и протестируйте его вручную:

https://www.fedex.com/apps/fedextrack/?action=trackamp;cntry_code=usamp;locale=en_USamp;trackingnumber=YourTrackingNumberHere

Первый ответ, чтобы заставить его работать по-вашему

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

 Sub Fedex()
  Dim ie As Object
  Dim searchBox As Object
  
  'Initialize Internet Explorer, set visibility,
  'call URL and wait until page is fully loaded
  Set ie = CreateObject("InternetExplorer.Application")
  ie.Visible = True
  ie.navigate "https://www.fedex.com/en-us/home.html"
  Do While ie.READYSTATE <> 4: DoEvents: Loop
  
  Set searchBox = ie.document.getElementsByName("trackingnumber")(0)
  searchBox.Value = "Howdy!"
  'Trigger the change event of the input box
  Call TriggerEvent(ie.document, searchBox, "change")
  'I don't know why, but you have to wait a few seconds
  'Otherwise the button click will not work
  'In my tests, I need 5 seconds to make it work in every case
  'You can make your own tests for your environment
  Application.Wait (Now   TimeValue("0:00:05"))
  
  ie.document.getElementById("btnSingleTrack").Click
End Sub
  

С помощью этой процедуры вы можете запускать каждое событие:

 Private Sub TriggerEvent(htmlDocument As Object, htmlElementWithEvent As Object, eventType As String)

  Dim theEvent As Object

  htmlElementWithEvent.Focus
  Set theEvent = htmlDocument.createEvent("HTMLEvents")
  theEvent.initEvent eventType, True, False
  htmlElementWithEvent.dispatchEvent theEvent
End Sub
  

Комментарии:

1. это сработало! большое спасибо @Zwenn! могу ли я задать еще один вопрос / вопрос? если я попытаюсь прочитать фактическое значение, подобное этому, я получаю ошибку 438. ‘strAdd = ie.document.getElementsByClassName(«redesignSnapshotTVC.snapshotController_date.dest»).Внутренний текст этой книги. Листы («Лист1»).Диапазон («A2»).Значение = STRADDD’

2. @Petolicious Вы забыли хотя бы индекс в круглых скобках позади getElementsByClassName()(hereTheIndex) . Ваш код ожидает полной загрузки страницы, прежде чем вы получите к ней доступ?

3. @Zween вот как выглядит поле, в котором указано нужное мне значение <h1 class=»redesignSnapshotTVC tank-заголовок-основной tank-текст-центр tank-заголовок-margin-l» tabindex=»0″>Запланированная доставка: «> Запланированная доставка: </div><div class=»redesignSnapshotTVC snapshotController_date dest»> Среда, 18.11.2020, 16:30 вечера </ div><div class=»redesignSnapshotTVC snapshotController_est dest» style=»отображение: нет;»>

4. <div class=»redesignSnapshotTVC snapshotController_est_time_label dest»></div></div><div class=»Редизайн snapshottvc snapshotController_est_time dest» style=»отображение: отсутствует;»> <span</span>> <span></span></div></h1>

5. @Zween да, код выполняется до этой строки кода. открывается веб-страница, вводится идентификатор отслеживания, нажимается кнопка и отображается дата ETA от Fedex