2017-09-23 2 views
1

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 

Antwort

1

Rahmen-ID ist disneyid-iframe, die also zuerst das Login Popup öffnet man in sie

driver.switch_to_frame(driver.find_element_by_id("disneyid-iframe")) 

und führen Sie Tastaturbefehle wie

driver.find_element_by_xpath("//input[@type='email']").send_keys("emailid") 

driver.find_element_by_xpath("//input[@type='password']").send_keys("password") 

Andere Art und Weise wechseln müssen in Rahmen wechseln ExplicitWait wird. Es wartet, bis Rahmen zur Verfügung, wenn es dann in

wait = WebDriverWait(driver, 60) 

wait.until(EC.frame_to_be_available_and_switch_to_it((By.ID, "disneyid-iframe"))) 

Ihren endgültigen Code geschaltet erhalten wird:

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") 

wait = WebDriverWait(driver, 60) 

wait.until(EC.frame_to_be_available_and_switch_to_it((By.ID, "disneyid-iframe"))) 


driver.find_element_by_xpath("//input[@type='email']").send_keys("emailid") 
driver.find_element_by_xpath("//input[@type='password']").send_keys("password") 
driver.find_element_by_xpath("//button[@type='submit']").click() 

Hinweis: Bitte überprüfen Syntax per Python.

Verwandte Themen