今天突发奇想:Appium的TouchAction类既然可以滑动手机屏幕,能不能画一个圆呢?
首先我们确认几个要素:
- 圆心
- 半径
- 圆弧的坐标点
圆心:我们可以取屏幕的高度和宽度,然后乘以1/2就是我们屏幕的中心点坐标了。示例:
# 获取屏幕宽度
self.window_width = self.driver.get_window_size()['width']
# 获取屏幕高度
self.window_height = self.driver.get_window_size()['height']
# 圆心
circle_center_point = (self.window_width / 2, self.window_height / 2)
半径:半径就需要我们自定义了,也就决定了圆的大小
圆弧的坐标点: 这里我们假设每次转动10°,转一圈则需要36次,如下打印36个圆上坐标点。(我们每次转动的度数越小,转一圈次数越多,则圆越接近完美圆)
for i in range(36):
hudu = (2 * math.pi / 360) * 10 * i
x = format(circle_center_point[0] + math.sin(hudu) * r, ".1f")
y = format(circle_center_point[1] - math.cos(hudu) * r, ".1f")
print(x, y)
如下图,是我滑动36次的的画图结果:
完整代码:
# -*- coding: utf-8 -*-
# @Time : 2021/8/30 16:57
# @File : Circle.py
import math
from time import sleep
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction
from selenium.common.exceptions import NoSuchElementException
class Circle(object):
def __init__(self, android_version, package_name, activity_name):
"""
:param android_version: 安卓版本
:param package_name: 启动包名
:param activity_name: 启动Activity名
"""
desired_caps = {
'platformName': 'Android', # 平台名称
'deviceName': 'test', # 设备名称(任写)
'platformVersion': android_version, # 安卓版本
'appPackage': package_name, # 启动包名
'appActivity': activity_name, # 启动 Acclivity
'noReset': True, # 重置(不会保留之前的启动数据)
'newCommandTimeout': 60000 # 超时时间(一分钟)
}
if android_version == "11":
# Android 11 添加此参数
desired_caps["automationName"] = "uiautomator2"
# 开始初始化
print("Appium 正在初始化...")
# 启动服务/通过4723端口来建立一个会话
self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
# 隐式等待15s
self.driver.implicitly_wait(15)
# 获取屏幕宽度
self.window_width = self.driver.get_window_size()['width']
# 获取屏幕高度
self.window_height = self.driver.get_window_size()['height']
print("Appium 初始化完成...")
def find_element(self, way, value):
"""
:param way: 定位方式
:param value: 值
:return: 返回元素
"""
try:
if way == "text":
# return self.driver.find_element_by_name(value) 已经凉了
return self.driver.find_element_by_android_uiautomator('new UiSelector().text("%s")' % value)
elif way == "id":
return self.driver.find_element_by_id(value)
elif way == "desc":
return self.driver.find_element_by_accessibility_id(value)
# xpath参数示例://*[@text="xxx"]
elif way == "xpath":
return self.driver.find_element_by_xpath(value)
else:
raise TypeError(f"无此定位元素方式:{way},定位方式支持:text/id/desc/xpath")
except NoSuchElementException:
raise
def circle(self):
# 圆心
circle_center_point = (self.window_width / 2, self.window_height / 2)
# 半径
r = 300
# 存储所有坐标点
point_list = []
# 这里我们每次转动10°,转一圈则需要36次
for i in range(36):
hudu = (2 * math.pi / 360) * 10 * i
x = format(circle_center_point[0] + math.sin(hudu) * r, ".1f")
y = format(circle_center_point[1] - math.cos(hudu) * r, ".1f")
point_list.append((x, y))
print(point_list)
return point_list
# 画圆
def test_swipe(self, list, i=0):
# 获取actions
actions = TouchAction(self.driver)
actions.press(x=list[i][0], y=list[i][1]).move_to(x=list[i + 1][0], y=list[i + 1][1]).wait(100).perform()
i = i + 1
if i == len(list)-1:
# 最后一个点连接起点
actions.press(x=list[len(list)-1][0], y=list[len(list)-1][1]).move_to(x=list[0][0], y=list[0][1]).wait(100).perform()
return
self.test_swipe(list, i)
if __name__ == '__main__':
circle = Circle("11", "com.android.settings", "com.android.settings.Settings")
circle.driver.keyevent(3)
# 打开画图软件
circle.find_element("text", "白板").click()
sleep(5)
# 拿到所有点
point_list = circle.circle()
circle.test_swipe(point_list)
网友评论