2016-06-01 5 views
1

Я получаю следующее сообщение об ошибке при запуске моего питона/селена скрипт:Вызов ActionChains move_to_element() приводит к ошибке атрибута?

AttributeError: объект «WebElement» не имеет атрибута «move_to_element»

Что это конкретное сообщение об ошибке сказать? Не признает ли move_to_element действительным действием? Я импортировать модуль actionchains как таковой:

from selenium.webdriver.common.action_chains import ActionChains 

Я могу использовать щелчок() и send_keys() действия без проблем.

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

Я пытаюсь назвать это так:

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

Показать полный код. Я понятия не имею, почему вы считаете, что импорт - это единственная информация, которая нам нужна. –

+1

, пожалуйста, поделитесь точным кодом, где вы столкнулись с ошибкой – nullpointer

ответ

2

Вот проблема линия:

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

Здесь wait_for_element_visibility() ждет видимости элемента и возвращает сам элемент, то , вы вызываете move_to_element() на объект WebElement, но вместо этого вам нужно вызвать его на экземпляр ActionChains, передав ранее найденный элемент как аргумент:

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 thanks-- Я пытаюсь обернуть его в метод, чтобы я мог вызвать его в другом объекте страницы для тестового скрипта. Тогда это невозможно с move_to_element()? – Vince

+0

@VinceL уверен, обновлен, чтобы отразить код, который вы опубликовали. Надеюсь, это поможет. – alecxe

+0

Большое спасибо! Теперь это имеет смысл. Я не знал, что вы не можете использовать move_to_element(). – Vince

0

Это где ваш код будет терпеть неудачу:

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

пример кода для использования действия в питона идет здесь:

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

Я думаю, вы пытаетесь для вызова 'move_to_element()' в качестве расширения объекта WebElement, и это невозможно. Даже если вы импортируете ActionChain, WebElement не будет иметь такого расширения.

Вам нужно сделать что-то вроде этого:

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

драйвер - Ваш WebDriver

элемент - элемент (WebElement объект), который вы хотите переместить.

Смежные вопросы