python自动化[poco篇]

2023-11-09

Poco

Poco是一款跨平台的自动化测试框架,基于UI控件搜索原理,与基于图像识别的Airtest不同的是,Poco可以使用类似 poco(“OK”).click() 的方式来获取并操作节点。

Poco能帮助我们获取控件的属性信息、操作控件、设置控件的text属性等等,但是连接设备、断言等操作,还需要依赖于Airtest的API,所以我们大多数情况下,都需要混合使用Airtest和Poco框架来编写我们的自动化脚本。

安装

pip install pocoui

三种定位选择器

基本选择器(推荐)

在poco实例后加一对括号,就可以进行元素选择了。

选择器会遍历所有元素,将满足给定条件的元素都选出来并返回。

括号里的参数就是所给定的条件,用属性名值对表示,其中第一个参数表示 节点名 ,就像 poco(“star_single”) 。后面还可以跟着一些可选参数,均表示 节点的属性及预期的属性值。

poco("star_single",type="Image")
# 表示在star_single节点下,type = 'image'的元素

相对选择器(不推荐)

如果直接用节点属性(或者说仅仅使用基本选择器)没法选出元素时,还可以通过元素之间的渲染层级关系进行选择,例如父子关系、兄弟关系、祖先后代关系等等

poco("plays").child("playBasic").offspring("star_single")

# 表示在 plays 节点下,找到儿子节点 playBasic , 再找儿子的所有后代在中的 star_single

空间顺序选择器(不推荐)

name0 = poco("Content").child(type="Text")[0].get_name()
name1 = poco("Content").child(type="Text")[1].get_name()
name2 = poco("Content").child(type="Text")[2].get_name()

# 根据索引取值

利用正则表达式匹配控件(推荐)

只要能够用 poco(xx=预期属性值) 来选择的控件,就可以用 poco(xxMatches=预期属性值的正则表达式) 来进行匹配定位。

Poco定位脚本的常见问题

区分控件定位脚本与控件操作脚本

# poco控件定位脚本
poco("star_single")

# poco控件操作脚本
poco("star_single").click()

Poco控件的核心API

控件点击操作

# 控件单击
poco("star_single").click()
# 控件长按
poco('star_single').long_click()

控件的滑动操作

# 向下滑动0.2个单位距离
poco("Handle").swipe([0,0.2])
sleep(1.0)
# 向上滑动0.2个单位距离
poco("Handle").swipe([0,-0.2])
sleep(1.0)
# 向下滑动0.1个单位距离
poco("Handle").swipe("down")
sleep(1.0)
# 向上滑动0.1个单位距离
poco("Handle").swipe("up")
sleep(1.0)

控件属性的读取和设置

print("name:"+poco("star_single").attr("name"))
print("type:"+poco("star_single").attr("type"))
print("texture:"+poco("star_single").attr("texture"))print("name:"+poco("star_single").get_name())
print("position:"+str(poco("star_single").get_position()))
print("size:"+str(poco("star_single").get_size()))

设置控件的属性值

# 先激活输入光标
poco("pos_input").click()

# 再执行输入动作
poco("pos_input").set_text("123")

或

poco("pos_input").setattr('text',"456")

判断控件是否存在

if poco("star_single").exists():
    poco("star_single").click()
else:
    print("未找到星星控件")

Airtest的exists是用于判断图片存在,exists(图片);而Poco的exists是用于判断控件存在,poco(xxx).exists()。

断言控件存在

assert_equal(poco("star_single").exists(),True,"断言星星控件存在")

控件的拖动

# 拖动到另一个控件上
poco("playDragAndDrop").child("star")[0].drag_to(poco("shell"))

# 拖动到固定目标上
poco("playDragAndDrop").child("star")[1].drag_to([0.503, 0.705])

控件的等待事件

# 在10s内等待控件出现,如出现,则进行长按操作
poco(texture="icon").wait(timeout=10).long_click()


# 以下等待在超时会报错
# 等待黄色小鱼出现
poco("yellow").wait_for_appearance(timeout=20)
# 等待计分文本控件消失
poco(text="Count:").wait_for_disappearance(timeout=3)

# 等待多个控件
poco("wait_ui2").click()
yellow = poco("yellow")
blue = poco("blue")
black = poco("black")

poco.wait_for_all([yellow,blue,black])
poco("btn_back").click()

Android平台的Poco初始化

多个设备需要初始化不同的poco对象

# -*- encoding=utf8 -*-
__author__ = "AirtestProject"

from airtest.core.api import *
auto_setup(__file__,devices=["android://127.0.0.1:5037/127.0.0.1:7555"])

from poco.drivers.android.uiautomation import AndroidUiautomationPoco
poco = AndroidUiautomationPoco(use_airtest_input=True, screenshot_each_action=False)

poco(text="网易云音乐").click()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python自动化[poco篇] 的相关文章

  • Spark 请求最大计数

    我是 Spark 的初学者 我尝试请求允许我检索最常访问的网页 我的要求如下 mostPopularWebPageDF logDF groupBy webPage agg functions count webPage alias cntW
  • 围绕 readline 构建的 python 批处理的触发器选项卡完成

    背景 我有一个 python 程序 它导入并使用 readline 模块来构建自制的命令行界面 我有第二个 python 程序 围绕 Bottle 一个 Web 微框架构建 充当该 CLI 的前端 第二个 python 程序向第一个程序打开
  • Python Popen 与 psexec 挂起 - 不良结果

    我对 subprocess Popen 和我认为是管道的问题有疑问 我有以下代码块 从 cli 运行时 100 都不会出现问题 p subprocess Popen psexec serverName get cmd c ver echo
  • 使用 python 进行串行数据记录

    Intro 我需要编写一个小程序来实时读取串行数据并将其写入文本文件 我在读取数据方面取得了一些进展 但尚未成功地将这些信息存储在新文件中 这是我的代码 from future import print function import se
  • 如何迭代按值排序的 Python 字典?

    我有一本字典 比如 a 6 b 1 c 2 我想迭代一下by value 不是通过键 换句话说 b 1 c 2 a 6 最直接的方法是什么 sorted dictionary items key lambda x x 1 对于那些讨厌 la
  • 如何使用 imaplib 获取“消息 ID”

    我尝试获取一个在操作期间不会更改的唯一 ID 我觉得UID不好 所以我认为 Message ID 是正确的 但我不知道如何获取它 我只知道 imap fetch uid XXXX 有人有解决方案吗 来自 IMAP 文档本身 IMAP4消息号
  • Argparse nargs="+" 正在吃位置参数

    这是我的解析器配置的一小部分 parser add argument infile help The file to be imported type argparse FileType r default sys stdin parser
  • 如何创建一个语句来打印以特定单词开头的单词? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何在 python 中打印从特定字母开始的单词 而不使用函数 而是使用方法或循环 1 我有一个字符串 想要打印以 m 开头的单词 S
  • python suds SOAP 请求中的名称空间前缀错误

    我使用 python suds 来实现客户端 并且在发送的 SOAP 标头中得到了错误的命名空间前缀 用于定义由element ref 在 wsdl 中 wsdl 正在引用数据类型 xsd 文件 请参见下文 问题出在函数上GetRecord
  • Python urllib.request.urlopen:AttributeError:'bytes'对象没有属性'data'

    我正在使用 Python 3 并尝试连接到dstk 我收到错误urllib包裹 我对SO进行了很多研究 但找不到与这个问题类似的东西 api url self api base street2coordinates api body jso
  • 如何从Python中的字符串中提取变量名称和值

    我有一根绳子 data var1 id 12345 name John White python中有没有办法将var1提取为python变量 更具体地说 我对字典变量感兴趣 这样我就可以获得变量的值 id和name python 这是由提供
  • Numpy 过滤器平滑零区域

    我有一个 0 及更大整数的 2D numpy 数组 其中值代表区域标签 例如 array 9 9 9 0 0 0 0 1 1 1 9 9 9 9 0 7 1 1 1 1 9 9 9 9 0 2 2 1 1 1 9 9 9 8 0 2 2 1
  • 将 JSON 对象传递给带有请求的 url

    所以 我想利用 Kenneth 的优秀请求模块 https github com kennethreitz requests 在尝试使用时偶然发现了这个问题自由库API http wiki freebase com wiki API 基本上
  • Pandas 根据 diff 列形成簇

    我正在尝试使用 Pandas 根据表示时间 以秒为单位 的列中的差异来消除数据框中的一些接近重复项 例如 import pandas as pd numpy as np df pd DataFrame 1200 1201 1233 1555
  • Tkinter - 浮动窗口 - 调整大小

    灵感来自this https stackoverflow com a 22424245 13629335问题 我想为我的根窗口编写自己的调整大小函数 但我刚刚注意到我的代码显示了一些性能问题 如果你快速调整它的大小 你会发现窗口没有像我希望
  • 迭代 my_dict.keys() 并修改字典中的值是否会使迭代器失效?

    我的例子是这样的 for my key in my dict keys my dict my key mutate 上述代码的行为是否已定义 假设my dict是一本字典并且mutate是一个改变其对象的方法 我担心的是 改变字典中的值可能
  • 当鼠标悬停在上面时,intellisense vscode 不显示参数或文档

    我正在尝试将整个工作流程从 Eclipse 和 Jupyter Notebook 迁移到 VS Code 我安装了 python 扩展 它应该带有 Intellisense 但它只是部分更糟糕 我在输入句点后收到建议 但当将鼠标悬停在其上方
  • 您可以将操作直接应用于map/reduce/filter 中的参数吗?

    map and filter通常可以与列表理解互换 但是reduce并不那么容易被交换map and filter 此外 在某些情况下我仍然更喜欢函数语法 但是 当您需要对参数本身进行操作时 我发现自己正在经历语法体操 最终必须编写整个函数
  • 限制 django 应用程序模型中的单个记录?

    我想使用模型来保存 django 应用程序的系统设置 因此 我想限制该模型 使其只能有一条记录 极限怎么办 尝试这个 class MyModel models Model onefield models CharField The fiel
  • 迭代 pandas 数据框的最快方法?

    如何运行数据框并仅返回满足特定条件的行 必须在之前的行和列上测试此条件 例如 1 2 3 4 1 1 1999 4 2 4 5 1 2 1999 5 2 3 3 1 3 1999 5 2 3 8 1 4 1999 6 4 2 6 1 5 1

随机推荐

  • java ssh连接_PuTTY 0.71 发布,开源的 SSH 和 Telnet 客户端

    PuTTY 最新版本 0 71 已发布 PuTTY 是一款集成虚拟终端 系统控制台和网络文件传输为一体的自由开源程序 它支持多种网络协议 包括 SCP SSH Telnet rlogin 和原始的套接字连接 它也可以连接到串行端口 其软件名
  • mysql 外连接总结

    原文 http blog sina com cn s blog 3d48dbb70100hyz4 html 了点时间总结了一下mysql中的内 外连接 转载注明 首先my sql 不支持oracle的 内连接 只连接匹配的行 左外连接 包含
  • 关于智能合约开发的真相

    就像 区块链 AI 和 云 这样的词语一样 智能合约 也是那些得到大量炒作的短语之一 毕竟 没有什么比不通过司法系统而让人们能够相信发生了什么更有意思的了 智能合约的承诺包括 自动 无须信任和公正地执行合约 在合约构建 合约执行和合约执行环
  • 狂神说 Docker笔记

    Docker概述 Docker为什么出现 Docker的思想来自于集装箱 JRE 多个应用 端口冲突 原来都是交叉的 隔离 Docker核心思想 打包装箱 每个箱子是互相隔离的 Docker通过隔离机制 可以将服务器利用到极致 Docker
  • ShardingSphere分库分表2-ShardingJDBC实战

    文章目录 一 ShardingSphere 二 ShardingJDBC实战 1 核心概念 2 测试项目介绍 3 快速实战 4 ShardingJDBC的分片算法 5 ShardingSphere的SQL使用限制 6 分库分表带来的问题 7
  • JAVA四大特征(抽象,封装,继承,多态)

    1 私有属性必须通过一个成员方法去控制和访问私有属性 2 访问控制修饰符 访问级别 访问控制修饰符 同类 同包 子类 不同包 公开 public 受保护 protected 默认 无 私有 private 3 继承 当多个类具有相同的属性
  • Oracle常见错误总结

    最近多次用到Oracle 主要就是导入dmp文件 然后将文件读出来并写进csv文件 在这过程中出现了一系列的问题 每次都几乎让我崩溃 一方面觉得Oracle用起来真麻烦 但是回过头想想 另一方面说明Oracle机制做的好 各种错误都能考虑到
  • MySQL学习笔记--菜鸟开始上路了!

    开篇话 用MySQL有一段时间了 但是发现自己没有系统的对SQL进行过深入学习 从这篇笔记开始对SQL进行系统学习 也希望和我情况一样的伙伴能够一起进步 学习前症状 状态适用 虽然顺利的把数据从库表中取出 但并不清楚它具体是怎样执行的 也不
  • LLVM系列第七章:函数参数Function Arguments

    系列文章目录 LLVM系列第一章 编译LLVM源码 LLVM系列第二章 模块Module LLVM系列第三章 函数Function LLVM系列第四章 逻辑代码块Block LLVM系列第五章 全局变量Global Variable LLV
  • Java 递归方法

    Java 递归方法 1 说明 定义 一个方法体内调用它自己 方法递归是一种隐式的循环 它会重复的执行某段代码 但这种重复执行无须循环控制 递归一定要向着已知的方向递归 否则这种递归就变成了无穷递归 类似于死循环 2 code 举例 publ
  • Redis7之哨兵(九)

    9 1介绍 哨兵巡查监控后台master主机是否故障 如果故障了根据投票数自动将某一个从库转换为新主库 继续对外服务 俗称无人值守运维 作用 监控redis运行状态 包括master和slave 当master down机 能自动将slav
  • VS2019 + Qt5.13 配置

    在安装完VS2019后 再安装Qt5 13选择安装msvc2017模块 再安装qt vsaddin插件 我选的是2 4版本 反正安装最新的也不会错 安装成功后 新建项目 发现问题 Entry Point Not Found 这是因为编译的版
  • python线程池 ThreadPoolExecutor

    python 线程池 ThreadPoolExecutor 实现步骤 代码实现 实现步骤 创建一个最大容纳数量为3的线程池 通过submit提交执行的函数到线程池中 通过done来判断线程是否完成 通过result来获取返回值 代码实现 c
  • VS code “密钥externalConsole已弃用,请改用console“的解决方法

    VS code 密钥 externalConsole 已弃用 请改用 console 的解决方法 原因 externalConsole 是旧版vscode cpp的密钥 决定输出和调试是在内部还是外部 新版vscode密钥已经改为 cons
  • 阿里巴巴Java开发规约插件

    代码规范的重要性 前不久很多公众号都在说因为代码规范性引起的血案 这事吧 我也没有太在意 好像后来证实根本不属实 但是 也说明了一个事情 代码规范真的很重要 附带一下查询的结果 搜索关键字 码农因代码规范 代码规范 真的很重要 很重要 很重
  • 《快速阅读术》优秀读后感范文4000字

    读书是一种很好的学习 学习是为了 学以致用 在寻求 学以致用 的实操的方法时 发现一个关于学习的金字塔模型 这是美国国家训练实验室的一个结论 听讲 阅读 视听和演示为被动学习 内容留存率比较低 不到30 这是为什么读了很多书 99 的内容都
  • pip安装python包时遇到的问题

    在windows 10种使用pip安装greenlet时 遇到下面这样一个错误 通过搜索发现有很多类似的情况发生在安装scrapy twisted等库的时候 看起来时需要一个c 编译器 安装vstudio实在太大了 网上也给出了不少解决方案
  • 什么是软件性能测试

    说到性能测试 想必大家都会有种种困惑 对于性能测试的概念也模糊得很 那么今天就和大家聊一聊什么是性能测试 性能测试其实是通过模拟生产运行的业务压力量和使用场景组合 测试系统的性能是否满足生产性能要求 通俗地说 性能测试就是要在特定的运行条件
  • 中科院分区和JCR分区查询

    本文将讨论中科院分区和JCR分区查询的三种方法 包括可以同时查询的LetPub查询方法 中科院分区的官方查询方法和JCR分区的查询方法 具体内容见正文 附 本所述方法为本人研究总结 在这里以开放交流的心态与大家分享 欢迎留言讨论 通过Let
  • python自动化[poco篇]

    Poco Poco是一款跨平台的自动化测试框架 基于UI控件搜索原理 与基于图像识别的Airtest不同的是 Poco可以使用类似 poco OK click 的方式来获取并操作节点 Poco能帮助我们获取控件的属性信息 操作控件 设置控件