2016-06-01 7 views
1

Ich erhalte die folgende Fehlermeldung, wenn meine Python/Selen-Skript ausgeführt wird:Aufruf von ActionChains move_to_element() führt zu Attributfehler?

Attribute: ‚WebElement‘ Objekt kein Attribut ‚move_to_element‘ hat

Was macht diese besondere Fehlermeldung sagen? Erkennt es move_to_element nicht als gültige Aktion? Ich importiere das Actionchains-Modul als solches:

from selenium.webdriver.common.action_chains import ActionChains 

Ich bin in der Lage, die Aktionen click() und send_keys() ohne Probleme zu verwenden.

def wait_for_element_visibility(self, waitTime, locatorMode, Locator): 
    element = None 
    if locatorMode == LocatorMode.ID: 
      element = WebDriverWait(self.driver, waitTime).\ 
        until(EC.visibility_of_element_located((By.ID, Locator))) 
    elif locatorMode == LocatorMode.NAME: 
      element = WebDriverWait(self.driver, waitTime).\ 
        until(EC.visibility_of_element_located((By.NAME, Locator))) 
    elif locatorMode == LocatorMode.XPATH: 
      element = WebDriverWait(self.driver, waitTime).\ 
        until(EC.visibility_of_element_located((By.XPATH, Locator))) 
    elif locatorMode == LocatorMode.CSS_SELECTOR: 
      element = WebDriverWait(self.driver, waitTime).\ 
        until(EC.visibility_of_element_located((By.CSS_SELECTOR, Locator))) 
    else: 
     raise Exception("Unsupported locator strategy.") 
    return element 

def find_element(self, locatorMode, Locator): 
    element = None 
    if locatorMode == LocatorMode.ID: 
     element = self.driver.find_element_by_id(Locator) 
    elif locatorMode == LocatorMode.NAME: 
     element = self.driver.find_element_by_name(Locator) 
    elif locatorMode == LocatorMode.XPATH: 
     element = self.driver.find_element_by_xpath(Locator) 
    elif locatorMode == LocatorMode.CSS_SELECTOR: 
     element = self.driver.find_element_by_css_selector(Locator) 
    else: 
     raise Exception("Unsupported locator strategy.") 
    return element 

def fill_out_field(self, locatorMode, Locator, text): 
    self.find_element(locatorMode, Locator).clear() 
    self.find_element(locatorMode, Locator).send_keys(text) 

def click(self, waitTime, locatorMode, Locator): 
    self.wait_until_element_clickable(waitTime, locatorMode, Locator).click() 

def hover_over(self, waitTime, locatorMode, Locator): 
    element = Locator 
    self.wait_for_element_visibility(waitTime, locatorMode, Locator).move_to_element(element).perform() 

Ich versuche, es so zu nennen:

self.hover_over(10, 
         "id", 
         WelcomePageMap['ShareButtonId'] 
     ) 
+1

Zeigen Sie den vollständigen Code. Ich habe keine Ahnung, warum Sie denken, dass ein Import die einzige Information ist, die wir brauchen. –

+1

Bitte teilen Sie den genauen Code, wo Sie mit dem Fehler konfrontiert sind – nullpointer

Antwort

2

Hier ist das Problem Linie:

self.wait_for_element_visibility(waitTime, locatorMode, Locator).move_to_element(element).perform()

Hier wait_for_element_visibility() wartet auf die Sichtbarkeit des Elements und gibt das Element selbst, dann , Sie rufen move_to_element() auf einem WebElement Objekt auf, aber stattdessen müssen Sie es auf einer ActionChains Instanz aufrufen, indem Sie das zuvor gefundene Element als übergeben ein Argument:

from selenium.webdriver.common.action_chains import ActionChains 

element = self.wait_for_element_visibility(waitTime, locatorMode, Locator) 

actions = ActionChains(self.driver) 
actions.move_to_element(element) 
actions.perform() 
+0

OK danke-- Ich versuche, es in eine Methode zu wickeln, damit ich es in einem anderen Seitenobjekt für ein Testskript aufrufen konnte. Dies wäre mit move_to_element() dann nicht möglich? – Vince

+0

@VinceL Sicher, aktualisiert, um den von Ihnen geposteten Code wiederzugeben. Ich hoffe, das hilft. – alecxe

+0

Vielen Dank! Das macht jetzt Sinn. Mir war nicht bewusst, dass du move_to_element() nicht so verwenden kannst. – Vince

0

Dies ist, wo Ihr Code fehlschlagen würde:

self.wait_for_element_visibility(waitTime, locatorMode, Locator).move_to_element(element).perform() 

Ein Beispielcode Aktionen in Python hier geht zu verwenden:

element = self.driver.find_element_by_id(<id>) //use any of your locator strategy 
action = ActionChains(self.driver) 
action.move_to_element(element).perform() 
0

Ich glaube, Sie versuchen, 'move_to_element()' als WebElement-Objekt-Erweiterung aufrufen, und es ist nicht möglich. Auch wenn Sie den ActionChain importieren, wird ein WebElement nicht diese Art von Erweiterung haben.

Sie brauchen etwas, wie es zu tun:

ActionChains(driver).move_to_element(element).perform() 

Treiber - Ihre WebDriver

Element - Das Element (WebElement Objekt), die Sie verschieben möchten.

Verwandte Themen