Python. Селен. ошибка drag_and_drop 'AttributeError: move_to требует WebElement' - PullRequest
0 голосов
/ 05 января 2020

Скажите пожалуйста, что я делаю не так? Я пытаюсь перетащить Selenium, но каждый раз сталкиваюсь с ошибкой «AttributeError: move_to требует WebElement»

Вот мой код:

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

chromedriver = '/usr/local/bin/chromedriver'

driver = webdriver.Chrome(chromedriver)
driver.get('http://www.dhtmlgoodies.com/scripts/drag-drop-custom/demo-drag-drop-3.html')

source = driver.find_elements_by_xpath('//*[@id="box3"]')
target = driver.find_elements_by_xpath('//*[@id="box103"]')

action = ActionChains(driver)
action.drag_and_drop(source, target).perform()

Я также пытался, как это:

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

chromedriver = '/usr/local/bin/chromedriver'

driver = webdriver.Chrome(chromedriver)
driver.get('http://www.dhtmlgoodies.com/scripts/drag-drop-custom/demo-drag-drop-3.html')

source = driver.find_elements_by_xpath('//*[@id="box3"]')
target = driver.find_elements_by_xpath('//*[@id="box103"]')
ActionChains(driver).click_and_hold(source).move_to_element(target).release(target).perform()

Всегда выходит "AttributeError: move_to требует WebElement"

Traceback (most recent call last):
  File "drag_and_drop_test.py", line 13, in <module>
    ActionChains(driver).click_and_hold(source).move_to_element(target).release(target).perform()
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/selenium/webdriver/common/action_chains.py", line 121, in click_and_hold
    self.move_to_element(on_element)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/selenium/webdriver/common/action_chains.py", line 273, in move_to_element
    self.w3c_actions.pointer_action.move_to(to_element)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/selenium/webdriver/common/actions/pointer_actions.py", line 42, in move_to
    raise AttributeError("move_to requires a WebElement")
AttributeError: move_to requires a WebElement

Ответы [ 3 ]

2 голосов
/ 05 января 2020

как сказал @guy:

find_elements_by_xpath

возвращает список WebElements. Вы можете использовать find_element_by_xpath метод, чтобы получить один веб-элемент. Или выберите указанный элемент c из WebElements и верните find_elements_by_xpath. Например, если вы знаете, вы хотите выбрать 2-й элемент из списка возврата для цели. Затем вы можете попробовать вот так:

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

chromedriver = '/usr/local/bin/chromedriver'

driver = webdriver.Chrome(chromedriver)
driver.get('http://www.dhtmlgoodies.com/scripts/drag-drop-custom/demo-drag-drop-3.html')

source = driver.find_elements_by_xpath('//*[@id="box3"]')[0]
target = driver.find_elements_by_xpath('//*[@id="box103"]')[1]

action = ActionChains(driver)
action.drag_and_drop(source, target).perform()

Я вижу, что мы выбираем элемент с идентификатором, но идентификаторы уникальны, поэтому может быть только один идентификатор. Таким образом, вы также можете сделать это следующим образом:

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

chromedriver = '/usr/local/bin/chromedriver'

driver = webdriver.Chrome(chromedriver)
driver.get('http://www.dhtmlgoodies.com/scripts/drag-drop-custom/demo-drag-drop-3.html')

source = driver.find_element_by_id('box3')
target = driver.find_element_by_id('box103')

action = ActionChains(driver)
action.drag_and_drop(source, target).perform()

Мне нравится использовать find_element_by_id, потому что он выглядит чище для меня, чем xpath.

2 голосов
/ 05 января 2020

find_elements_by_xpath возвращает список WebElement с, drag_and_drop (и другие методы) принимают один WebElement. Используйте find_element_by_xpath

source = driver.find_element_by_xpath('//*[@id="box3"]')
target = driver.find_element_by_xpath('//*[@id="box103"]')
0 голосов
/ 05 января 2020

Это сообщение об ошибке ...

AttributeError: move_to requires a WebElement

... означает, что move_to_element() требует WebElement в качестве аргумента.

Кажется, вы были близки , Вы использовали find_elements_by_xpath(), который возвращает Список , где вам нужно передать WebElement в move_to_element().

Решение

К перетащите элемент с текстом как Вашингтон и поместите в элемент с текстом как Соединенные Штаты через Селен необходимо вызовите WebDriverWait для element_to_be_clickable(), и вы можете использовать следующие стратегии локатора :

  • кодовый блок:

    driver.get('http://www.dhtmlgoodies.com/scripts/drag-drop-custom/demo-drag-drop-3.html')
    source = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='dragableBox' and @id='box3']")))
    target = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='dragableBoxRight' and @id='box103']")))
    ActionChains(driver).click_and_hold(source).move_to_element(target).release(target).perform()
    
  • Примечание : необходимо добавить следующие операции импорта:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
  • Снимок браузера:

drag_and_drop

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...