美文网首页
python利用appium画一个圆

python利用appium画一个圆

作者: 崔某 | 来源:发表于2021-08-31 14:04 被阅读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)
    

    相关文章

      网友评论

          本文标题:python利用appium画一个圆

          本文链接:https://www.haomeiwen.com/subject/aapoiltx.html