相关文章链接:
【Web自动化测试】(一)Selenium介绍及安装部署说明
【Web自动化测试】(二)使用selenium编写测试用例
【Web自动化测试】(三)Selenium中控件定位方法
【Web自动化测试】(五)Selenium中的三种等待方式
【Web自动化测试】(六)Selenium中表单、多窗口、多frame、多浏览器等场景处理方法
【Web自动化测试】(七)selenium中执行JavaScript脚本
【web自动化测试】(八)cookie复用
目录
前言:
本文为在霍格沃兹测试开发学社中学习到的一些技术,写出来分享给大家,希望有志同道合的小伙伴可以一起交流技术,一起进步。
当我们学会对页面元素进行定位后,下一步就是学习如何与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()
# 所有操作使用多条语句分布写,最后调用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)
: 鼠标左键按住源元素,然后移动到目标元素并释放鼠标按钮。
- 参数:
- source:源元素
- target:目标元素
drag_and_drop_by_offset(source, xoffset, yoffset)
:鼠标左键按住源元素,然后移动到目标偏移量并释放鼠标按钮。
- 参数:
- source:源元素
- xoffset:X偏移量
- yoffset:Y偏移量
key_down(value, element=None)
: 模拟按键按下,不释放。只能使用修改键(Control, Alt和Shift)
-
value: 修改键Control, Alt和Shift.。Keys类中有定义
-
element:被操作的页面元素。如果参数为None,则向当前定位的元素模拟按键操作。
-
示例: 模拟 ctrl+c:
ActionChains(driver).key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform()
key_up(value, element=None)
: 释放修饰符键
-
value:修改键Control, Alt和Shift.。Keys类中有定义
-
element: 被操作的页面元素。如果参数为None,则向当前定位的元素模拟按键操作。
-
示例: 模拟 ctrl+c:
ActionChains(driver).key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform()
move_by_offset(xoffset, yoffset)
: 将鼠标移动到当前鼠标位置的偏移量。
- 参数:
- xoffset: 要移动到的X偏移量,值为正整数或负整数
- yoffset:要移动到的Y偏移量,值为正整数或负整数
move_to_element(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)
:在制定元素上双击
- 参数:
- 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)
: 长按元素
- 参数:
- on_element:被操作的页面元素对象
move(xcoord, ycoord)
: 手势移动制动偏移(保持动作,未释放)
- 参数:
- xcoord:X坐标
- ycoord:Y坐标
perform()
: 执行所有操作
release(xcoord, ycoord)
:在指定的位置释放之前发出的“按住”命令。
- 参数:
- xcoord:X坐标
- ycoord:Y坐标
scroll(xoffset, yoffset)
:触摸并滚动到指定偏移位置
- 参数:
- xoffset:X 偏移量
- yoffset: Y 偏移量
scroll_from_element(on_element, xoffset, yoffset)
:从某一元素位置开始, 触摸并滚动到指定偏移位置
- 参数:
- on_element:开始元素
- xoffset: X偏移值
- yoffset:Y 偏移值
tap(on_element)
:点击指定元素
- 参数:
- on_element:被操作元素
tap_and_hold(xcoord, ycoord)
:在指定元素上点击并保持动作不释放
-
参数:
- xcoord: X坐标
- ycoord: Y坐标
3.案例演示
# -*- -*- coding: utf-8 -*- -*- -*-
# @File : Base.py
# -*- -*- -*- -*- -*- -*- -*- -*- -*-
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()
# -*- -*- coding: utf-8 -*- -*- -*-
# @File : test_action.py
# -*- -*- -*- -*- -*- -*- -*- -*- -*-
from time import sleep
import pytest
from selenium.webdriver import ActionChains, TouchActions # 导入依赖
from selenium_demo.Base import Base # 导入Base类
class TestAction(Base): # 集成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()
#还可以练习拖拽:https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable
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() # 不要忘记调用perform()
sleep(5)
self.driver.switch_to.default_content()
el_submit=self.driver.find_element_by_id('submitBTN')
print(el_submit.text)