Python Selenium:键盘鼠标操作

在自动化测试中,一定会遇到需要使用鼠标和键盘去操作Web元素,比如单击、双击、输入文本等等。在之前的介绍中,我们也使用过.click()、.send_keys()、.clear()这三种基本的操作,今天我们来介绍其他的操作API。

简介

名称 用法
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) 鼠标移动到距离某个元素的某个距离
pause(seconds) 暂停输入
release(on_element=None) 在某个元素松开鼠标左键
send_keys(*keys_to_send) 在当前元素中输入值
send_keys_to_element(element, *keys_to_send) 给某个元素输入值
perform() 相应存储的动作
reset_actions() 清除所有已存储的动作

因为我们之前使用过.click()、.send_keys()等方法,当我们用同样方法去使用上面其他的API时,我们发现弹出了error message

AttributeError: 'WebElement' object has no attribute 'key_down' 

这是为什么呢?

ActionChains介绍

上面表格中的API都属于Selenium的一组类,这个类叫做ActionChains类。简单来说,这个类中包含的API是使用链式方法来实现的,所有相应的动作,都存在ActionChains的一个队列当中,当使用perform()后,存储在队列中的相应动作,会按照存储顺序被触发,现在就可以理解了是吧。
使用ActionChains类,有两种方法,一种是链式操作,一种是分步操作,但他们的本质都是一样的,结果也不会有区别。

#链式操作 search_input = driver.find_element_by_id('kw') search_button = driver.find_element_by_id('su') ActionChains(driver).send_keys_to_element(search_input, 'baidu').click(search_button).perform() #分步操作 search_input = driver.find_element_by_id('kw') search_button = driver.find_element_by_id('su') action = ActionChains(driver) action.send_keys_to_element(search_input, 'baidu') action.click(search_button) action.perform() 

实例

我们用下面的网址来操作实践一下。网站中包含了一行字,一个红色矩形框,我们使用ActionChains类的API实现拖动红色的矩形框。
http://www.theautomatedtester.co.uk/demo2.html

from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains from time import sleep driver = webdriver.Chrome() driver.get('http://www.theautomatedtester.co.uk/demo2.html') dragger1 = driver.find_element_by_class_name('draggable') #定位要拖动的矩形框 drag_to = driver.find_element_by_class_name('undropped') #定位拖动到的位置 action = ActionChains(driver) action.drag_and_drop(dragger1, drag_to).perform() #拖动矩形框到目标元素处 sleep(2) driver.quit() 

我们还可以用其他方式实现,使用下面的代码替代。该代码首先让鼠标移动到红色矩形框,然后按住不松开,再让鼠标移动到拖拽的目标元素,最后松开鼠标。

#action.drag_and_drop(dragger1, to).perform() 使用下面代码代替此行,实现同一效果 action.move_to_element(dragger1).click_and_hold().move_to_element(drag_to).release().perform() 

补充

对于HTML5的拖拽等动作,Selenium支持得并不是很好,不同的JS写成的网站,可能使用drag_to_drop()等API方法不能够成功实现,请参考:
依据lxlyes的CSDN博客的介绍,我们使用JS代码来实现拖拽(需要drap_and_drop_helper.js下载到脚本相同文件夹内)

# coding = utf-8 from selenium import webdriver import os from time import sleep driver = webdriver.Chrome() driver.implicitly_wait(10) driver.get('http://the-internet.herokuapp.com/drag_and_drop') with open(os.path.abspath('drag_and_drop_helper.js'), 'r') as js_file: line = js_file.readline() script = '' while line: script += line line = js_file.readline() driver.execute_script(script + "$('#column-a').simulateDragDrop({ dropTarget: '#column-b'});") sleep(2) driver.quit() 


欢迎订阅我的公众号:进击的小QA,第一时间收到文章推送哦

Python Selenium:键盘鼠标操作_第1张图片

你可能感兴趣的:(Python+Selenium)