English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Как управлять мышиными и клавишными действиями с помощью Python selenium (ActionChains)

При автоматизации с помощью selenium иногда возникает необходимость имитировать операции мыши, чтобы выполнить определенное действие, например, щелчок, двойной щелчок, правый щелчок мыши, перетаскивание и т.д. Selenium предоставляет класс для обработки таких событий - ActionChains

selenium.webdriver.common.action_chains.ActionChains(driver)

Этот класс в основном удовлетворяет всем нашим потребностям в манипуляциях мыши.

1. Основные методы ActionChains

Сначала нужно понять принцип выполнения ActionChains, когда вы вызывайте методы ActionChains, они не выполняются немедленно, а все операции сохраняются по порядку в очереди, и когда вы вызывайте метод perform(), элементы очереди выполняются по порядку.

В этой ситуации у нас есть два способа вызова: 

• Цепной стиль записи

menu = driver.find_element_by_css_selector(".nav")
hidden_submenu = driver.find_element_by_css_selector(".nav #submenu1")
ActionChains(driver).move_to_element(menu).click(hidden_submenu).perform()

 • шаг за шагом

menu = driver.find_element_by_css_selector(".nav")
hidden_submenu = driver.find_element_by_css_selector(".nav #submenu1")
actions = ActionChains(driver)
actions.move_to_element(menu)
actions.click(hidden_submenu)
actions.perform()

 Оба способа по сути одинаковы, ActionChains будут выполнять все действия в порядке выполнения.

2. Список методов ActionChains

click(on_element=None) ——单击 левой кнопкой мыши

click_and_hold(on_element=None) —— нажать левую кнопку мыши и не отпускать

context_click(on_element=None) —— клик правой кнопкой мыши

double_click(on_element=None) —— двойной клик левой кнопкой мыши

drag_and_drop(source, target) —— перетащить к элементу и отпустить

drag_and_drop_by_offset(source, xoffset, yoffset) —— перетащить к определенной координате и отпустить

key_down(value, element=None) —— нажать определенную клавишу на клавиатуре

key_up(value, element=None) —— отпустить определенную клавишу

move_by_offset(xoffset, yoffset) —— переместить указатель мыши от текущей позиции к определенным координатам

move_to_element(to_element) —— переместить указатель мыши к элементу

move_to_element_with_offset(to_element, xoffset, yoffset) —— переместиться к позиции, удаленной на определенное количество пикселей от верхнего левого угла элемента

perform() —— выполнение всех действий в цепочке

release(on_element=None) —— отпустить левую кнопку мыши на определенном элементе

send_keys(*keys_to_send) —— отправка ключа к текущему фокусному элементу

send_keys_to_element(element, *keys_to_send) —— Send a key to the specified element

Next, we will use examples to explain and demonstrate the usage of each method in detail:

3. Code example

1. Click operation

Example URL http://sahitest.com/demo/clicks.htm

代码:

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from time import sleep
driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.maximize_window()
driver.get('http://sahitest.com/demo/clicks.htm')
click_btn = driver.find_element_by_xpath('//input[@value="click me"]') # Click button
doubleclick_btn = driver.find_element_by_xpath('//input[@value="dbl click me"]') # Double-click button
rightclick_btn = driver.find_element_by_xpath('//input[@value="right click me"]') # Right-click button
ActionChains(driver).click(click_btn).double_click(doubleclick_btn).context_click(rightclick_btn).perform() # Chaining usage
print driver.find_element_by_name('t2').get_attribute('value')
sleep(2)
driver.quit()

Результат:

[CLICK][DOUBLE_CLICK][RIGHT_CLICK]

2. Move the mouse

Example URL http://sahitest.com/demo/mouseover.htm

Example code:

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from time import sleep
driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.maximize_window()
driver.get('http://sahitest.com/demo/mouseover.htm')
write = driver.find_element_by_xpath('//input[@value="Write on hover"]') # When the mouse moves over this element, "Mouse moved" will be displayed in the input box below
blank = driver.find_element_by_xpath('//input[@value="Blank on hover"]') # When the mouse moves over this element, the content of the input box below will be cleared
result = driver.find_element_by_name('t1')
action = ActionChains(driver)
action.move_to_element(write).perform() # Перемещение к write, отображение "Mouse moved"
print result.get_attribute('value')
# action.move_to_element(blank).perform()
action.move_by_offset(10, 50).perform() # Перемещение на точку (10, 50) относительно текущей позиции, эффект равен предыдущему предложению, перемещение на blank, очистка
print result.get_attribute('value')
action.move_to_element_with_offset(blank, 10, -40).perform() # Перемещение к точке (10, -40) относительно элемента blank, можно переместиться на write
print result.get_attribute('value')
sleep(2)
driver.quit()

Результат

Mouse moved

Mouse moved

3. Перетаскивание

Пример网址 http://sahitest.com/demo/dragDropMooTools.htm

代码:

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from time import sleep
driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.maximize_window()
driver.get('http://sahitest.com/demo/dragDropMooTools.htm')
dragger = driver.find_element_by_id('dragger') # Элемент, который будет перетаскиваться
item1 = driver.find_element_by_xpath('//div[text()="Item 1"]') # Элемент цели 1
item2 = driver.find_element_by_xpath('//div[text()="Item 2"]') # Цель 2
item3 = driver.find_element_by_xpath('//div[text()="Item 3"]') # Цель 3
item4 = driver.find_element_by_xpath('//div[text()="Item 4"]') # Цель 4
action = ActionChains(driver)
action.drag_and_drop(dragger, item1).perform() # 1. Перемещение dragger к целевому 1
sleep(2)
action.click_and_hold(dragger).release(item2).perform() # 2. Действие, равное предыдущему предложению, также может перемещать
sleep(2)
action.click_and_hold(dragger).move_to_element(item3).release().perform() # 3. Эффекты такие же, как и в предыдущих предложениях, также могут быть достигнуты с помощью перемещения
sleep(2)
# action.drag_and_drop_by_offset(dragger, 400, 150).perform() # 4. Переместитесь на указанные координаты
action.click_and_hold(dragger).move_by_offset(400, 150).release().perform() # 5. Как и в предыдущем предложении, переместитесь на указанные координаты
sleep(2)
driver.quit()

Результат:

dropped dropped dropped dropped

Обычно координатное определение используется редко, для этого достаточно метода 1 из примера, если смотреть на исходный код, то会发现, что метод 2 является реализацией drag_and_drop() метода 1. Примечание: при использовании перетаскивания необходимо учитывать время ожидания, иногда это может失败 из-за быстроты выполнения.

4. Нажатие

Имитация нажатия клавиш может быть выполнена несколькими способами, с помощью win32api, SendKeys или с помощью метода send_keys() объекта WebElement selenium, здесь также предоставлены несколько методов имитации нажатия клавиш классом ActionChains.

Пример сайта http://sahitest.com/demo/keypress.htm

Код 1:

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from time import sleep
driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.maximize_window()
driver.get('http://sahitest.com/demo/keypress.htm')
key_up_radio = driver.find_element_by_id('r1') # мониторинг поднимания клавиши
key_down_radio = driver.find_element_by_id('r2') # мониторинг нажатия клавиши
key_press_radio = driver.find_element_by_id('r3') # мониторинг нажатия клавиши
enter = driver.find_elements_by_xpath('//form[@name="f1"]/input')[1] # поля ввода
result = driver.find_elements_by_xpath('//form[@name="f1"]/input')[0] # мониторинг результатов
# мониторинг key_down
key_down_radio.click()
ActionChains(driver).key_down(Keys.CONTROL, enter).key_up(Keys.CONTROL).perform()
print result.get_attribute('value')
# мониторинг key_up
key_up_radio.click()
enter.click()
ActionChains(driver).key_down(Keys.SHIFT).key_up(Keys.SHIFT).perform()
print result.get_attribute('value')
# мониторинг key_press
key_press_radio.click()
enter.click()
ActionChains(driver).send_keys('a').perform()
print result.get_attribute('value')
driver.quit()

Результат:

нажата клавиша charCode=[0] keyCode=[17] CTRL
поднята клавиша charCode=[0] keyCode=[16] NONE
нажата клавиша charCode=[97] keyCode=[0] NONE

示例2:

示例网址http://sahitest.com/demo/label.htm

代码:

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
from time import sleep
driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.maximize_window()
driver.get('http://sahitest.com/demo/label.htm')
input1 = driver.find_elements_by_tag_name('input')[3]
input2 = driver.find_elements_by_tag_name('input')[4]
action = ActionChains(driver)
input1.click()
action.send_keys('Test Keys').perform()
action.key_down(Keys.CONTROL).send_keys('a').key_up(Keys.CONTROL).perform() # ctrl+a
action.key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform() # ctrl+c
action.key_down(Keys.CONTROL, input2).send_keys('v').key_up(Keys.CONTROL).perform() # ctrl+v
print input1.get_attribute('value')
print input2.get_attribute('value')
driver.quit()

Результат:

Test Keys
Test Keys

Копирование и вставка с помощью WebElement<input>.send_keys() также может быть реализовано, вы можете попробовать это, также можно использовать более низкоуровневые методы, такие как win32api, который является одним из методов обработки диалоговых окон OS, также вы можете попробовать SendKeys, keybd_event, если у вас есть интерес.

Вот весь материал этой статьи, надеюсь, он поможет вам в изучении, также希望大家多多支持呐喊教程。

Заявление: содержание этой статьи взято из Интернета, авторские права принадлежат автору, материал предоставлен пользователями Интернета в качестве добровольного вклада и загружен самостоятельно, сайт не обладает правами собственности, не производит ручную редактуру и не несет ответственности за соответствующие юридические вопросы. Если вы обнаружите подозрительное содержание, касающееся авторских прав, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (во время отправки письма замените # на @) для подачи жалобы и предоставления соответствующих доказательств. Если подтвердится, сайт немедленно удалит涉嫌侵权的内容.

Основной учебник
Вам может понравиться