[FIXED] find_elements findet nicht alle Elemente

Ausgabe

Ich versuche, alle Elemente auf einer Seite mit dem spezifischen Selektor zu finden, aber wie es scheint, werden nicht alle Elemente gefunden.

Code, den ich verwende:

from selenium import webdriver
from selenium.webdriver.common.by import By

PATH = "C:\Program Files (x86)\chromedriver.exe"#path of chrome driver
driver = webdriver.Chrome(PATH)#accesses the chrome driver

web = driver.get("https://www.eduqas.co.uk/qualifications/computer-science-as-a-level/#tab_pastpapers")#website
driver.maximize_window()

driver.implicitly_wait(3)
driver.execute_script("window.scrollTo(0, 540)")
driver.implicitly_wait(3)
elements = driver.find_elements(By.CSS_SELECTOR, ".css-13punl2")
driver.implicitly_wait(3)

for x in elements:
    x.click()


print(len(elements))

Wenn ich die Länge des Arrays “Elemente” drucke, gibt es 1 zurück, wenn es mehrere Elemente auf der Webseite mit dem Selektor “.css-13punl2” gibt. Wie hier zu sehen, Bild des Webseitencodes

Link zur Website: https://www.eduqas.co.uk/qualifications/computer-science-as-a-level/#tab_pastpapers

Aus irgendeinem Grund gibt es beim Untersuchen der Webseite manchmal 6 Elemente mit dem Selektor “.css-13punl2” und manchmal 7, aber ich bin mir nicht sicher.

Lösung

Sie versuchen mit auf das Element zu warten driver.implicitly_wait(3). Diese Methode wird erstellt, um das implizite Warten zu aktivieren. Es kann einmal eingeschaltet werden und muss dann nicht erneut eingeschaltet werden. Wenn es eingeschaltet ist, versucht Selenium 3 (in diesem Fall) Sekunden lang, das gewünschte Element zu finden, anstatt eines Versuchs unmittelbar nach dem Laden der Seite. In Ihrem Fall findet es schnell ein Element und wartet nicht, bis alle Elemente auf der Seite erscheinen.

Sie müssen der Seite etwas Zeit geben, um alle Inhalte zu laden.
Dafür können Sie zum Beispiel eine Schlafmethode verwenden. Die Ausführung des Skripts wird für die von Ihnen festgelegte Anzahl von Sekunden angehalten.


Außerdem verschwinden die Elemente auf dieser Seite aus der Ansicht, sodass Sie jedes Mal scrollen müssen, wenn Sie auf ein Element klicken.
Außerdem müssen Sie diese „Cookie“-Eingabeaufforderung schließen, da sie die Klicks abfängt.


Und ich denke, Sie brauchen die Elemente mit Jahr, also ist es besser, das Klicken auf „GCSE“ zu überspringen, das auch von diesem Selektor gefunden wird.


Der Code sieht also so aus:

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep

PATH = "C:\Program Files (x86)\chromedriver.exe"  # path of chrome driver
driver = webdriver.Chrome(PATH)  # accesses the chrome driver

driver.get("https://www.eduqas.co.uk/qualifications/computer-science-as-a-level/#tab_pastpapers")  # website
driver.maximize_window()

driver.implicitly_wait(3)
driver.execute_script("window.scrollTo(0, 540)")
sleep(3)  # Giving time to fully load the content
elements = driver.find_elements(By.CSS_SELECTOR, ".css-13punl2")
driver.find_element(By.ID, 'accept-cookies').click()  # Closes the cookies prompt


for x in elements:
    if x.text == 'GCSE':
        continue
    x.click()
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")  # this scrolls the page to the bottom
    sleep(1)  # This sleep is necessary to give time to finish scrolling


print(len(elements))


Beantwortet von –
Eugeny Okulik


Antwort geprüft von –
Robin (FixError Admin)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like