加入收藏 | 设为首页 | 会员中心 | 我要投稿 江门站长网 (https://www.0750zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 安全 > 正文

使用swipe方法模拟屏幕滑动与手势密码绘制

发布时间:2020-03-18 04:33:05 所属栏目:安全 来源:站长网
导读:副标题#e# App自动化测试中有两个很重要的操作,屏幕滑动与绘制手势密码。目前很多App在启动时,都存在启动时的引导动画或者加载上下文内容时需要手动上滑或者下滑加载页面,所以在自动化测试的过程中模拟手的滑动操作看起来就很重要了;第二个比较重要的是

def gesture_password(self, element: WebElement, *pwd): # pwd是个元组,pwd[0]表示第一个密码 """手势密码: 直接输入需要链接的点对应的数字,最多9位 pwd: 传你想连接的点构成的密码,如:1, 2, 3, 6, 9 """ if len(pwd) > 9: raise ValueError("需要设置的密码不能超过9位!") keys_dict = self.get_password_location(element) # 9个点的坐标组成的字典 start_point = "TouchAction(self.driver).press(x={0}, y={1}).wait(200)". # keys_dict[pwd[0]] 得到第一位密码数字对应的坐标的字典 format(keys_dict[pwd[0]]["x"], keys_dict[pwd[0]]["y"]) # 起始点的坐标 for index in range(len(pwd)-1): # 0,1,2,3 follow_point = ".move_to(x={0}, y={1}).wait(200)". format(keys_dict[pwd[index+1]]["x"] - keys_dict[pwd[index]]["x"], keys_dict[pwd[index+1]]["y"] - keys_dict[pwd[index]]["y"]) # 后续的点坐标 start_point = start_point + follow_point # 把起始点的表达式和后续链接的点表达式链接在一起组成一个模拟连线的完整过程 full_point = start_point + ".release().perform()" # 完整的过程通过.release().perform()使其生效 return eval(full_point) # 执行一串表达式

比较难理解的地方,我已经详细注释了,当然,你可以复制我的代码先验证能否绘制成功再分析代码的实现原理

所有代码

修改后的绘制手势密码代码&滑屏代码

""" ------------------------------------ @Time : 2019/8/6 20:45 @Auth : linux超 @File : base.py @IDE : PyCharm @Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error! @QQ : 28174043@qq.com @GROUP: 878565760 ------------------------------------ """ import time from appium.webdriver import WebElement from appium.webdriver.common.touch_action import TouchAction from appium.webdriver.webdriver import WebDriver from selenium.webdriver.support.wait import WebDriverWait from selenium.common.exceptions import NoSuchElementException, TimeoutException class Base(object): def __init__(self, driver: WebDriver): self.driver = driver @property def get_phone_size(self): """获取屏幕的大小""" width = self.driver.get_window_size()['width'] height = self.driver.get_window_size()['height'] return width, height def swipe_left(self, duration=300): """左滑""" width, height = self.get_phone_size start = width * 0.9, height * 0.5 end = width * 0.1, height * 0.5 return self.driver.swipe(*start, *end, duration) def swipe_right(self, duration=300): """右滑""" width, height = self.get_phone_size start = width * 0.1, height * 0.5 end = width * 0.9, height * 0.5 return self.driver.swipe(*start, *end, duration) def swipe_up(self, duration): """上滑""" width, height = self.get_phone_size start = width * 0.5, height * 0.9 end = width * 0.5, height * 0.1 return self.driver.swipe(*start, *end, duration) def swipe_down(self, duration): """下滑""" width, height = self.get_phone_size start = width * 0.5, height * 0.1 end = width * 0.5, height * 0.9 return self.driver.swipe(*start, *end, duration) def skip_welcome_page(self, direction, num=3): """ 滑动页面跳过引导动画 :param direction: str 滑动方向,left, right, up, down :param num: 滑动次数 :return: """ direction_dic = { "left": "swipe_left", "right": "swipe_right", "up": "swipe_up", "down": "swipe_down" } time.sleep(3) if hasattr(self, direction_dic[direction]): for _ in range(num): getattr(self, direction_dic[direction])() # 使用反射执行不同的滑动方法 else: raise ValueError("参数{}不存在, direction可以为{}任意一个字符串". format(direction, direction_dic.keys())) @staticmethod def get_element_size_location(element): width = element.rect["width"] height = element.rect["height"] start_x = element.rect["x"] start_y = element.rect["y"] return width, height, start_x, start_y def get_password_location(self, element: WebElement) -> dict: width, height, start_x, start_y = self.get_element_size_location(element) point_1 = {"x": int(start_x + width * (1 / 6) * 1), "y": int(start_y + height * (1 / 6) * 1)} point_2 = {"x": int(start_x + width * (1 / 6) * 3), "y": int(start_y + height * (1 / 6) * 1)} point_3 = {"x": int(start_x + width * (1 / 6) * 5), "y": int(start_y + height * (1 / 6) * 1)} point_4 = {"x": int(start_x + width * (1 / 6) * 1), "y": int(start_y + height * (1 / 6) * 3)} point_5 = {"x": int(start_x + width * (1 / 6) * 3), "y": int(start_y + height * (1 / 6) * 3)} point_6 = {"x": int(start_x + width * (1 / 6) * 5), "y": int(start_y + height * (1 / 6) * 3)} point_7 = {"x": int(start_x + width * (1 / 6) * 1), "y": int(start_y + height * (1 / 6) * 5)} point_8 = {"x": int(start_x + width * (1 / 6) * 3), "y": int(start_y + height * (1 / 6) * 5)} point_9 = {"x": int(start_x + width * (1 / 6) * 5), "y": int(start_y + height * (1 / 6) * 5)} keys = { 1: point_1, 2: point_2, 3: point_3, 4: point_4, 5: point_5, 6: point_6, 7: point_7, 8: point_8, 9: point_9 } return keys def gesture_password(self, element: WebElement, *pwd): """手势密码: 直接输入需要链接的点对应的数字,最多9位 pwd: 1, 2, 3, 6, 9 """ if len(pwd) > 9: raise ValueError("需要设置的密码不能超过9位!") keys_dict = self.get_password_location(element) start_point = "TouchAction(self.driver).press(x={0}, y={1}).wait(200)". format(keys_dict[pwd[0]]["x"], keys_dict[pwd[0]]["y"]) for index in range(len(pwd) - 1): # 0,1,2,3 follow_point = ".move_to(x={0}, y={1}).wait(200)". format(keys_dict[pwd[index + 1]]["x"] - keys_dict[pwd[index]]["x"], keys_dict[pwd[index + 1]]["y"] - keys_dict[pwd[index]]["y"]) start_point = start_point + follow_point full_point = start_point + ".release().perform()" return eval(full_point) def find_element(self, locator: tuple, timeout=30) -> WebElement: wait = WebDriverWait(self.driver, timeout) try: element = wait.until(lambda driver: driver.find_element(*locator)) return element except (NoSuchElementException, TimeoutException): print('no found element {} by {}', format(locator[1], locator[0])) if __name__ == '__main__': pass

(编辑:江门站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!