AW: fireEvent() geht meistens nicht mehr
18.05.2020 11:42:25
Zwenn
Hallo Sebastian,
es handelt sich nicht um ein herkömmliches Dropdown Steuerelement, welches Du ansprechen willst. Es handelt sich um ein PopUp, welches über ein div-Tag als Layer realisiert wird. Da geht es natürlich nicht mit select. Da muss man manuell vorgehen.
Mir ist allerdings nicht klar, woher Du vor dem Aufruf der Seite mit einem Parameter wie "München" weißt, den wievielten Menüpunkt Du anklicken musst. Denn das Menü wird dynamisch generiert. Aber vielleicht willst Du ja etwas ganz bestimmtes, was immer gleich ist.
Du kannst im querySelector() einfach den Wert für den Menüpunkt eintragen, den Du anklicken willst. Die Zählung beginnt bei 0 für den ersten anklickbaren Eintrag:
Sub Wetter_Suchen()
Dim url As String
Dim browser As Object
Dim knotenEingabe As Object
Dim knotenPopUp As Object
Dim knotenPopUpClick As Object
Dim logInName As String
Dim ortName As String
ortName = "München"
url = "https://www.wetter.com/"
'Internet Explorer initialisieren, Sichtbarkeit festlegen,
'URL aufrufen und warten bis Seite vollständig geladen wurde
Set browser = CreateObject("internetexplorer.application")
browser.Visible = True
browser.navigate url
Do Until browser.ReadyState = 4: DoEvents: Loop
'Manuelle Pause, damit die Seite komplett zur Verfügung steht
Application.Wait (Now + TimeSerial(0, 0, 5))
'Das input-Tag sondieren
Set knotenEingabe = browser.document.getElementsByClassName _
("[ search-field ][ flag__body ][ js-search-field ]")(0)
'Prüfen ob die NodeList knotenEingabe Elemente enthält
If Not knotenEingabe Is Nothing Then
'Ort eintragen
knotenEingabe.Value = ortName
'Das onKeyDown Event auslösen,
'um das PopUp Menü zu generieren
Call TriggerEvent(browser.document, knotenEingabe, "onKeyDown")
'Manuelle Pause, damit das Menü Zeit hat generiert zu werden
Application.Wait (Now + TimeSerial(0, 0, 1))
Else
MsgBox "Wetter Eingabefeld wurde nicht gefunden"
'Button klicken bringt nix, also Makro kontrolliert beenden
Exit Sub
End If
'Das generierte PopUp-Menü holen
'Die CSS-Klasse gibt es 2x (immer prüfen und ggf.
'nachsehen, welches Element benötigt wird)
Set knotenPopUp = browser.document.getElementsByClassName _
("autocomplete-suggestions layout--group")(0)
'Den gewünschten Menüpunkt über das Attribut data-index selektieren
'(Wobei mir nicht klar ist, woher man den bei einer dynamisch
'generierten Liste vorher weiß)
Set knotenPopUpClick = knotenPopUp.querySelector("div[data-index='1']")
'Das MouseOver Event für den gewählten Menüpunkt auslösen
Call TriggerEvent(browser.document, knotenPopUpClick, "mouseover")
'Den gewählten Menüpunkt anklicken
knotenPopUpClick.Click
End Sub
Sub TriggerEvent(htmlDocument As Object, htmlElementWithEvent As Object, eventType As String)
'Basierend auf einer Prozedur von Anton aus dem Herber Forum
'Für allgemeine Events angepasst nach Vorschlag von QHaar auf StackOverflow
Dim theEvent As Object
htmlElementWithEvent.Focus
Set theEvent = htmlDocument.createEvent("HTMLEvents")
theEvent.initEvent eventType, True, False
htmlElementWithEvent.dispatchEvent theEvent
End Sub
Viele Grüße,
Zwenn