Home  >  Article  >  Backend Development  >  Play with python selenium mouse and keyboard operations (ActionChains)

Play with python selenium mouse and keyboard operations (ActionChains)

高洛峰
高洛峰Original
2017-02-22 17:19:452777browse

When using Selenium for automation, sometimes you will encounter situations where you need to simulate mouse operations, such as clicking, double-clicking, right-clicking, dragging, etc. Selenium provides us with a class to handle such events - ActionChains

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

This class can basically meet all our needs for mouse operations.

1. Basic usage of ActionChains

First of all, you need to understand the execution principle of ActionChains. When you call the method of ActionChains, it will not be executed immediately, but all the Operations are stored in a queue in order. When you call the perform() method, the times in the queue will be executed sequentially.

In this case we can have two calling methods:

•Chain writing method

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

•Step-by-step writing

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

The two writing methods are essentially the same. ActionChains will perform all operations in order.

2.ActionChains method list

click(on_element=None) ——Click the left mouse button

click_and_hold(on_element=None ) ——Click the left mouse button without releasing it

context_click(on_element=None) ——Click the right mouse button

double_click(on_element=None) ——Double click the left mouse button

drag_and_drop(source, target) ——Drag to an element and then release it

drag_and_drop_by_offset(source, xoffset, yoffset) ——Drag to a certain coordinate and then release it

key_down(value, element=None) ——Press a key on the keyboard

key_up(value, element=None) ——Release a key

move_by_offset(xoffset, yoffset ) ——Move the mouse from the current position to a certain coordinate

move_to_element(to_element) ——Move the mouse to a certain element

move_to_element_with_offset(to_element, xoffset, yoffset) ——Move to a distance How far away is the element (upper left corner coordinates)

perform() - Execute all actions in the chain

release(on_element=None) - Release the mouse at an element position Left key

send_keys(*keys_to_send) ——Send a key to the currently focused element

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


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

3. Code examples

1. Click operation

Example URL http://www.php.cn/;


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/clicks.htm')

click_btn = driver.find_element_by_xpath('//input[@value="click me"]') # 单击按钮
doubleclick_btn = driver.find_element_by_xpath('//input[@value="dbl click me"]') # 双击按钮
rightclick_btn = driver.find_element_by_xpath('//input[@value="right click me"]') # 右键单击按钮


ActionChains(driver).click(click_btn).double_click(doubleclick_btn).context_click(rightclick_btn).perform() # 链式用法

print driver.find_element_by_name('t2').get_attribute('value')

sleep(2)
driver.quit()

Result:

[CLICK][DOUBLE_CLICK][RIGHT_CLICK]

2. Mouse movement


Example URL http://www.php.cn/;


Sample 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"]') # 鼠标移动到此元素,在下面的input框中会显示“Mouse moved”
blank = driver.find_element_by_xpath('//input[@value="Blank on hover"]') # 鼠标移动到此元素,会清空下面input框中的内容

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() # 移动到距离blank元素(10,-40)的点,可移动到write上
print result.get_attribute('value')

sleep(2)
driver.quit()

Result

Mouse moved

Mouse moved

3. Drag

Sample URL http://www.php.cn/;


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/dragDropMooTools.htm')

dragger = driver.find_element_by_id('dragger') # 被拖拽元素
item1 = driver.find_element_by_xpath('//p[text()="Item 1"]') # 目标元素1
item2 = driver.find_element_by_xpath('//p[text()="Item 2"]') # 目标2
item3 = driver.find_element_by_xpath('//p[text()="Item 3"]') # 目标3
item4 = driver.find_element_by_xpath('//p[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()

Result:

dropped dropped dropped

Generally, coordinate positioning is rarely used. Method 1 in the above example is enough. If you look at the source code, you will find that method 2 is actually the method in method 1. Implementation of drag_and_drop(). Note: Pay attention to the waiting time when using drag and drop. Sometimes it will fail because the speed is too fast.

4. Keystrokes

There are many ways to simulate keystrokes, which can be implemented using win32api, SendKeys, or the send_keys() method of Selenium's WebElement object, here The ActionChains class also provides several methods for simulating key presses.


Sample URL http://www.php.cn/;


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

Result:

key downed charCode=[0] keyCode=[17] CTRL

key upped charCode=[0] keyCode=[16] NONE
key pressed charCode=[97] keyCode=[0] NONE

Example 2:

Sample URL http://www.php.cn/;


Code:

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

Result:

Test Keys

Test Keys

Copy and paste can also be achieved using WebElement2fbe6547fcb2fa6a5faf70a81ceaf6e4.send_keys() , you can try it, or you can use a lower-level method, win32api, which is also one of the ways to deal with os pop-up boxes. If you are interested, you can also try SendKeys, keybd_event


The above is the entire article The content, I hope it will be helpful to everyone's learning, and I also hope that everyone will support the PHP Chinese website.

For more related articles about playing with python selenium mouse and keyboard operations (ActionChains), please pay attention to the PHP Chinese website!


Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn