Klick auf Element mit classname selenium

Ich versuche, die Öffnungszeiten von Bars von einer Website zu kratzen. Es gibt eine Liste von Bars, die dann, wenn Sie zu Ihnen navigieren die Öffnungszeiten zur Verfügung stehen. Ich habe ein Problem, das auf ein Element klickt, wenn es einen Klassennamen hat.

Ich habe den Code geschrieben, um die Stunden von einem Ort zu bekommen, aber ich bin nicht in der Lage, zu jedem Veranstaltungsort aus dem ersten Link zu navigieren.

Dieser Code funktioniert, wenn ich die Stunden für einen Veranstaltungsort bekomme

from selenium import webdriver driver = webdriver.Firefox() driver.get('https://www.designmynight.com/london/bars/soho/six-storeys') hours = driver.find_element_by_xpath('//li[@id="hours"]') hours.click() hoursTable = driver.find_elements_by_css_selector("table.opening-times tr") for row in hoursTable: print(row.text) 

Das Problem ist, wenn ich versuche, auf diese Seite zu navigieren, kann ich nicht in jeden Link klicken. Kann jemand sehen was ich falsch mache?

 from selenium import webdriver driver = webdriver.Firefox() driver.get('https://www.designmynight.com/london/search-results#!?type_of_venue=512b2019d5d190d2978c9ea9&type_of_venue=512b2019d5d190d2978c9ea8&type_of_venue=512b2019d5d190d2978c9ead&type_of_venue=512b2019d5d190d2978c9eaa&type_of_venue=512b2019d5d190d2978c9eab&type=&q=&radius=') venue = driver.find_element_by_xpath('//a[@class="ng-binding"]') venue.click() //this should then lead me to the following link -> driver.get('https://www.designmynight.com/london/bars/soho/six-storeys') hours = driver.find_element_by_xpath('//li[@id="hours"]') hours.click() hoursTable = driver.find_elements_by_css_selector("table.opening-times tr") for row in hoursTable: print(row.text) 

  • TimeOutException bei Verwendung link_text mit explizitem Warten im Selen-Webdriver mit Python
  • Mit Selen können Sie einen Anker mit bestimmten Inhalten auswählen
  • Rotierende Proxies in Selen
  • Selen unerwartet mit Fragen
  • Mit Selen's Python API - Wie bekomme ich die Anzahl der Zeilen in einer Tabelle?
  • Selen und Python können nicht auf href = "javascript: void (0);" mit .click ()
  • Radio-Taste wird nicht in Selen / Python geklickt
  • Brauchen Sie, um einen Tisch, der durch ajax mit Python (Selen) geladen wird,
  • 2 Solutions collect form web for “Klick auf Element mit classname selenium”

    Alle Links mit ng-binding Klassennamen werden dynamisch generiert, also musst du warten, bis der Link in DOM erscheint und es auch anklickbar ist:

     from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.ui import WebDriverWait as wait from selenium.webdriver.common.by import By from selenium import webdriver driver = webdriver.Firefox() driver.get('https://www.designmynight.com/london/search-results#!?type_of_venue=512b2019d5d190d2978c9ea9&type_of_venue=512b2019d5d190d2978c9ea8&type_of_venue=512b2019d5d190d2978c9ead&type_of_venue=512b2019d5d190d2978c9eaa&type_of_venue=512b2019d5d190d2978c9eab&type=&q=&radius=') venue = wait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//a[@class="ng-binding"]'))) venue.click() 

    Aber wenn du jedem Link folgen willst, würde ich dir vorschlagen, dass du nicht auf diese Links klickst, sondern die Liste der Referenzen bekommst und dann jeden wie folgt öffnen kannst:

     xpath = '//a[@class="ng-binding"]' wait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, xpath))) links = [venue.get_attribute('href') for venue in driver.find_elements_by_xpath(xpath)] for link in links: driver.get(link) hours = driver.find_element_by_xpath('//li[@id="hours"]') hours.click() hoursTable = driver.find_elements_by_css_selector("table.opening-times tr") for row in hoursTable: print(row.text) 

    Ich habe das Problem, dass der Fahrer versucht, das Element zu finden, bevor es im DOM verfügbar ist. Versuche es zu warten, bis das Element vorhanden ist, anstatt es direkt zu finden. Sie könnten diese Zeile ersetzen:

     venue = driver.find_element_by_xpath('//a[@class="ng-binding"]') 

    mit:

     venue = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//a[@class="ng-binding"]'))) 

    Beachten Sie, dass Sie ein paar Importe machen müssen, um dies zu tun:

     from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC 

    Quelle: http://selenium-python.readthedocs.io/waits.html

    Python ist die beste Programmiersprache der Welt.