English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
При автоматизации с помощью 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 (во время отправки письма замените # на @) для подачи жалобы и предоставления соответствующих доказательств. Если подтвердится, сайт немедленно удалит涉嫌侵权的内容.