相关文章链接:
【Web自动化测试】(一)Selenium介绍及安装部署说明
【Web自动化测试】(二)使用selenium编写测试用例
【Web自动化测试】(三)Selenium中控件定位方法
【Web自动化测试】(五)Selenium中的三种等待方式
【Web自动化测试】(六)Selenium中表单、多窗口、多frame、多浏览器等场景处理方法
【Web自动化测试】(七)selenium中执行JavaScript脚本
【web自动化测试】(八)cookie复用
前言:
本文为在霍格沃兹测试开发学社中学习到的一些技术,写出来分享给大家,希望有志同道合的小伙伴可以一起交流技术,一起进步。
当我们学会对页面元素进行定位后,下一步就是学习如何与WEB控件进行交互。Selenium为我们提供了与WEB控件进行交互的API,下面就为大家介绍ActionChains和TouchActions这两个类的使用方法。
Action Chains可模拟PC端的鼠标点击、双击、邮件、拖拽等事件。
调用ActionChains的方法时,不会立即执行,而是将所有的操作,按照顺序放在一个队列中,当调用了perform()
方法时,队列中的事件会依次执行。
action=ActionChains(driver)
action.方法1
action.方法2
action.perform()
ActionChains(driver).move_to_element(element).click(element).perform() #所有操作一条语句写完,使用"."添加操作
action=ActionChains(driver)
action.move_to_element(element)
action.click(element)
action.perform()
# 所有操作使用多条语句分布写,最后调用perform()执行
注意:在实际使用中分布写法问题会比较多。所以当操作不复杂的情况下,建议使用链式写法。
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)
: 模拟按键按下,不释放。只能使用修改键(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)
: 将鼠标移动到当前鼠标位置的偏移量。
move_to_element(to_element)
:将鼠标移动到元素的中间
move_to_element_with_offset(to_element, xoffset, yoffset)
:以指定元素左上角为基准,将鼠标按照偏移量进行移动
pause(seconds)
:暂停操作
perform()
:执行所有操作
release(on_element=None)
:释放元素上按住的鼠标按钮。
reset_actions()
:清除已经存储在本地和远程端的操作。
send_keys(*keys_to_send)
: 发送键到当前被定位的元素。
send_keys_to_element(element, *keys_to_send)
:向元素发送键。
Touch Actions可模拟PC和移动端的点击,滑动,拖拽,多点触控等多种手势操作。
Touch Actions与Action Chains类似,Action Chains只是针对于PC端程序鼠标模拟一系列操作,对H5页面操作是无时效的。但是Touch Actions不仅可以对PC端程序模拟鼠标操作,还可以对H5页面进行操作。
执行原理与ActionChains一样,最后,需要调用perform()
方法,才能完成操作事件的执行。
基本用法(与ActionChains一样)
action=TouchChains(driver)
action.方法1
action.方法2
action.perform()
TouchChains操作的具体写法与ActionChains一样,都可使用链式写法和分布式写法。
double_tap(on_element)
:在制定元素上双击
flick(xspeed, yspeed)
:手势滑动,可从屏幕中任意位置开始滑动
flick_element(on_element, xoffset, yoffset, speed)
: 从某个元素开始的手势滑动(向上滑动为正数,向下滑动为负数),并以指定的速度进行x坐标和y坐标方向移动
long_press(on_element)
: 长按元素
move(xcoord, ycoord)
: 手势移动制动偏移(保持动作,未释放)
perform()
: 执行所有操作
release(xcoord, ycoord)
:在指定的位置释放之前发出的“按住”命令。
scroll(xoffset, yoffset)
:触摸并滚动到指定偏移位置
scroll_from_element(on_element, xoffset, yoffset)
:从某一元素位置开始, 触摸并滚动到指定偏移位置
tap(on_element)
:点击指定元素
tap_and_hold(xcoord, ycoord)
:在指定元素上点击并保持动作不释放
参数:
# -*- -*- 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)
文末说明
推荐博文: 只需Docker,环境问题再也不是测开路上的『坑』_霍格沃兹测试开发学社的博客-CSDN博客