鼠标键盘操作
目的: 了解Selenium 提供的 ActionChains 及Keys类,掌握鼠标点击、移动、拖拽、滚轮操作的方法,以及键盘常用操作,包括:全选、复制、剪切、粘贴、删除、退格、空格、回车、退出、shift键等操作方法。
要求: 在pycharm 环境下完成实验目的中所述各项任务
条件:win7/10、pycharm、selenium4.4.0
内容及步骤:
在进行Web自动化测试过程中,经常需要进行鼠标操作,包括鼠标的点击、双击、悬停、拖拽等。
Selenium 提供的 ActionChains 类包含一些特殊的动作的模拟方法,可以通过 ActionChains 类的代码查看。
每次调用 ActionChains的方法时,会将各个操作按顺序存入队列,其中可以使用pause(sec)在鼠标操作链中设置等待时间,注意不是使用sleep方法。当调用 perform() 方法时,队列中的事件会依次执行。
无论是鼠标还是键盘操作,实现动作交互中都需要使用ActionChains方法:
首先导入ActionChains 类:from selenium.webdriver import ActionChains
(或:from selenium.webdriver.common.action_chains import ActionChains
)
再实例化ActionChains对象:ac = ActionChains(driver)
一般执行时,要先获取操作的元素对象:element = driver.find_element(定位方法,参数)
,然后调用实例化后ActionChains对象的方法。
一、 鼠标点击操作:
-
鼠标左键按下并保持(不抬起):
ac.click_and_hold(element)
-
鼠标右键单击:
ac.context_click(element)
-
鼠标左键双击:
ac.double_click(element)
二、 鼠标移动操作:
- 鼠标移动到元素中心点悬停:
ac.move_to_element(element)
鼠标放在某些网站元素上面,会动态弹出一些内容,想要查看这些动态内容的特征,需要使用上次课中介绍的冻结界面方法:在 开发者工具栏 控制台 里面执行js代码:setTimeout(function(){debugger}, 5000)
- 基于当前鼠标位置按照偏移量移动:
ac.move_by_offset(13,15)
表示:向右移动13,向下移动15,若想向左、上移动,偏移量前加负号
三、 鼠标拖拽与滚轮操作:
- 将源对象(需要移动的元素)拖拽到目标对象位置:
drag_and_drop(source, target)
- 滚动鼠标滚轮,直到指定元素element出现在屏幕中:
ac.scroll_to_element(element)
注意,各项操作设置后,一定不要忘记调用 perform() 方法,完成操作的执行。
如果已经生成了动作链,但是没有进行perform操作,即使后面创建了新的动作类实例,鼠标依然处于先前的状态,所以需要释放已经生成但没有执行的动作链。
释放方法如下:
from selenium.webdriver.common.actions.action_builder import ActionBuilder
# 释放所有 actions
ActionBuilder(driver).clear_action()
自动化测试的过程中,键盘事件也是十分重要的,比如我们需要按下回车键,ctrl+c复制等操作,都离不开键盘事件。
在selenium中,提供了Keys类以及send_keys方法来供我们操作电脑键盘。
在使用键盘按键方法前需要先导入 Keys 包:
from selenium.webdriver import Keys
Keys作为类名,类属性名使用大写字母,该类的属性被赋予的值为对应的键盘的ue编码。在selenium中,所有的键盘操作可以通过 sent_keys() 里面改变参数来实现。我们知道,传入的参数为 String 类型的文本 时,主要是在输入框中输入文本内容时使用。当传入的参数为 Keys 类中的键盘按钮的ue编码值 时,则是在某一元素上执行键盘事件。
另外,某些键盘操作可以利用实例化的ActionChains对象来实现。
四、 向指定元素输入字符(或某个键)
先选择指定的元素,例如:
text_input = driver.find_element(By.ID, "textInput")
将字符输入指定元素:
ac.send_keys_to_element(text_input, "abc")
等价于:
driver.find_element(By.ID, "textInput").send_keys("abc")
五、 shift键操作:
结合实例化的ActionChains对象所具有的按下key_down方法,实现shift键操作。例如:
按下shift键不放,输入字母,得到大写字母:
ac.key_down(Keys.SHIFT).send_keys("abc")
按下shift键输入大写A,松开shift键输入小写b:
ac.key_down(Keys.SHIFT).send_keys("a").key_up(Keys.SHIFT).send_keys("b")
针对指定的元素element,通过使用 sent_keys() 函数并改变不同参数来实现基本热键操作,以下为一些常用方法。
六、 全选、复制、剪切、粘贴操作:
Ctrl+a 全选:element.send_keys(Keys.CONTROL, 'a')
Ctrl+c 复制:element.send_keys(Keys.CONTROL, 'c')
Ctrl+x 剪切:element.send_keys(Keys.CONTROL, 'x')
Ctrl+v 粘贴:element.send_keys(Keys.CONTROL, 'v')
七、 删除、退格、空格、回车、退出操作:
Delete删除: element.send_keys(Keys.DELETE)
Backspace退格:element.send_keys(Keys.BACK_SPACE)
Space空格:element.send_keys(Keys.SPACE)
Enter回车: element.send_keys(Keys.ENTER)
Ese退出: element.send_keys(Keys.ESCAPE)
八、 数字键及F1~F12功能键操作:
向元素输入数字键1:element.send_keys(Keys.NUMPAD1)
向元素发送F4键: element.send_keys(Keys.F4)
练习1:在浏览器中访问百度网站,将窗口最大化,鼠标置于顶部“地图”菜单项,右键单击,暂停3秒查看界面状态,使用move_by_offset函数将鼠标移动到界面中任何一个热搜超链接上(调试找到适合的偏移量),进行点击,等待5秒,在新打开网页中,应用鼠标滚轮使页面底部的“相关搜索”出现在屏幕中,等待5秒。关闭浏览器。
提交代码
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.actions.action_builder import ActionBuilder
driver = webdriver.Chrome()
driver.implicitly_wait(5)
# 练习一
driver.get("https://www.baidu.com/")
driver.maximize_window()
ac = ActionChains(driver)
element = driver.find_element(By.CSS_SELECTOR, '#s-top-left > a:nth-child(3)')
ac.context_click(element).perform()
time.sleep(3)
ActionBuilder(driver).clear_actions()
ac.move_by_offset(501, 326).click().perform()
driver.implicitly_wait(5)
driver.switch_to.window(driver.window_handles[1])
element = driver.find_element(By.CSS_SELECTOR, '#rs_new > div')
ac.scroll_to_element(element).perform()
time.sleep(3)
driver.quit()
练习2:在浏览器中访问百度网站,将窗口最大化,鼠标悬停在顶部“设置”菜单项,暂停3秒,单击“关闭热搜”,查看界面状态变化;打开新网页“http://sahitest.com/demo/dragDropMooTools.htm” ,拖拽“drag me”方块到“Item 3”上,查看是否出现了“dropped”文本,出现则测试通过,否则失败。关闭浏览器。
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
driver.implicitly_wait(5)
# 练习二
driver.get("https://www.baidu.com/")
driver.maximize_window()
ac = ActionChains(driver)
element = driver.find_element(By.CSS_SELECTOR, '#s-usersetting-top')
ac.move_to_element(element).perform()
time.sleep(3)
element = driver.find_element(By.CSS_SELECTOR, '#s-user-setting-menu > a.s-set-hotsearch.set-hide').click()
time.sleep(3)
# driver.quit()
driver = webdriver.Chrome()
driver.get("http://sahitest.com/demo/dragDropMooTools.htm")
driver.implicitly_wait(5)
ac = ActionChains(driver)
source = driver.find_element(By.CSS_SELECTOR, '#dragger')
target = driver.find_element(By.CSS_SELECTOR, 'body > div:nth-child(6)')
ac.drag_and_drop(source, target).perform()
time.sleep(3)
练习3:在浏览器中访问百度网站,使用模拟键盘控制:在搜索输入框中输入大写的“S”,然后输入小写的“elenium!”,对当前输入框内容进行全选、复制操作。打开新网页“https://www.sogou.com”进入搜狗网站,在其搜索输入框中先执行粘贴,再输入“!”,暂停3秒,然后删除两个字符,执行回车操作,检查是否出现查询结果,是查询结果页测试通过,否则测试失败。关闭浏览器。
import time
from time import sleep
from selenium import webdriver
from selenium.webdriver import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
driver.implicitly_wait(5)
# 练习三
driver.get("https://www.baidu.com/")
driver.maximize_window()
ac = ActionChains(driver)
element = driver.find_element(By.CSS_SELECTOR, "#kw")
ac.key_down(Keys.SHIFT).send_keys("S").key_up(Keys.SHIFT).send_keys("elenium!").perform()
time.sleep(2)
element.send_keys(Keys.CONTROL, 'a')
element.send_keys(Keys.CONTROL, 'c')
driver.get("https://www.sogou.com")
element = driver.find_element(By.CSS_SELECTOR, '#query')
element.send_keys(Keys.CONTROL, 'v')
time.sleep(2)
element.send_keys('!')
# ac.send_keys_to_element(element, '!')
time.sleep(3)
element.send_keys(Keys.BACK_SPACE)
element.send_keys(Keys.BACK_SPACE)
element.send_keys(Keys.ENTER)
time.sleep(3)
# assert "搜狗搜索" in driver.title
for handle in driver.window_handles:
# 先切换到该窗口
driver.switch_to.window(handle)
# 得到该窗口的标题栏字符串,判断是不是我们要操作的那个窗口
if '搜狗搜索' in driver.title:
# 如果是,那么这时候WebDriver对象就是对应的该该窗口,正好,跳出循环,
print('测试通过')
break
else:
print('测试没通过')
driver.quit()