2017-01-19 3 views
2

BEARBEITEN: akzeptierte Antwort, da es das Problem selbst löste.Python Selen - ElementNotVisibleException

Ich versuche, Daten aus der folgenden Webseite link , um zu ergreifen, um zu verstehen, wie Selen Werke (eigentlich bin ich nicht daran interessiert, die Daten auf der letzten Zeile erhalte ich eine ElementNotVisibleException Fehler. Mein Code sieht wie folgt aus :

path = mypath 
url = 'http://www.bundesliga.de/de/liga/statistik/spieltag/' 

#### SCRIPT TO TEST SELENIUM 

#### (0) Load driver 
driver = webdriver.PhantomJS(path) 
driver.set_window_size(1120, 550) 
driver.get(url) 

#### (1) Define XPATHs 
XPATH_MATCHDAY = '//*[contains(@class, "has-data")]' 
XPATH_GAMES = "//*[contains(text(), 'mehr zum Spiel')]" 
XPATH_TEAMSTATS = "//span[contains(text(), 'Teamstatistik')]" 

### (2) Click links to Teamstats 

# Select Matchday 1 
matchday = driver.find_elements_by_xpath(XPATH_MATCHDAY)[0] 
matchday.click() 

# Select game one 
game = driver.find_elements_by_xpath(XPATH_GAMES)[0] 
game.click() 

# Select teamstats tab (bottom of page) 
teamstats = driver.find_elements_by_xpath(XPATH_TEAMSTATS)[0] 
time.sleep(.5) 
teamstats.click() 

Was ist der Code tun soll:

  • Klick auf "1" in der oberen Tabelle "Spieltagsübersicht"
  • klicken Sie auf "mehr zum Spiel" für das erste Spiel
  • klicken Sie auf den Reiter "Teamstatistik" auf der zweiten Hälfte der Seite.

Obwohl Tab Teamstatistik sichtbar ist, erhalte ich den Fehler.

Ich habe diesen Fehler auf stackoverflow ziemlich intensiv gelesen und auch die folgende Arbeit für die letzten Zeilen ausprobiert. Allerdings bekomme ich dann eine TimeoutException.

teamstats = WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.XPATH,"XPATH_TEAMSTATS"))) 
teamstats.click() 

Ich habe dies mit PhantomJS und Chrome versucht, aber war nicht in der Lage, dies zu beheben. Ich bin etwas verwirrt, weil der Reiter "Teamstatistik", auf den ich klicken möchte, für mich immer sichtbar ist. Ich habe versucht, wenn „teamstats.is_visible vorhanden ist, aber es ist nicht .. (EDIT: Jetzt habe ich versucht .is_displayed und ich bekomme ein FALSCH) Aber wie bekomme ich es angezeigt ist dies überhaupt möglich)

.?

zu diesem Zweck würde ich dankbar für jeden Hinweis auf

  • sein, wie die ElementNotVisibleException Fehler vermeiden/wie Sie den Code
  • zu verbessern, wenn Selen ist für diese Art von Website beste Wahl, um die Alternativen unter Berücksichtigung ist BeautifulSoup

Vielen Dank für Ihre Unterstützung! Das ist eigentlich mein erster Beitrag. Also bitte sanft sein ;-)

+0

Danke für die schnelle Antwort. Ich habe diesen Beitrag gesehen, aber mein Verständnis ist, dass Workaround in Javascrip ist. Also verstehe nicht, wie das in Python funktionieren würde (wenn überhaupt ...). – FredMaster

+0

Übrigens ist es Java, aber die häufigsten Gründe für 'ElementNotVisibleException' sind dort aufgeführt, überprüfen Sie sie und sehen Sie, welche Ihnen gehört. – Arman

+0

Ich habe versucht, is_displayed und ich bekomme "FALSE" als Antwort. Also danke dafür. Ich weiß aber immer noch nicht, wie ich es beheben kann. – FredMaster

Antwort

0

Als Zielelement in unsichtbaren Teil der Seite befindet, müssen Sie möglicherweise nach unten scrollen, um es sichtbar zu machen:

teamstats = driver.find_elements_by_xpath(XPATH_TEAMSTATS)[0] 
time.sleep(.5) 
driver.execute_script('arguments[0].scrollIntoView()', teamstats) 
teamstats.click() 

Sie können auch diese einfache Art und Weise versuchen, Seite nach unten scrollen :

teamstats = driver.find_elements_by_xpath(XPATH_TEAMSTATS)[0] 
time.sleep(.5) 
teamstats.location_once_scrolled_into_view 
teamstats.click() 
+0

Danke für Ihre Hilfe. Ich habe es versucht.Und erhalten Sie eine andere Fehlermeldung: 'WebDriverException: Nachricht: {"errorMessage": "Weigerte sich, eine Zeichenfolge als JavaScript zu bewerten, weil" unsafe-eval "keine zulässige Quelle für Skript in der folgenden Content Security Policy Direktive ist: .. . ' – FredMaster

+0

Ok. Überprüfen Sie die aktualisierte Antwort – Andersson

+0

Hallo Andersson, danke für Ihre Antwort. Ihre zweite Lösung hat zuerst nicht funktioniert. Dann habe ich Chrome verwendet und gesehen, dass diese Seite ein Cookie-Banner öffnet, das die Teamstats-Schaltfläche abdeckt wenn ich das Banner entferne.Auf Phantom funktioniert es immer noch nicht.Ich habe bei jedem Schritt ein paar Screenshots (driver.save_screenshot) gemacht und festgestellt, dass der Link zum Spieltag nicht einmal befolgt wird.Eine Idee, wie ich Cookie-Banner umgehen kann und warum funktioniert nicht mit Phantom? Danke! – FredMaster