Live-Forum - Die aktuellen Beiträge
Datum
Titel
17.04.2024 18:57:33
17.04.2024 16:56:58
Anzeige
Archiv - Navigation
1884to1888
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

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

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
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
Anzeige
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

103 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige