2016-04-20 3 views
0

Ich versuche, move_to_element im selben Test auf 2 verschiedenen Seiten (ohne zu reißen) und ich bekomme eine StaleElementException geworfen. Der Test ist im Grunde eine E-Commerce-Website, ich muss den Mauszeiger über ein Produkt halten, um die Möglichkeit zu haben, es in den Warenkorb zu legen. Auf der Homepage muss ich mit der Maus über das Menü gehen, um zur Produktkategorie zu gelangen.Warum kann ich nur eine mouseover Aktion auf einer einzelnen Seite pro Test

Ich füge unten eine Funktion an (die ich verwende). Es behandelt eine Situation, in der es ein Popup gibt und beendet es dann und versucht es erneut.

@staticmethod 
def hover_over(some_element): 
    try: 
     action.move_to_element(wait.until(EC.visibility_of_element_located((some_element)))).perform() 
    except WebDriverException: 
     try: 
      pop = browser.find_element(*popup_exit_class) 
      pop.click() 
      wait.until(EC.visibility_of_element_located((some_element))) 
      action.move_to_element(wait.until(EC.visibility_of_element_located((some_element)))).perform() 

Ich habe auch ohne die Funktion versucht:

x = browser.find_element(*some_element) 
    action.move_to_element(x).perform() 
    sleep(0.5) 
    browser.find_element(*some_other_element).click() 

Wenn es jede Hilfe, die ich Chromedriver bin mit (Es tritt auch auf Firefox) auf Ubuntu 14.04

Antwort

0

Ein Stegelement angebracht ist, zu einer Seite. Wenn die Seite neu geladen wird, wird Ihr Element gelöscht und ein neues erstellt. Aus diesem Grund erhalten Sie die Ausnahme StaleElementException. Darüber hinaus müssen Sie die ActionChains für jeden Anruf instanziieren:

some_element = (By.ID, "...") 

element = wait.until(EC.visibility_of_element_located(some_element)) 
ActionChains(driver).move_to_element(element).perform() 

browser.find_element(*popup_exit_class).click() 

element = wait.until(EC.visibility_of_element_located(some_element)) 
ActionChains(driver).move_to_element(element).perform() 
+0

Vielen Dank für Ihre Antwort. Ich benutze einen Locator. Vergessen zu erwähnen, ich habe eine locators.py-Datei, in der jedes Element, das ich an eine Funktion übergebe, in Form von (By.method, "selector_or_whatever") existiert. Zum Beispiel: func.hover_over (header.mini_cart) wo header.mini_cart ist mini_cart = (By.ID, "cartHeader") –

+0

Ich habe es zuerst nicht bemerkt, aber Sie müssen auch die 'ActionChains' für jede 'perform instanziieren '. –

Verwandte Themen