VBA Selenium - Click Download-Button
24.05.2022 10:39:20
flo4711
ich hatte vor einigen Wochen begonnen eine bestehende, auf dem Internet-Explorer basierende WebScraper Anwendung (mit der regelmäßig bestimmte Rohstoffpreise aktualisiert werden), auf Selenium mit Microsoft-Edge umzustellen.
Anforderungen:
1. Webseite aufrufen (https://www.mbi-metalsource.com), Anmeldedaten (Benutzer+Passwort) eintragen und "Login-Button" betätigen.
2. Im Folgenden werden weitere URLs dieser Webseite in neuen Tabs aufgerufen und auf jeder dieser Seiten soll ein "Download-Button", der einen Excel-Export der angeforderten Daten erstellt, betätigt werden.
3. Als letzter Schritt erfolgt dann der Import dieser Daten in eine zentrale Excel-Datei
Initialer Aufruf, mit Login sowie Aufruf der Folgeseiten habe ich alles soweit im Makro umgesetzt. Der Import der Daten aus den Download-Excel ist auch kein Problem ... einzig finde ich keine passende Methode den "Download-Button" anzusprechen.
Makro-Code:
Option Explicit
Public objEdge As Selenium.EdgeDriver
Public Sub MBI_Download()
Dim objIE As Object
Dim oInput As Object
Dim htmlDoc As Object
Dim htmlInput As Object
Dim htmlColl As Object
Dim adresse As String
Dim URL1 As String
Dim URL2 As String
Dim URL3 As String
Dim sID1 As String
Dim sID2 As String
Dim vonDatum As String
Dim bisDatum As String
Dim i As Integer
Dim win As Object
Set objEdge = CreateObject("Selenium.EdgeDriver")
' Initialer Aufruf + Login
With objEdge
.Get "https://www.mbi-metalsource.com/"
.Wait 3000
.FindElementByName("username").SendKeys "max@mustermnann.de"
.FindElementByName("password").SendKeys "12345678."
For Each oInput In .FindElementsByTag("input")
If oInput.Value = "Login" Then oInput.Click
Next
End With
' Datum von/bis für URL (40 Tage zurück bis akt. Datum)
vonDatum = Format(Now() - 40, "dd.mm.yyyy")
bisDatum = Format(Now(), "dd.mm.yyyy")
' Variablen für Zusammenbasteln der Folgeseiten definieren
URL1 = "https://www.mbi-metalsource.com/charting.php?action=show&cmcode1="
URL2 = "&cmcode2=&cmcode3=&cmcode4=&cmside1=left&cmside2=left&cmside3=left&cmside4=left&cmcurrency1=default&cmcurrency2=default&cmcurrency3=default&cmcurrency4=default&cmmetric1=default&cmmetric2=default&cmmetric3=default&cmmetric4=default&"
URL3 = "&datestart=" & vonDatum & "&dateend=" & bisDatum & "&smaDays=10"
' Aufruf der Folgeseiten und Download Excel-Datei
With objEdge
For i = 1 To ThisWorkbook.Worksheets.Count - 7
' 4-stellige ID des Rohstoffs in der URL
sID1 = ThisWorkbook.Worksheets(i).Range("B3")
' Unterscheidung der Fälligkeit (Cash, CONT, ...) in der URL
sID2 = "_" & ThisWorkbook.Worksheets(i).Range("B6")
' komplette URL zusammenbasteln
adresse = URL1 & sID1 & sID2 & URL2 & URL3
'.Get "https://www.mbi-metalsource.com/"
.ExecuteScript "window.open('" & adresse & "')"
Application.Wait (Now + TimeValue("0:00:02"))
For Each oInput In .FindElementsByTag("input")
If oInput.Value = "Download" Then oInput.Click
Next
Next
End With
Ich dachte eigentlich, dass ich über die Methode ".FindElementsByTag("input")" den entsprechenden Button finde und das Click-Ereignis ausführe (analog zum "Login").Leider funktioniert das hier nicht (das Makro findet keinen Input-Tag und die Schleife wird sofort verlassen).
Auch eine andere Methode ".FindElementsBy" ist mir für den obigen HTML-Code nicht ins Auge gestochen.
Vielleicht kann mir hier ja jemand weiterhelfen, auch wenn aufgrund der nicht realen Zugangsdaten der Excel-Download nicht direkt nachvollzogen werden kann.
Falls jemand noch weitere Infos benötigen sollte, einfach nachfragen!
Vielen Dank im Voraus.
Gode