首页 > 其他分享 >Poco框架实操:对节点可实施的操作

Poco框架实操:对节点可实施的操作

时间:2024-05-23 10:29:52浏览次数:21  
标签:Poco text 节点 poco netease 实操 com click

此文章来源于项目官方公众号:“AirtestProject”
版权声明:允许转载,但转载必须保留原链接;请勿用作商业或者非法用途

一、前言

之前我们介绍了Poco的节点关系,以及获取节点属性的一些方法,具体详情可以点击查看我们历史推文~今天我们就来看看我们对Poco节点还能进行什么操作吧!

二、Poco节点操作详解

2.1 修改文本类属性值:setattr(typename, val)

在日常测试中,有些文本类属性需要修改的时候,可以使用setattr(typename, val)这个方法,通过输入属性名以及需要修改进去的内容即可。但是需要注意的是,很多属性如:namepos等等是不推荐修改的,尤其是editalbe为**False**的节点,不建议修改该节点的所有属性,它们的修改可能会导致出现意外和误报错误。

使用的方式如下:

poco("com.sonyericsson.conversations:id/conversation_edit_text").setattr("text","我要发短信")

2.2 输入文字:set_text()

在日常输入的时候,我们可以使用set_text()这个方法,但是在使用set_text()之前,需要先执行一遍click点击操作,激活文本框后,再执行输入操作。

使用方法如下:

poco("com.sonyericsson.conversations:id/conversation_edit_text").click()
poco("com.sonyericsson.conversations:id/conversation_edit_text").set_text("我要发短信")

如果在使用set_text()无法输入,或出现相关报错的话,可以更换使用Airtest的text()方法去进行输入即可。

poco("com.sonyericsson.conversations:id/conversation_edit_text").click()
text("我要发短信")

2.3 设置节点焦点:focus(f)

跟Airtest的图片一样,在Poco节点也有一定的操作点范围,且focus 所使用的是局部归一化坐标系,因此同样是UI框的左上角为原点,x轴向右,y轴向下,并且UI框长宽最大坐标均为1。所以一般节点默认的操作点坐标为[0.5, 0.5] 。

在日常使用过程中,使用比较多的场景有以下几种情况:

2.3.1 内部偏移

如果需要对节点的UI框内的其他点进行操作的话,则需要利用focus重新自定义一个操作点,也就是设置内部偏移量,调用这个方法将返回已设置了新操作点的Poco节点,重复调用则以最后一次所调用的为准。

# 内部偏移
poco(texture="icon").focus([0.1,0.8]).long_click()

2.3.2 外部偏移

如果是需要对节点的UI框外的其他点进行操作的话,也可以通过focus去指定UI框外的偏移量,并且是会出现偏移量小于0或者大于1 的情况,但是要注意的是,在考虑外部偏移量的同时,也要注意该偏移量坐标是否会超出屏幕范围,否则会出现该报错:InvalidOperationException('Click position out of screen

# 外部偏移
poco(text="pearl").focus([0.5,-3]).long_click()

更多关于focus的内容可以查看PocoAPI文档以及官方教程文档的对应内容:

https://poco-chinese.readthedocs.io/en/latest/source/poco.proxy.html#poco.proxy.UIObjectProxy.focus

https://airtest.doc.io.netease.com/IDEdocs/poco_framework/4_poco_API/#7

2.4 拖拽:drag_to(target, duration=2.0)

说到拖动,大家第一反应应该是swipe(),但是swipe()是单纯的从其中一个坐标,滑动到另一个坐标,但是drag_to()是完全不同的,首先拖动的是节点而不是普通的一个坐标点,其次,拖动的终点是可以是另一个节点、同一个节点的不同UI位置、或者是某个坐标点。

括号内所需要传输的变量为target:拖拽的终点(可以为节点,也可以为归一化坐标); duration=2.0:默认拖拽的持续时间为2秒。

归一化坐标参考下图,以屏幕的左上角为原点建立坐标轴,x轴向右,y轴向下,坐标最大为1,更多详情可查看我们的教程文档:https://airtest.doc.io.netease.com/IDEdocs/poco_framework/2_API_word/#2-poco_1

使用方法如下:

poco('star').drag_to(poco('shell'))
poco("音乐").drag_to([0.5,0.5])

2.5 长按:long_click(duration = 2.0)

click类似,long_click()是对节点进行长按操作,可以传入长按的持续时间参数duration,默认为2秒。

poco("音乐").long_click()

但如果想对某个坐标点进行长按操作的话,可以选择poco.pocofw module下的long_click(pos, duration=2.0),我们需要传入设备屏幕归一化坐标 pos 以及 长按的持续时间参数 duration 即可。

poco.long_click((0.5,0.5), duration=2.0)

2.6 双击:double_click(x, y)

双击操作在poco 1.0.92 及以上版本均能使用,可以在括号内输入双击的偏移点坐标,不填写默认为双击节点的anchorPoint,如下:

poco("音乐").double_click([0.2,0.8])

三、实操小案例

看完上述的操作详情后,让我们用一个小小的案例来看看上述操作在实际操作中的具体效果吧~

参考代码如下:

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

from airtest.core.api import *

auto_setup(__file__)

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

#打开网易云音乐
start_app("com.netease.cloudmusic")
sleep(2.0)
poco("com.netease.cloudmusic:id/skipBtn").click()

#点击进入搜索界面
poco("com.netease.cloudmusic:id/iconSearch").click()
sleep(1.0)

#【使用setattr】输入“汪苏泷”
poco("com.netease.cloudmusic:id/search_src_text").setattr("text","汪苏泷")
sleep(1.0)

#点击搜索按钮,进行搜索
poco("com.netease.cloudmusic:id/toSearch").click()
sleep(1.0)

#点击播放全部歌曲
poco("com.netease.cloudmusic:id/actionView").click()
sleep(1.0)

#【使用double_click】双击喜欢歌曲
poco("com.netease.cloudmusic:id/smallAlbumDisc0").double_click()

#退出歌曲播放详情界面
poco("转到上一层级").click()
sleep(1.0)

#【使用focus、drag_to】分别进行节点UI定位以及进行拖拽换歌
poco("com.netease.cloudmusic:id/tv_music").focus([0.8,0.3]).drag_to(poco("com.netease.cloudmusic:id/tv_music").focus([0.2,0.3]),duration = 1.0)
sleep(1.0)

#【使用long_click】长按复制歌曲名
poco(text="此生不换 (Live版)").long_click()

poco("com.netease.cloudmusic:id/copyBtn").click()

#点击上方搜索框
poco("com.netease.cloudmusic:id/search_close_btn").click()

#【使用set_text】将剪切板的内容粘贴在搜索框内
poco("com.netease.cloudmusic:id/search_src_text").set_text(get_clipboard())

#点击搜索
poco("com.netease.cloudmusic:id/toSearch").click()

四、小结

我们今天分享了一些对Poco节点比较常用的操作方法,其中包括:

  1. 修改文本类属性值:setattr(typename, val)
  2. 输入文字:set_text()
  3. 设置节点焦点:focus(f)
  4. 拖拽:drag_to(target, duration=2.0)
  5. 长按:long_click(duration = 2.0)
  6. 双击:double_click(x, y)

通过这些方法,我们可以更好地编写Poco的自动化脚本,也可以将操作更简单化。如果同学们在使用Poco进行自动化测试的过程中,遇到了问题,或者有任何想要深入了解的知识点,欢迎在官方交流群里告诉我们或者提交issue,也欢迎大家投稿。


AirtestIDE下载:airtest.netease.com/
Airtest 教程官网:airtest.doc.io.netease.com/
搭建企业私有云服务:airlab.163.com/b2b

官方答疑 Q 群:526033840

标签:Poco,text,节点,poco,netease,实操,com,click
From: https://www.cnblogs.com/AirtestProject/p/18207823

相关文章

  • 文件系统-1-相关节点和命令
    1./proc/partitions/#cat/proc/partitionsmajorminor#blocksname108192ram0...1158192ram15254010485760vda...25430498304vdt25306291456zram02520529875......
  • d3 v7树图实现动态边框,新增/编辑兄弟节点、子节点,删除节点和拖拽、缩放,动态边框
    d3版本:v7。PS:在用d3之前需要先了解SVG和CSS相关知识。树图生成部分和部分效果都是用SVG相关标签完成的。 效果图:  全部代码:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=devi......
  • K8S多master节点更换证书
    以下命令master节点均需要执行1.备份cp-a/etc/kubernetes{,.bak}cp-a/var/lib/kubelet{,.bak}cp-a/var/lib/etcd/var/lib/etcd.bak2.生成kubeadm-configkubectl-nkube-systemgetcmkubeadm-config-oyaml>kubeadm-config-20240521.yaml3.刷新证书到期时间再......
  • rancher添加k8s节点时显示节点已添加
    由于几台服务器都用相同的外部externalip,而添加k8s节点时有外部ip先使用外部ip,所以会显示节点已添加,无法添加成功,此时需要用--address参数来指定内部ip,这样节点就由内部ip来添加如下添加k8s节点的命令:sudodockerrun-d--privileged--restart=unless-stopped--net=ho......
  • 创建hello_world节点、编译、运行
    1、在功能包的src目录下创建源文件cd hello_world_ws/src/hello_world_pkg/srctouch hello_world.cpp#include"rclcpp/rclcpp.hpp"intmain(intargc,char**argv){  rclcpp::init(argc,argv);  autonode=std::make_shared<rclcpp::Node>("hello_w......
  • 自动化部署elasticsearch三节点集群
    什么是Elasticsearch?Elasticsearch是一个开源的分布式搜索和分析引擎,构建在ApacheLucene的基础上。它提供了一个分布式多租户的全文搜索引擎,具有实时分析功能。Elasticsearch最初是用于构建全文搜索引擎,但它的功能已经扩展到包括日志分析、应用程序性能监控、地理信息系统等......
  • kingbase数据json操作:表转json、json转表、节点查询、节点添加
    1、json_array_elements(json)这个函数将JSON数组转换为行集合。例如:SELECTjson_array_elements('[1,2,3]')ASelement;将返回一个包含每个数组元素的行。2、json_each(json)这个函数将JSON对象展开为(key,value)对。例如:SELECT*FROMjson_each('{"a":1,"b":2}');......
  • 图神经网络入门示例:使用PyTorch Geometric 进行节点分类
    基于图的神经网络是强大的模型,可以学习网络中的复杂模式。在本文中,我们将介绍如何为同构图数据构造PyTorchData对象,然后训练不同类型的神经网络来预测节点所属的类。这种类型的预测问题通常被称为节点分类。我们将使用来自BenedekRozemberczki,CarlAllen和RikSarkar于2019......
  • 使用joinjs绘制流程图(十)-实战-绘制流程图+自定义节点样式(优化)
    问题前面自定义节点的样式坐标位置不对,我们希望自定义节点的坐标和rect元素的位置是一样的效果图代码<template><divclass="app"><divref="myholder"id="paper"></div></div></template><script>import*asjointfrom&......
  • 源服务器开启gzip,CDN上没开启,CDN节点请求是以gzip大小算还是按原来的大小算
    今天学到一个知识:当源服务器开启了gzip压缩,而CDN上没有开启gzip时,CDN节点请求的流量计算通常是基于未压缩的原始文件大小来计算的。这是因为CDN通常是根据其接收到的内容来计算流量,而不会主动去解压缩已压缩的内容来计算。具体来说,当CDN节点从源服务器获取内容时,如果源服务器返......