2017-09-24 2 views
0

J'ai écrit le script du pilote chrome sélénium pour un site Web ASP.net et j'ai reçu l'erreur stale element reference: element is not attached to the page document lors de son exécution.référence d'élément obsolète: l'élément n'est pas attaché au document page pour la liste déroulante - python

script suppose de cliquer sur un élément par un dans la liste déroulante. Il y a une liste déroulante 4 totale et fonctionne comme ceci quand la page est chargée la première liste déroulante a des options quand nous cliquons sur la deuxième option du premier menu déroulant après une page temporelle charge des données dans la deuxième liste déroulante et la même procédure pour d'autres par ce que je peux le code ci-dessous en mesure de sélectionner deuxième, troisième, Forth .... option première goutte vers le bas puis obtenu l'erreur lors de la sélection deuxième option de deuxième liste déroulante

est le code ici

# -*- coding: utf-8 -*- 

import sys 
from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.common.keys import Keys 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.webdriver.common.action_chains import ActionChains 

def selectYear(): 
    year = driver.find_element_by_id("carYear") 
    ActionChains(driver).move_to_element(year).click(year) 
    year.click() 
    WebDriverWait(year, 100).until(
     EC.presence_of_element_located((By.XPATH, ".//option[2]"))) 
    yearOptions = year.find_elements_by_tag_name("option") 
    for option in yearOptions: 
     optVal = option.get_attribute("value") 
     if optVal is 0: 
      continue 
     else: 
      print("Car Year is : %s" % optVal) 
      dataList['Year'] = optVal 
      ActionChains(driver).move_to_element(option).click(option) 
      option.click() 
      selectModel() 

def selectMake(driver): 
    make = driver.find_element_by_id("carMakeId") 
    ActionChains(driver).move_to_element(make).click(make) 
    make.click() 
    WebDriverWait(make, 100).until(
     EC.presence_of_element_located((By.XPATH, ".//option[2]"))) 
    makeOptions = make.find_elements_by_tag_name("option") 
    print makeOptions 
    for option in makeOptions: 
     optVal = option.get_attribute("value") 
     if optVal == '0': 
      continue 
     else: 
      print("Make is : %s" % optVal) 
      dataList['Make'] = optVal 
      ActionChains(driver).move_to_element(option).click(option) 
      option.click() 
      selectYear() 


def main(): 
    driver.get("https://www.getunitronic.com/") 
    WebDriverWait(driver, 200).until(
     EC.presence_of_element_located((By.ID, "carMakeId"))) 
    selectMake(driver) 
# driver.close() 

if __name__ == "__main__": 
    dataList = {'Make' : "Make", 
       'Year' : "Year", 
       'Model' : "Model", 
       'Engine' : "Engine", 
       'Category' : "Category", 
       'Product Type' : "Product Type", 
       'Title' : "Title", 
       'Stock Power' : "Stock Power", 
       'Octane' : "Octane", 
       'HP' : "HP", 
       'LB-FT' : "LB-FT", 
       'Desctiption' : "Description", 
       'Installation' : "Installation", 
       'UniCONNECT+' : "UniCONNECT+", 
       'Features' : "Features", 
       'Price' : "Price", 
       'Media1' : "Media1", 
       'Hardware Included' : "Hardware Included", 
       'Recommended Software' : "Recommended Software", 
       'Related Hardware' : "Related Hardware"} 
    driver = webdriver.Chrome() 
    sys.exit(main()) 

Erreur:

Make is : 8 
Traceback (most recent call last): 
    File ".\unitronic.py", line 121, in <module> 
    sys.exit(main()) 
    File ".\unitronic.py", line 96, in main 
    selectMake(driver) 
    File ".\unitronic.py", line 85, in selectMake 
    selectYear() 
    File ".\unitronic.py", line 52, in selectYear 
    EC.presence_of_element_located((By.XPATH, ".//option[2]"))) 
    File "C:\Python27\lib\site-packages\selenium\webdriver\support\wait.py", line 71, in until 
    value = method(self._driver) 
    File "C:\Python27\lib\site-packages\selenium\webdriver\support\expected_conditions.py", line 63, in __call__ 
    return _find_element(driver, self.locator)  
    File "C:\Python27\lib\site-packages\selenium\webdriver\support\expected_conditions.py", line 402, in _find_element 
    raise e 
selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document 
    (Session info: chrome=61.0.3163.100) 
    (Driver info: chromedriver=2.29.461591   (62ebf098771772160f391d75e589dc567915b233),platform=Windows NT 10.0.14393 x86_64) 

Répondre

0

Modifier votre c ode de

makeOptions = make.find_elements_by_tag_name("option") 
print makeOptions 
for option in makeOptions: 
    optVal = option.get_attribute("value") 
    if optVal == '0': 
     continue 
    else: 
     print("Make is : %s" % optVal) 
     dataList['Make'] = optVal 
     ActionChains(driver).move_to_element(option).click(option) 
     option.click() 
     selectYear() 

à

options_count = len(make.find_elements_by_tag_name("option")) 

print makeOptions 
for i in range(0, options_count): 
    option = make.find_elements_by_tag_name("option")[i] 
    optVal = option.get_attribute("value") 
    if optVal == '0': 
     continue 
    else: 
     print("Make is : %s" % optVal) 
     dataList['Make'] = optVal 
     ActionChains(driver).move_to_element(option).click(option) 
     option.click() 
     selectYear() 

Les éléments de collection d'éléments deviendra obsolète une fois qu'ils sont modifiés. Vous devez donc retrouver les éléments lorsque vous êtes confrontés à de tels problèmes.