ActionChains解析
- 实例化类ActionChains,参数为driver实例。
- 中间可以有多个操作。
- .perform()代表确定执行。
ActionChains(self.driver).操作.perform()
键盘事件
- 按下(key_down)、释放(key_up)键盘键位
- 结合send_keys回车(send_keys(Keys.ENTER))
-
官方接口手册:
Keyboard actions | Selenium -
官方接口手册:
Actions API | Selenium
使用场景和对应事件
-
键盘事件: 使用shift实现大小写(Keys.SHIFT)
-
键盘事件: 输入后回车(Keys.ENTER)
-
键盘事件: 复制粘贴(Keys.CONTROL.sendkeys(“xvvv”.))
-
鼠标事件: 双击(double_click(ele))
-
鼠标事件: 拖动元素(drag_and_drop(ele))
-
鼠标事件: 指定位置(例: 悬浮在下拉框的小三角位置处)(move_to_element(ele))
-
鼠标事件: 滚轮/滚动操作-滚动到元素(scroll_to_element(ele)、scroll_by_amount(x,y))
键盘事件-使用shift实现大写
- ActionChains(self.driver): 实例化ActionChains类
- key_down(Keys.SHIFT, ele): 按下shift键实现大写
- send_keys(“selenium”): 输入大写的selenium
- perform(): 确认执行
def test_shift(self):
"""
# 键盘事件: 使用shift实现大小写
1、访问 https://ceshiren.com/
2、点击搜索按钮
3、输入搜索的内容,输入的同时按着shift键
:return:
"""
self.driver.get("https://ceshiren.com/")
self.driver.find_element(By.CSS_SELECTOR, "#search-button").click()
# 目标元素即为输入框
ele = self.driver.find_element(By.ID,"search-term")
# key_down 代表按下某个键位, Keys.SHIFT表示按shift键, ele表示目标元素
# sendkeys 表示输入内容
# perform 表示执行此链式操作
ActionChains(self.driver)\
.key_down(Keys.SHIFT, ele)\
.send_keys("selenium")\
.perform()
time.sleep(3)
键盘事件-输入后回车
- 直接输入回车: 元素.send_keys(Keys.ENTER)
- 使用ActionChains: key_down(Keys.ENTER)
def test_enter_send_keys(self):
"""
# 键盘事件: 输入后回车
:return:
"""
self.driver.get("https://www.sogou.com/")
self.driver.find_element(By.ID, "query").send_keys("霍格沃茨开发")
# 第一种回车方式: 定位元素.send_keys(Keys.ENTER)
self.driver.find_element(By.ID, "query").send_keys(Keys.ENTER)
time.sleep(3)
# 第二种回车方式:使用ActiChains: key_down(Keys.ENTER)
ActionChains(self.driver).key_down(Keys.ENTER).perform()
time.sleep(3)
键盘事件-复制粘贴
- 多系统兼容
- mac 的复制按钮为 COMMAND
- windows 的复制按钮为 CONTROL
- 左箭头:
Keys.ARROW_LEFT
- 按下COMMAND或者CONTROL:
key_down(cmd_ctrl)
- 按下剪切与粘贴按钮:
send_keys("xvvvvv")
def test_copy_and_paste(self):
"""
# 键盘事件: 复制粘贴
1、访问 https://ceshiren.com/
2、点击搜索按钮
3、输入搜索的内容,同时按住ctrl键 + shift键 + 左方向键,实现选中光标左边的第一个字符
4、按住 ctrl键 + c键,实现复制选中的内容, 按住v键,实现粘贴复制的内容
:return:
"""
self.driver.get("https://ceshiren.com/")
self.driver.find_element(By.CSS_SELECTOR, "#search-button").click()
# 目标元素即为输入框
ele = self.driver.find_element(By.ID, "search-term")
# 先根据操作系统的类型判断复制功能的键盘事件选哪种:mac(darwin)操作系统, 使用Keys.COMMAND; windos操作系统使用Keys.CONTROL
command_control = Keys.COMMAND if sys.platform == 'darwin' else Keys.CONTROL
# key_down 代表按下某个键位, Keys.SHIFT表示按shift键, ele表示目标元素
# sendkeys 表示输入内容
# Keys.ARROW_LEFT 表示按左方向键,出现几个Keys.ARROW_LEFT,表示光标向左移动几个键位
# command_control 表示Keys.CONTROL, Ctrl键
# send_keys("xvvv") 表示x键按一下,v键按三下(即表示剪切一次,粘贴三次)
# key_up(command_control) 表示松开Ctrl键
ActionChains(self.driver)\
.key_down(Keys.SHIFT, ele)\
.send_keys("selenium")\
.key_down(Keys.ARROW_LEFT)\
.key_down(Keys.ARROW_LEFT)\
.key_down(command_control).send_keys("xvvv").key_up(command_control)\
.perform()
time.sleep(3)
鼠标事件
- 双击
- 拖动元素
- 指定位置(悬浮)
- 官方接口手册:
Mouse actions | Selenium
鼠标事件-双击
-
double_click(元素对象)
: 双击元素
def test_double_click(self):
"""
# 鼠标事件: 双击
1、访问 https://vip.ceshiren.com/#/ui_study/frame;
2、定位到 “点击两次响应”的元素,并赋值给一个元素对象ele;
3、通过ActionChains实现双击
:return:
"""
self.driver.get("https://vip.ceshiren.com/#/ui_study/frame")
ele = self.driver.find_element(By.ID, "primary_btn")
ActionChains(self.driver).double_click(ele).perform()
time.sleep(3)
鼠标事件-拖动元素
-
drag_and_drop(起始元素对象, 结束元素对象)
: 拖动并放开元素
def test_drag_and_drop(self):
"""
# 鼠标事件: 拖动元素
1、访问 https://vip.ceshiren.com/#/ui_study/action_chains;
2、获取起始元素位置
3、获取目标元素位置
4、通过ActiChains实现拖拽操作
:return:
"""
self.driver.get("https://vip.ceshiren.com/#/ui_study/action_chains")
start_ele = self.driver.find_element(By.ID, "item1")
target_ele = self.driver.find_element(By.ID, "item3")
ActionChains(self.driver).drag_and_drop(start_ele, target_ele).perform()
time.sleep(3)
鼠标事件-悬浮
-
move_to_element(元素对象)
: 移动到某个元素
def test_move_to_element(self):
"""
# 鼠标事件: 把光标移动到指定位置(例: 悬浮在下拉框的小三角位置处)
1、访问 https://vip.ceshiren.com/#/ui_study/action_chains2;
2、定位到目标元素
3、通过ActionChains实现将光标移动到指定位置的操作
:return:
"""
self.driver.get("https://vip.ceshiren.com/#/ui_study/action_chains2")
ele = self.driver.find_element(By.CLASS_NAME, "menu")
ActionChains(self.driver).move_to_element(ele).perform()
time.sleep(3)
self.driver.find_element(By.XPATH, "//*[contains(text(), '测开班')]").click()
time.sleep(3)
滚轮/滚动操作-滚动到元素
- 滚动到元素
-
scroll_to_element(WebElement对象)
:滚动到某个元素 - 根据坐标滚动
- 滚轮/滚动操作-根据坐标滚动
scroll_by_amount(横坐标, 纵坐标)
- 注意: selenium 版本需要在 4.2 之后
def test_scroll_to_element(self):
"""
# 鼠标事件: 滚轮/滚动操作-滚动到元素
1、访问 https://ceshiren.com/;
2、定位到目标元素
3、通过ActionChains实现通过鼠标滚轮滚动到目标元素位置
:return:
"""
self.driver.get("https://ceshiren.com/")
ele = self.driver.find_element(By.XPATH, "//*[@id='ember47']/td[1]/span/a")
# 第一种方式:通过scroll_to_element(ele)实现
ActionChains(self.driver).scroll_to_element(ele).perform()
# 第二种方式:通过scroll_by_amount(ele)实现
ActionChains(self.driver).scroll_by_amount(0, 3000).perform()
time.sleep(10)