Just this trick can play python selenium mouse and keyboard operation

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!

Guess you like

Origin blog.csdn.net/pyjishu/article/details/105417360