当我们学会对页面元素进行定位后,下一步就是学习如何与WEB控件进行交互。Selenium为我们提供了与WEB控件进行交互的API,下面就为大家介绍ActionChains和TouchActions这两个类的使用方法。
1. Action Chains
1.1 简要说明
Action Chains可模拟PC端的鼠标点击、双击、邮件、拖拽等事件。
1.2 执行原理
调用ActionChains的方法时,不会立即执行,而是将所有的操作,按照顺序放在一个队列中,当调用了perform() 方法时,队列中的事件会依次执行。
1.3 基本用法
- 先生成一个动作
action=ActionChains(driver) - 为动作添加方法1
action.方法1 - 为动作添加方法2
action.方法2 - 调用perform()方法执行
action.perform()
1.4 具体写法
ActionChains(driver).move_to_element(element).click(element).perform()
action=ActionChains(driver)
action.move_to_element(element)
action.click(element)
action.perform()
注意:在实际使用中分布写法问题会比较多。所以当操作不复杂的情况下,建议使用链式写法。
1.5 ActionChains中可调用的方法
click(on_element=None) :点击页面元素
- 参数:
- on_element:要被操作的页面元素对象. 如果参数为None,则点当前鼠标所在位置。
click_and_hold(on_element=None) :鼠标右击元素,并保持鼠标右键被按住转态
- 参数:
- on_element:被操作的页面元素。如果参数为None,则点当前鼠标所在位置。
context_click(on_element=None) : 对元素进行鼠标右击操作
- 参数:
- on_element:被操作的页面元素。如果参数为None,则点当前鼠标所在位置。
double_click(on_element=None) :双击元素
- 参数:
- on_element:被操作的页面元素。如果参数为None,则点当前鼠标所在位置。
drag_and_drop(source, target) : 鼠标左键按住源元素,然后移动到目标元素并释放鼠标按钮。
drag_and_drop_by_offset(source, xoffset, yoffset) :鼠标左键按住源元素,然后移动到目标偏移量并释放鼠标按钮。
- 参数:
- source:源元素
- xoffset:X偏移量
- yoffset:Y偏移量
key_down(value, element=None) : 模拟按键按下,不释放。只能使用修改键(Control, Alt和Shift)
key_up(value, element=None) : 释放修饰符键
move_by_offset(xoffset, yoffset) : 将鼠标移动到当前鼠标位置的偏移量。
- 参数:
- xoffset: 要移动到的X偏移量,值为正整数或负整数
- yoffset:要移动到的Y偏移量,值为正整数或负整数
move_to_element(to_element) :将鼠标移动到元素的中间
move_to_element_with_offset(to_element, xoffset, yoffset) :以指定元素左上角为基准,将鼠标按照偏移量进行移动
- 参数:
- to_element: 要移动到的元素
- xoffset:要移动到的X坐标.
- yoffset:要移动到的Y坐标.
pause(seconds) :暂停操作
perform() :执行所有操作
release(on_element=None) :释放元素上按住的鼠标按钮。
- 参数:
- on_element:被操作的页面元素。如果参数为None,则点当前鼠标所在位置。
reset_actions() :清除已经存储在本地和远程端的操作。
send_keys(*keys_to_send) : 发送键到当前被定位的元素。
- 参数:
- keys_to_send: 被发送的键。修饰符键常量可以在’ keys '类中找到。
send_keys_to_element(element, *keys_to_send) :向元素发送键。
- 参数:
- element: 被操作元素.
- keys_to_send:被发送的键。修饰符键常量可以在’ keys '类中找到。
2. Touch Actions
2.1 简要说明
Touch Actions可模拟PC和移动端的点击,滑动,拖拽,多点触控等多种手势操作。
Touch Actions与Action Chains类似,Action Chains只是针对于PC端程序鼠标模拟一系列操作,对H5页面操作是无时效的。但是Touch Actions不仅可以对PC端程序模拟鼠标操作,还可以对H5页面进行操作。
2.2 执行原理
执行原理与ActionChains一样,最后,需要调用perform() 方法,才能完成操作事件的执行。
基本用法(与ActionChains一样)
- 先生成一个动作
action=TouchChains(driver) - 为动作添加方法1
action.方法1 - 为动作添加方法2
action.方法2 - 调用perform()方法执行
action.perform()
2.3 具体写法
TouchChains操作的具体写法与ActionChains一样,都可使用链式写法和分布式写法。
2.4 ActionChains中可调用的方法
double_tap(on_element) :在制定元素上双击
flick(xspeed, yspeed) :手势滑动,可从屏幕中任意位置开始滑动
- 参数:
- xspeed: X坐标方向,每秒移动速度的像素值.
- yspeed: Y坐标方向,每秒移动速度的像素值.
flick_element(on_element, xoffset, yoffset, speed) : 从某个元素开始的手势滑动(向上滑动为正数,向下滑动为负数),并以指定的速度进行x坐标和y坐标方向移动
- 参数:
- on_element:开始页面元素
- xoffset:X坐标偏移值
- yoffset: Y坐标偏移值
- speed: 每秒滑动的速度(单位:像素)
long_press(on_element) : 长按元素
move(xcoord, ycoord) : 手势移动制动偏移(保持动作,未释放)
perform() : 执行所有操作
release(xcoord, ycoord) :在指定的位置释放之前发出的“按住”命令。
scroll(xoffset, yoffset) :触摸并滚动到指定偏移位置
- 参数:
- xoffset:X 偏移量
- yoffset: Y 偏移量
scroll_from_element(on_element, xoffset, yoffset) :从某一元素位置开始, 触摸并滚动到指定偏移位置
- 参数:
- on_element:开始元素
- xoffset: X偏移值
- yoffset:Y 偏移值
tap(on_element) :点击指定元素
tap_and_hold(xcoord, ycoord) :在指定元素上点击并保持动作不释放
3.案例演示
from selenium import webdriver
import os
class Base():
def setup(self):
option = webdriver.ChromeOptions()
option.add_experimental_option('w3c', False)
browser=os.getenv("browser")
print("broswer",browser)
if browser=="firefox":
self.driver=webdriver.Firefox()
elif browser =='headless':
self.driver=webdriver.PhantomJS()
else:
self.driver = webdriver.Chrome(options=option)
option=webdriver.ChromeOptions()
option.add_experimental_option('w3c',False)
self.driver.implicitly_wait(10)
self.driver.maximize_window()
def teardown(self):
self.driver.quit()
from time import sleep
import pytest
from selenium.webdriver import ActionChains, TouchActions
from selenium_demo.Base import Base
class TestAction(Base):
def test_touchactions(self):
"""
联系以下内容:
1.TouchActions: scroll_from_element tap操作
"""
self.driver.get("http://www.baidu.com/")
el_input=self.driver.find_element_by_id('kw')
el_search=self.driver.find_element_by_id('su')
el_input.send_keys("selenium")
sleep(5)
action=TouchActions(self.driver)
action.tap(el_search)
action.perform()
action.scroll_from_element(el_search,0,10000).perform()
def test_frame_drag(self):
"""
练习以下内容:
1.ActionChains: click_and_hold
2.切换frame:switch_to.frame() switch_to.deault_content()
"""
self.driver.get("https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable")
self.driver.switch_to.frame('iframeResult')
el_draggable=self.driver.find_element_by_id('draggable')
el_droppable=self.driver.find_element_by_id('droppable')
action=ActionChains(self.driver)
action.click_and_hold(el_draggable).move_to_element(el_droppable).perform()
sleep(5)
self.driver.switch_to.default_content()
el_submit=self.driver.find_element_by_id('submitBTN')
print(el_submit.text)
|