Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA Selenium - Click Download-Button

Forumthread: VBA Selenium - Click Download-Button

VBA Selenium - Click Download-Button
24.05.2022 10:39:20
flo4711
Hallo,
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.
Userbild
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
Anzeige

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Selenium - Click Download-Button
24.05.2022 15:18:01
volti
Hallo Gode,
ich kenne Selenium (noch) nicht, aber hast Du es mal in dieser Form versucht?

.FindElementsByTag("input")(0).click
Ggf. Elementnummer bei 0 beginnend manuell auszählen....
Gruß
Karl-Heinz
AW: VBA Selenium - Click Download-Button
24.05.2022 15:42:36
flo4711
Hallo Karl-Heinz,
erstmal vielen Dank für deinen Vorschlag ... dieser führt jedoch zu einem Laufzeitfehler:
Der Index war außerhalb des Arraybereichs ... unabhängig mit welchem Index ausgeführt.
Gruß
Gode
Anzeige
AW: VBA Selenium - Click Download-Button
24.05.2022 15:54:11
volti
Ok, dann wird das "Ding" scheinbar wirklich nicht gefunden...
Vielleicht weiß noch jemand anderes eine Lösung.
Gruß
KH
AW: VBA Selenium - Click Download-Button
25.05.2022 11:30:56
flo4711
Hallo,
ich habe das Problem jetzt lösen können.
Mein Fehler war, dass ja immer der erste Tab im Browser aktiv war ... der Download-Button also auch immer auf dieser Seite (Seite nach Login) gesucht und daher nie gefunden wurde (der korrekte Tab wird jetzt mit "objEdge.SwitchToNextWindow" aktiviert)
Mein Makro sieht jetzt so aus:

Public Sub MBI_Download()
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
Set objEdge = CreateObject("Selenium.EdgeDriver")
' Initialer Aufruf + Login
With objEdge
.Get "https://www.mbi-metalsource.com/"
.Wait 2000
.FindElementByName("username").SendKeys "t.untch@lti-metalltechnik.de"
.FindElementByName("password").SendKeys "mbi#t."
.FindElementByCss("[value=Login]").Click
' 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 URL 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"
' Für jeden relevanten Rohstoff wird im Edge ein TAB geöffnet
For i = 1 To ThisWorkbook.Worksheets.Count - 1
' 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 und in neuem Tab im Browser öffnen
adresse = URL1 & sID1 & sID2 & URL2 & URL3
.ExecuteScript "window.open('" & adresse & "')"
.Wait 2000
' nächster Tab im Browser und Download Button anklicken
.SwitchToNextWindow
.FindElementByCss("[value=Download]").Click
Next
End Sub 
Was ich nicht ohne Laufzeitfehler hinbekommen habe:
Mein erster Ansatz war, nachdem ich das Problem erkannt hatte, zuerst alle Tabs zu öffnen und dann in einer For Each-Schleife über alle Tabs den Download-Button zu clicken.
So z.B.:

Dim oWindow As Selenium.Window
For Each oWindow In .Windows
If .FindElementByCss("[value=Download]").Count = 0 Then
MsgBox "Nicht gefunden!"
Else
.FindElementByCss("[value=Download]").Click
.Wait 2000
End If
Next
Das Problem jedoch war abzufragen, ob überhaupt ein entsprechendes Element ".FindElementByCss("[value=Download]")" auf der Seite gefunden wird (da dieses im ersten Tab nach Login nicht gefunden wird).
Sämtliche Versuche, diesen Fehler abzufragen haben nicht funktioniert:
1. If .FindElementByCss("[value=Download]").Count = 0 Then ...
2. If IsError ...
Es spielt jetzt zwar für den oben gewählten Ansatz keine Rolle ... es würde mich aber dennoch interessieren wie man diesen Laufzeitfehler abfangen könnte.
Vll. hat hier ja noch jemand eine Idee!
Gruß Gode
Anzeige
;
Anzeige

Infobox / Tutorial

VBA Selenium: Download-Button klicken mit Microsoft Edge


Schritt-für-Schritt-Anleitung

  1. Selenium für VBA einrichten: Stelle sicher, dass Du die Selenium-Bibliothek für Excel VBA installiert hast. Dies kannst Du über die "SeleniumBasic"-Installation tun, die die Selenium VBA-Funktionalität bereitstellt.

  2. Edge WebDriver konfigurieren: Lade den Microsoft Edge WebDriver herunter und stelle sicher, dass er mit der Version von Microsoft Edge übereinstimmt, die Du verwendest. Der WebDriver sollte im Systempfad verfügbar sein.

  3. VBA-Makro erstellen: Erstelle ein neues Excel-Makro und füge den folgenden Code ein, um den Download-Button zu klicken:

    Option Explicit
    Public objEdge As Selenium.EdgeDriver
    
    Public Sub MBI_Download()
       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
    
       Set objEdge = CreateObject("Selenium.EdgeDriver")
    
       ' Initialer Aufruf + Login
       With objEdge
           .Get "https://www.mbi-metalsource.com/"
           .Wait 2000
           .FindElementByName("username").SendKeys "dein_benutzername"
           .FindElementByName("password").SendKeys "dein_passwort"
           .FindElementByCss("[value=Login]").Click
    
           ' Datum von/bis für URL
           vonDatum = Format(Now() - 40, "dd.mm.yyyy")
           bisDatum = Format(Now(), "dd.mm.yyyy")
    
           ' URL zusammenstellen
           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"
    
           ' Folgeseiten aufrufen und Download-Button klicken
           For i = 1 To ThisWorkbook.Worksheets.Count - 1
               sID1 = ThisWorkbook.Worksheets(i).Range("B3")
               sID2 = "_" & ThisWorkbook.Worksheets(i).Range("B6")
               adresse = URL1 & sID1 & sID2 & URL2 & URL3
               .ExecuteScript "window.open('" & adresse & "')"
               .Wait 2000
               .SwitchToNextWindow
               .FindElementByCss("[value=Download]").Click
           Next
       End With
    End Sub
  4. Makro ausführen: Führe das Makro aus, um den Download-Button auf der gewünschten Webseite zu klicken.


Häufige Fehler und Lösungen

  • Der Index war außerhalb des Arraybereichs: Dieser Fehler tritt auf, wenn Du versuchst, auf ein Element zuzugreifen, das nicht existiert. Stelle sicher, dass Du die richtige Anzahl an Tabs in Deinem Browser geöffnet hast und dass Du die richtigen Indizes verwendest.

  • Download-Button nicht gefunden: Stelle sicher, dass Du im richtigen Tab bist. Verwende die Methode .SwitchToNextWindow, um sicherzustellen, dass Du den aktiven Tab wechselst, bevor Du versuchst, den Download-Button zu klicken.


Alternative Methoden

Falls Du Schwierigkeiten mit Selenium hast, kannst Du auch Internet Explorer oder Chrome verwenden. Ändere einfach den EdgeDriver zu ChromeDriver oder IEDriverServer. Die grundlegenden Methoden bleiben gleich, jedoch benötigst Du die entsprechenden Treiber.


Praktische Beispiele

Hier ist ein Beispiel, wie Du den Download-Button über die CSS-Selektoren ansprechen kannst:

.FindElementByCss("[value=Download]").Click

Wenn der Button nicht gefunden wird, überprüfe den HTML-Code der Seite und passe den Selektor entsprechend an.


Tipps für Profis

  • Verwende Wartezeiten: Um sicherzustellen, dass die Seite vollständig geladen ist, bevor Du auf Elemente zugreifst, benutze .Wait oder Application.Wait.

  • Fehlerbehandlung einfügen: Füge Fehlerbehandlungsroutinen ein, um Laufzeitfehler abzufangen, z.B.:

On Error Resume Next
  • Debuggen: Verwende Debug.Print oder MsgBox, um Variableninhalte während der Ausführung anzuzeigen.

FAQ: Häufige Fragen

1. Wie kann ich den Download-Button bei einem anderen Element finden? Verwende den entsprechenden CSS-Selektor oder die Methode FindElementsByTag, um andere HTML-Elemente zu identifizieren.

2. Was ist, wenn der Download-Button in einem Frame ist? Du musst zuerst in das Frame wechseln. Verwende dafür die Methode .SwitchToFrame.

3. Ist Selenium in allen Excel-Versionen verfügbar? Ja, Selenium funktioniert mit der VBA-Umgebung, die in Excel 2010 und neueren Versionen verfügbar ist.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige