kuto
Advanced tools
| Metadata-Version: 2.1 | ||
| Name: kuto | ||
| Version: 0.0.67 | ||
| Version: 0.0.70 | ||
| Summary: 全平台自动化测试框架 | ||
@@ -5,0 +5,0 @@ Home-page: https://gitee.com/bluepang2021/kuto |
+1
-1
@@ -13,3 +13,3 @@ from allure import * | ||
| __version__ = "0.0.67" | ||
| __version__ = "0.0.70" | ||
| __description__ = "全平台自动化测试框架" |
@@ -175,2 +175,8 @@ import os | ||
| def input(self, text, enter=False): | ||
| logger.info(f"输入文本: {text}") | ||
| self.d.send_keys(text) | ||
| if enter is True: | ||
| self.enter() | ||
| def click(self, x, y): | ||
@@ -177,0 +183,0 @@ logger.info(f"点击坐标: {x}, {y}") |
@@ -33,3 +33,3 @@ import typing | ||
| index: int = None, | ||
| debug: bool = False): | ||
| _debug: bool = False): | ||
| """ | ||
@@ -44,3 +44,3 @@ @param AdrDriver: 安卓驱动,必填 | ||
| @param index: 定位出多个元素时,指定索引,从0开始 | ||
| @param debug: 是否调试 | ||
| @param _debug: 是否调试 | ||
| """ | ||
@@ -68,3 +68,3 @@ self._driver = AdrDriver | ||
| self._xpath = xpath | ||
| self._debug = debug | ||
| self._debug = _debug | ||
| self._image = image | ||
@@ -165,6 +165,7 @@ self._ocr = ocr | ||
| if self._image is not None: | ||
| return ImageElem(self._driver, file=self._image, desc=self._desc).exists(timeout=timeout) | ||
| return ImageElem(self._driver, file=self._image, desc=self._desc, | ||
| debug=self._debug).exists(timeout=timeout) | ||
| elif self._ocr is not None: | ||
| return OCRElem(self._driver, text=self._ocr, pos=self._pos, grade=self._grade, scale=self._driver.d.scale)\ | ||
| .exists(timeout=timeout) | ||
| return OCRElem(self._driver, text=self._ocr, pos=self._pos, | ||
| grade=self._grade, desc=self._desc, debug=self._debug).exists(timeout=timeout) | ||
| else: | ||
@@ -196,6 +197,7 @@ result = False | ||
| if self._image is not None: | ||
| return ImageElem(self._driver, file=self._image, desc=self._desc).click(timeout=timeout) | ||
| return ImageElem(self._driver, file=self._image, desc=self._desc, debug=self._debug)\ | ||
| .click(timeout=timeout) | ||
| elif self._ocr is not None: | ||
| return OCRElem(self._driver, text=self._ocr, pos=self._pos, grade=self._grade, scale=self._driver.d.scale)\ | ||
| .click(timeout=timeout) | ||
| return OCRElem(self._driver, text=self._ocr, pos=self._pos, grade=self._grade, | ||
| desc=self._desc, debug=self._debug).click(timeout=timeout) | ||
| else: | ||
@@ -202,0 +204,0 @@ element = self.find(timeout=timeout, watch=watch) |
+11
-13
@@ -38,15 +38,11 @@ import time | ||
| def exists(self, retry=3, timeout=3): | ||
| def exists(self, timeout=1): | ||
| logger.info(f'图像识别判断: {self._desc} 是否存在') | ||
| time.sleep(3) | ||
| for i in range(retry): | ||
| logger.info(f'第{i + 1}次查找:') | ||
| source_image = self.driver.screenshot(self._desc + f"_第{i+1}次识别") | ||
| res = ImageDiscern(self.target_image, source_image, self._grade, self._gauss_num).get_coordinate() | ||
| logger.debug(res) | ||
| if isinstance(res, tuple): | ||
| return True | ||
| time.sleep(timeout) | ||
| time.sleep(timeout) | ||
| source_image = self.driver.screenshot(self._desc + "_识别中") | ||
| res = ImageDiscern(self.target_image, source_image, self._grade, self._gauss_num).get_coordinate() | ||
| logger.debug(res) | ||
| if isinstance(res, tuple): | ||
| return True | ||
| else: | ||
| self.driver.screenshot(f'图像识别定位失败-{self._desc}') | ||
| return False | ||
@@ -56,4 +52,4 @@ | ||
| logger.info(f'图像识别点击图片: {self._desc}') | ||
| time.sleep(3) | ||
| for i in range(retry): | ||
| time.sleep(timeout) | ||
| logger.info(f'第{i + 1}次查找:') | ||
@@ -70,6 +66,8 @@ source_image = self.driver.screenshot(self._desc) | ||
| file_path = self.driver.screenshot(f'图像识别定位成功-{self._desc}') | ||
| if self._scale is not None: | ||
| _x, _y = x * self._scale, y * self._scale | ||
| draw_red_by_rect(file_path, (int(_x) - 100, int(_y) - 100, 200, 200)) | ||
| draw_red_by_rect(file_path, (int(x) - 100, int(y) - 100, 200, 200)) | ||
| self.driver.click(x, y) | ||
| return | ||
| time.sleep(timeout) | ||
| else: | ||
@@ -76,0 +74,0 @@ self.driver.screenshot(f'图像识别定位失败-{self._desc}') |
+13
-5
@@ -10,2 +10,3 @@ import shutil | ||
| from kuto.ios.common import TideviceUtil, get_connected | ||
| from kuto.utils.common import retry | ||
@@ -125,2 +126,12 @@ | ||
| @retry | ||
| def input(self, text: str, clear=False, enter=False): | ||
| logger.info(f"输入文本: {text}") | ||
| if clear is True: | ||
| self.d.send_keys("") | ||
| self.d.send_keys(text) | ||
| if enter is True: | ||
| self.enter() | ||
| @retry | ||
| def click(self, x, y): | ||
@@ -157,7 +168,3 @@ logger.info(f"点击坐标: {x}, {y}") | ||
| if __name__ == '__main__': | ||
| driver1 = IosDriver( | ||
| device_id="00008101-000E646A3C29003A", | ||
| pkg_name="com.qizhidao.company" | ||
| ) | ||
| driver1.start_app() | ||
| pass | ||
@@ -172,1 +179,2 @@ | ||
+18
-9
@@ -11,2 +11,3 @@ import time | ||
| from kuto.ocr.element import OCRElem | ||
| from kuto.utils.common import retry | ||
@@ -39,3 +40,3 @@ | ||
| index: int = None, | ||
| debug: bool = False): | ||
| _debug: bool = False): | ||
| """ | ||
@@ -51,3 +52,3 @@ param iosDriver, | ||
| param index: 索引 | ||
| @param debug: 是否调试 | ||
| @param _debug: 是否调试 | ||
| """ | ||
@@ -81,3 +82,3 @@ self._driver = iosDriver | ||
| self._xpath = xpath | ||
| self._debug = debug | ||
| self._debug = _debug | ||
| self._image = image | ||
@@ -204,6 +205,7 @@ self._ocr = ocr | ||
| if self._image is not None: | ||
| return ImageElem(self._driver, file=self._image, desc=self._desc).exists(timeout=timeout) | ||
| return ImageElem(self._driver, file=self._image, desc=self._desc, scale=self._driver.d.scale, | ||
| debug=self._debug).exists(timeout=timeout) | ||
| elif self._ocr is not None: | ||
| return OCRElem(self._driver, text=self._ocr, pos=self._pos, grade=self._grade, scale=self._driver.d.scale)\ | ||
| .exists(timeout=timeout) | ||
| return OCRElem(self._driver, text=self._ocr, pos=self._pos, grade=self._grade, | ||
| scale=self._driver.d.scale, desc=self._desc, debug=self._debug).exists(timeout=timeout) | ||
| else: | ||
@@ -232,2 +234,3 @@ result = False | ||
| @retry | ||
| def click(self, timeout=5, watch=None): | ||
@@ -241,6 +244,7 @@ """ | ||
| if self._image is not None: | ||
| ImageElem(self._driver, file=self._image, desc=self._desc).click(timeout=timeout) | ||
| ImageElem(self._driver, file=self._image, desc=self._desc, scale=self._driver.d.scale, | ||
| debug=self._debug).click(timeout=timeout) | ||
| elif self._ocr is not None: | ||
| OCRElem(self._driver, text=self._ocr, pos=self._pos, grade=self._grade, scale=self._driver.d.scale)\ | ||
| .click(timeout=timeout) | ||
| OCRElem(self._driver, text=self._ocr, pos=self._pos, grade=self._grade, scale=self._driver.d.scale, | ||
| desc=self._desc, debug=self._debug).click(timeout=timeout) | ||
| else: | ||
@@ -252,2 +256,3 @@ x, y = self._adapt_center(timeout=timeout, watch=watch) | ||
| @retry | ||
| def click_exists(self, timeout=3): | ||
@@ -263,2 +268,3 @@ logger.info(f"{self._desc} 存在才点击") | ||
| @retry | ||
| def input(self, text, enter=False): | ||
@@ -271,2 +277,3 @@ """输入内容""" | ||
| @retry | ||
| def input_exists(self, text: str, timeout=3, enter=False): | ||
@@ -280,2 +287,3 @@ logger.info(f"{self._desc} 存在才输入: {text}") | ||
| @retry | ||
| def assert_exists(self, timeout=3): | ||
@@ -286,2 +294,3 @@ logger.info(f"断言 {self._desc} 存在") | ||
| @retry | ||
| def assert_text(self, text, timeout=3): | ||
@@ -288,0 +297,0 @@ logger.info(f"断言 {self._desc} 文本属性包括: {text}") |
@@ -20,3 +20,3 @@ """ | ||
| desc: str = None, | ||
| debug: bool = False): | ||
| _debug: bool = False): | ||
| self.driver = driver | ||
@@ -28,3 +28,3 @@ if not desc: | ||
| self._coor = coor | ||
| self._debug = debug | ||
| self._debug = _debug | ||
@@ -65,3 +65,3 @@ def __get__(self, instance, owner): | ||
| desc: str = None, | ||
| debug: bool = False): | ||
| _debug: bool = False): | ||
| self.driver = driver | ||
@@ -73,3 +73,3 @@ if not desc: | ||
| self.target_image = image | ||
| self._debug = debug | ||
| self._debug = _debug | ||
@@ -76,0 +76,0 @@ def __get__(self, instance, owner): |
+20
-6
| import time | ||
| from kuto.utils.exceptions import KError | ||
| from kuto.utils.log import logger | ||
@@ -33,2 +34,3 @@ from kuto.ocr.driver import OCRDiscern | ||
| scale: int = None, | ||
| desc: str = None, | ||
| debug: bool = False): | ||
@@ -50,2 +52,5 @@ """ | ||
| self._scale = scale | ||
| self._desc = desc | ||
| if self._desc is None: | ||
| raise KError("元素描述不能为空") | ||
@@ -62,4 +67,5 @@ def __get__(self, instance, owner): | ||
| for i in range(retry): | ||
| time.sleep(timeout) | ||
| logger.info(f"第{i+1}次识别") | ||
| info = self.driver.screenshot(self.text + f"_第{i+1}次识别", | ||
| info = self.driver.screenshot(self._desc + f"_第{i+1}次识别", | ||
| position=self._position) | ||
@@ -101,9 +107,11 @@ if self._position is not None: | ||
| if self._debug is True: | ||
| file_path = self.driver.screenshot(f'ocr识别定位成功-{self.text}') | ||
| file_path = self.driver.screenshot(f'ocr识别定位成功-{self._desc}') | ||
| if self._scale is not None: | ||
| _x, _y = x * self._scale, y * self._scale | ||
| draw_red_by_rect(file_path, (int(_x) - 100, int(_y) - 100, 200, 200)) | ||
| draw_red_by_rect(file_path, (int(x) - 100, int(y) - 100, 200, 200)) | ||
| return x, y | ||
| time.sleep(timeout) | ||
| else: | ||
| self.driver.screenshot(f'ocr识别定位失败-{self.text}') | ||
| self.driver.screenshot(f'ocr识别定位失败-{self._desc}') | ||
| raise Exception('通过OCR未识别指定文字或置信度过低,无法进行点击操作!') | ||
@@ -113,5 +121,11 @@ | ||
| logger.info(f'ocr识别文本: {self.text} 是否存在') | ||
| return self.find_element(timeout=timeout) | ||
| try: | ||
| self.find_element(timeout=timeout) | ||
| except Exception as e: | ||
| logger.debug(str(e)) | ||
| return False | ||
| else: | ||
| return True | ||
| def click(self, retry=3, timeout=1): | ||
| def click(self, retry=3, timeout=3): | ||
| logger.info(f'ocr点击文本: {self.text}') | ||
@@ -118,0 +132,0 @@ x, y = self.find_element(retry=retry, timeout=timeout) |
+25
-0
@@ -232,2 +232,27 @@ """ | ||
| def retry(func): | ||
| @functools.wraps(func) | ||
| def wrapper(*args, **kwargs): | ||
| count = 0 | ||
| ret = None | ||
| while count < 5: | ||
| if count > 1: | ||
| logger.info(f"操作失败,第{count}次重试.") | ||
| try: | ||
| ret = func(*args, **kwargs) | ||
| except Exception as e: | ||
| logger.debug(str(e)) | ||
| time.sleep(3) | ||
| count += 1 | ||
| continue | ||
| else: | ||
| break | ||
| else: | ||
| logger.info("重试5次仍然失败.") | ||
| return ret | ||
| return wrapper | ||
| if __name__ == '__main__': | ||
@@ -234,0 +259,0 @@ print(get_free_port()) |
@@ -28,3 +28,3 @@ """ | ||
| index: int = None, | ||
| debug: bool = False): | ||
| _debug: bool = False): | ||
| """ | ||
@@ -38,3 +38,3 @@ | ||
| @param holder: 输入框默认文案 | ||
| @param debug: 是否调试 | ||
| @param _debug: 是否调试 | ||
| """ | ||
@@ -51,3 +51,3 @@ self._driver = driver | ||
| self._index = index | ||
| self._debug = debug | ||
| self._debug = _debug | ||
@@ -54,0 +54,0 @@ self._kwargs = {} |
@@ -20,3 +20,3 @@ """ | ||
| desc: str = None, | ||
| debug: bool = False): | ||
| _debug: bool = False): | ||
| self.driver = driver | ||
@@ -28,3 +28,3 @@ if not desc: | ||
| self.target_image = image | ||
| self._debug = debug | ||
| self._debug = _debug | ||
@@ -31,0 +31,0 @@ def __get__(self, instance, owner): |
+1
-1
| Metadata-Version: 2.1 | ||
| Name: kuto | ||
| Version: 0.0.67 | ||
| Version: 0.0.70 | ||
| Summary: 全平台自动化测试框架 | ||
@@ -5,0 +5,0 @@ Home-page: https://gitee.com/bluepang2021/kuto |
Alert delta unavailable
Currently unable to show alert delta for PyPI packages.
225181
0.85%5424
1.02%