Ich versuche Selenium zu verwenden, um sich bei ESPN anzumelden. Eine Lösung, die früher funktioniert hat, ist here. Um mich anzumelden, muss ich den Frame finden, der die Felder Benutzername und Passwort enthält und zu diesem Frame wechseln. Leider ist dieser numerische Index dieses Rahmens nicht immer derselbe. Ich entschied mich, sie alle auszuprobieren, aber sobald ich zu einem Frame gewechselt habe, scheiterte ich mit selenium.common.exceptions.StaleElementReferenceException: Message: The element reference of <iframe class="ob-pifr"> stale: either the element is no longer attached to the DOM or the page has been refreshed
. Also suche ich nachWechseln Sie zu dem Frame, der die Anmeldeaufforderungen in Selenium enthält
- Ein Weg Rahmen zu wechseln, ohne die
StaleElementReferenceException
- eine Möglichkeit zu überprüfen, ob ein Rahmen derjenige ist, möchte ich, bevor ich zu schalten
- Einige andere Lösung, obwohl ich etwas beschaulich zu einem magischen bevorzugen d (und vermutlich zerbrechlich) Formel wie „Es ist immer der dritte Rahmen von Ende)
Hier einiger Beispielcode, der auf die StaleElementReferenceException
führt:
from time import sleep
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException
driver = webdriver.Firefox(executable_path = '/usr/local/bin/geckodriver')
driver.get("http://games.espn.go.com/ffl/signin")
WebDriverWait(driver, 1000).until(EC.presence_of_all_elements_located((By.XPATH,"(//iframe)")))
elem = None
frms = driver.find_elements_by_xpath("(//iframe)")
print("Found {} frames", len(frms)) # Varies from 6 to 8
for count, frm in enumerate(frms):
print("Trying frm[{}]".format(count))
driver.switch_to.frame(frm)
sleep(2)
try:
# The command below will fail the second time around with
# `either the element is no longer attached to the DOM or the page has been refreshed`
elem = driver.find_element_by_xpath("(//input)[1]")
except NoSuchElementException:
pass
else:
break