This article mainly introduces python selenium mouse and keyboard operations (ActionChains) in detail, and teaches you how to play with selenium mouse and keyboard. Interested friends can refer to it.
With selenium for automation, sometimes you will encounter situations that need to simulate mouse operations, such as clicking, double-clicking, clicking the right mouse button, dragging and so on. And 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 operation.
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. Instead, all operations will be stored in a queue in order. When you call the perform() method, the time in the queue will be changed. Execute in turn.
In this case, we can have two calling methods:
•Chain writing
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:
3
4
5
6
7
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, and ActionChains will execute all operations in order.
2. List of ActionChains methods
click(on_element=None)-click the left mouse button
click_and_hold(on_element=None) ——click the left button of the mouse 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
drag_and_drop_by_offset(source, xoffset, yoffset)-drag to a certain coordinate and then release
key_down(value, element=None)-press a key on a keyboard
key_up(value, element=None)-release a key
move_by_offset(xoffset, yoffset)-the mouse moves from the current position to a certain coordinate
move_to_element(to_element)-the mouse moves to an element
move_to_element_with_offset(to_element, xoffset, yoffset) —— move to the position of how far away from an element (the upper left corner coordinate)
perform()-perform all actions in the chain
release(on_element=None)-release the left mouse button at an element position
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, use examples to illustrate and demonstrate the usage of each method in detail:
3. Code example
1. Click to operate
Sample URL http://sahitest.com/demo/clicks.htm
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://sahitest.com/demo/mouseover.htm
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 and drop
Example URL http://sahitest.com/demo/dragDropMooTools.htm
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('//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()
result:
dropped dropped dropped dropped
Generally speaking, coordinate positioning is rarely used. Method 1 in the above example is sufficient. If you look at the source code, you will find that method 2 is actually the implementation of drag_and_drop() in method 1. Note: Pay attention to the waiting time when dragging and using, sometimes it will fail because of the speed being too fast.
4. Button
There are many ways to simulate keystrokes, which can be realized by win32api, SendKeys, or by the send_keys() method of Selenium's WebElement object. Here, the ActionChains class also provides several methods for simulating keystrokes.
Example URL http://sahitest.com/demo/keypress.htm
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:
Example URL http://sahitest.com/demo/label.htm
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 with WebElement<input>.send_keys(). You can try it or use a lower-level method. Win32api is also one of the ways to deal with os popups. If you are interested, you can also try SendKeys, keybd_event
The above is the whole content of this article, I hope it will be helpful to everyone's study.
I am a python development engineer, and I have compiled a set of the latest python system learning tutorials, including basic python scripts to web development, crawlers, data analysis, data visualization, machine learning, and interview books. Those who want these materials can pay attention to the editor, add Q skirt 851211580 to pick up Python learning materials and learning videos, and online guidance from the Great God!