Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

[VBA] getelementsbyclassname & click
#1
Hallo zusammen,

ich versuche aus Excel heraus verschiedene Aktionen auf einer Website über den IE auszuführen.
Jetzt scheitert es an folgendem:

Hier der entsprechende HTML Code

Code:
<li class="modal-close ng-star-inserted">
           <a class="ts-alignment pd-test-res-one-hotel-region pd-test-res-pick-region">
             <div class="row">
               <!---->
               <!---->
              <div class="col l12 m12 s12 ts-region-result ng-star-inserted">            
                 <p>
                   <i class="material-icons">language</i>
                   <b><mark>Bayreuth</mark></b>
                 </p>
                 <span>1 Hotel(s)</span>
               </div>
             </div>
           </a>
         </li>

Ich schaffe es nicht über "getelementsbyclassname" auf den Text "Bayreuth" zu klicken.
Versucht habe ich:
Code:
doc.getElementsByClassName("col l12 m12 s12 ts-region-result ng-star-inserted")(0).Click
Hier bekomme ich aber die Fehlermeldung: Laufzeitfehler '91: Objektvariable oder With-Blockvariable nicht festgelegt


Jemand von euch eine Idee?

Hier nochmal der Rest von Code. Das funktioniert soweit:
Code:
Dim IE As Object
Dim doc As HTMLDocument
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True

IE.navigate ".."

Do While IE.Busy Or IE.readyState <> READYSTATE_COMPLETE
DoEvents
Loop

Set doc = IE.document
doc.getElementById("input-field-2").Click
doc.getElementsByClassName("pd-test-res-search-field")(0).Value = "Bayreuth"
Do While IE.Busy Or IE.readyState <> READYSTATE_COMPLETE
DoEvents
Loop
Application.SendKeys "~"
Do While IE.Busy Or IE.readyState <> 4
   Application.Wait DateAdd("s", 1, Now)
Loop

doc.getElementsByClassName("col l12 m12 s12 ts-region-result ng-star-inserted")(0).Click


Hier noch einmal ein Auszug aus dem HTML Code. Hängt es vielleicht damit zusammen, dass es sich um eien "overlay" handelt? Und wenn ja, wie komme ich da ran..?
Code:
<div class="cdk-overlay-container"><div class="cdk-overlay-backdrop cdk-overlay-dark-backdrop cdk-overlay-backdrop-showing"></div><div class="cdk-global-overlay-wrapper" style="justify-content: center; align-items: center;" dir="ltr"><div class="cdk-overlay-pane" id="cdk-overlay-0" style="position: static; max-width: 80vw; pointer-events: auto;"><div tabindex="0" class="cdk-visually-hidden cdk-focus-trap-anchor"></div><mat-dialog-container tabindex="-1" class="mat-dialog-container ng-tns-c66-3 ng-trigger ng-trigger-dialogContainer ng-star-inserted" id="mat-dialog-0" role="dialog" style="transform: none; animation-play-state: running;" aria-modal="true"><!----><ts-smart-search-modal class="ng-star-inserted"><div class="ts-quick-booker" id="smart-search-modal">
 <div class="row">
   <div class="col l12 s12 m12">
     <div class="right ts-close">
       <a><i class="material-icons">close</i></a>
     </div>
   </div>
 </div>

 <div class="row">
   
   <div class="ts-search">
     <div class="ts-search-col1 col l12 m12 s12">
       <div class="ts-input">
         <input name="quickerbooker" class="pd-test-res-search-field" type="text" placeholder="Hotel, Stadt, Region oder Sonstiges">
         <!----><a class="ts-delete-text ng-star-inserted">
           <i class="material-icons tiny">delete</i>
         </a>
       </div>
     </div>
   </div>
   

   
   <!----><div class="ng-star-inserted">
     <!---->

     <!----><ts-smart-search-results class="ng-star-inserted"><div class="pd-test-res-hotel-search-loaded">
 
 <!----><section class="ts-list-wrapper ng-star-inserted">
   
   <!---->

   
   <!---->
   <!---->

   
   <!---->
   <!---->

   <!---->
   <!---->

   <!----><div class="ts-line bottom ts-current-result ng-star-inserted"><div></div></div>
   <!----><div class="col l12 m12 s12 ng-star-inserted">
     <div class="ts-list">
       <h6>
         Regionen
         <span class="ts-map-quick">
         <a class="hide-on-med-and-down">
           <i class="material-icons ts-icon-menu">location_on</i>
           Kartenansicht
         </a>
         <a class="modal-action modal-close btn-floating btn-large red modal-trigger tsapp-btn ts-map-quick hide-on-large-only">
           <i class="material-icons ts-icon-menu">location_on</i>
         </a>
       </span>
       </h6>
       <ul>
         <!----><li class="modal-close ng-star-inserted">
           <a class="ts-alignment pd-test-res-one-hotel-region pd-test-res-pick-region">
             <div class="row">
               <!---->
               <!----><div class="col l12 m12 s12 ts-region-result ng-star-inserted">
                 
                 
                 <p>
                   <i class="material-icons">language</i>
                   <b><mark>Bayreuth</mark></b>
                 </p>
                 <span>1 Hotel(s)</span>
               </div>
             </div>
           </a>
         </li><li class="modal-close ng-star-inserted">
           <a class="ts-alignment pd-test-res-pick-hotel">
             <div class="row">
               <!----><div class="ts-result ng-star-inserted">
                 
                 
                 <p class="col l6 m6 s12 ts-left l12 m12">
                   <i class="material-icons">local_hotel</i>
                   <span>Hotel<mark>Bayreuth</mark>, <mark>Bayreuth</mark></span>
                 </p>
                 <!---->
               </div>
               <!---->
             </div>
           </a>
         </li>
       </ul>
       <!---->
     </div>
   </div>

Grüße
Jules
Antworten Top
#2
Hallo Jules,

wie immer, wenn man versucht etwas über das DOM aus Internetseiten auszulesen, kann nur sinnvoll geholfen werden, wenn die URL angegeben wird. Ich schätze eine Seite, auf der man Hotelreservierungen vornehmen kann, ist jetzt kein Geheimprojekt. Außerdem solltest Du mal beschreiben, was Du erreichen willst. Die Fernbedienung von Formularen, als sitzt man als Mensch vor so einer Seite, ist oft überflüssig. Die meisten Seiten arbeiten mit Get, statt Post und alle notwendigen Parameter können in der URL übergeben werden. Wie es auf der von Dir gewählten Seite ist weiß ich so natürlich nicht, weil Du nicht verraten hast, welche es denn ist.

Viele Grüße,

Zwenn
Antworten Top
#3
Hallo Zwenn,

danke für deine Nachricht.

Leider ist es hier etwas tricky:

Die Website ist https://www.hotelbb.de/de/

Mein Ziel ist es, den aktuellen Preis eines jeweiligen Hotels abzurufen. Besuchst du die Website hast du oben ein Feld "Hotel, Stadt oder Region". Klickst du drauf, kannst du nun eine Stadt eingeben. Beispiel: Bayreuth. Nun erhältst du alle dort verfügbaren Hotels. Soweit komme ich auch. Jetzt erscheint aber unten eine Liste. Ich schaffe es hier nicht auf das Hotel zu klicken um auf die nächste Seite zu gelangen. Nur so übernimmt er den Namen der Stadt in Feld welches wir am Anfang hatten. Um dann dort auf "Suchen" klicken zu können. Auf der folge Seite steht dann dort "Standardrate 54,00 EUR". Hier hätte ich also letzten Endes gerne in meiner Zelle 54,00 EUR stehen Smile

Hoffe es kommt jetzt etwas mehr Licht ins Dunkel?
Antworten Top
#4
Hallo Jules,

die Seite ist völlig JavScript. Ein Wunder, dass man mit Zugriffen über HTML ans Ziel kommt.

Code:
Sub HotellbbAbfragen()

Dim browser As Object
Dim url As String

 url = "https://www.hotelbb.de/de/"
 
 '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
 
 browser.document.getElementById("input-field-2").Click
 browser.document.getElementsByClassName("pd-test-res-search-field")(0).Value = "Bayreuth"
 
 'Die Seite arbeitet massiv mit JavaScript. Da müssen "harte" Pausen eingabaut werden,
 'weil das Warten auf den Fertig-Status oder den Nicht-Mehr-Beschäftigt-Status des
 'Internet Explorers hier nicht mehr greifen.
 '
 'Folgendes Muster erlaubt beliebige Pausen, die je nach Server-Reaktions-Zeit und
 'eigener Internetverbing angepasst werden können.
 '
 'Application.Wait (Now + TimeSerial(pause_stunden, pause_minuten, pause_sekunden))
 Application.Wait (Now + TimeSerial(0, 0, 5))
 Application.SendKeys "{enter}"
 Application.Wait (Now + TimeSerial(0, 0, 5))
 browser.document.getElementsByClassName("col l12 m12 s12 ts-region-result ng-star-inserted")(0).Click
 Application.Wait (Now + TimeSerial(0, 0, 5))
 browser.document.getElementsByClassName("material-icons right hide-on-small-only hide")(0).Click
 Application.Wait (Now + TimeSerial(0, 0, 5))
 
 'Ab hier was Du so machen willst
 'z.B. den ersten Preis auslesen
 MsgBox browser.document.getElementsByClassName("col l6 m6 s4 ts-right")(0).innertext
End Sub

Viele Grüße,

Zwenn
[-] Folgende(r) 1 Nutzer sagt Danke an Zwenn für diesen Beitrag:
  • jules
Antworten Top
#5
Du bist ja der Knaller!
Vielen Dank!!
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste