python利用appium画一个圆

2021-08-31  本文已影响0人  崔某

今天突发奇想: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次的的画图结果:

Tab_20210830185548.png

完整代码:

# -*- 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)
上一篇下一篇

猜你喜欢

热点阅读