【Web自动化测试】(四)Selenium中WEB控件交互的方法

相关文章链接:
【Web自动化测试】(一)Selenium介绍及安装部署说明
【Web自动化测试】(二)使用selenium编写测试用例
【Web自动化测试】(三)Selenium中控件定位方法
【Web自动化测试】(五)Selenium中的三种等待方式
【Web自动化测试】(六)Selenium中表单、多窗口、多frame、多浏览器等场景处理方法
【Web自动化测试】(七)selenium中执行JavaScript脚本
【web自动化测试】(八)cookie复用


目录

  • 1. Action Chains
    • 1.1 **简要说明**
    • 1.2 **执行原理**
    • 1.3 **基本用法**
    • 1.4 **具体写法**
    • 1.5 **ActionChains中可调用的方法**
  • 2. Touch Actions
    • 2.1 **简要说明**
    • 2.2 **执行原理**
    • 2.3 **具体写法**
    • 2.4 **ActionChains中可调用的方法**
  • 3.案例演示


前言:
本文为在霍格沃兹测试开发学社中学习到的一些技术,写出来分享给大家,希望有志同道合的小伙伴可以一起交流技术,一起进步。


当我们学会对页面元素进行定位后,下一步就是学习如何与WEB控件进行交互。Selenium为我们提供了与WEB控件进行交互的API,下面就为大家介绍ActionChainsTouchActions这两个类的使用方法。


1. Action Chains

1.1 简要说明

Action Chains可模拟PC端的鼠标点击、双击、邮件、拖拽等事件。

1.2 执行原理

调用ActionChains的方法时,不会立即执行,而是将所有的操作,按照顺序放在一个队列中,当调用了perform()方法时,队列中的事件会依次执行。

1.3 基本用法

  1. 先生成一个动作 action=ActionChains(driver)
  2. 为动作添加方法1 action.方法1
  3. 为动作添加方法2 action.方法2
  4. 调用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一样)

  1. 先生成一个动作 action=TouchChains(driver)
  2. 为动作添加方法1 action.方法1
  3. 为动作添加方法2 action.方法2
  4. 调用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)

文末说明
推荐博文: 只需Docker,环境问题再也不是测开路上的『坑』_霍格沃兹测试开发学社的博客-CSDN博客

你可能感兴趣的:(WEB自动化测试,selenium,WEB控件交互,ActionChains,Touchchains,python)