def open_notification(self, ): """ 打开菜单栏 :return: """ logger.warning('此函数只支持安卓系统!') self.dri.open_notifications()
def ios_predicate(self, locate, el=None): """ 更具表达式 查询页面元素 此方法 只能 iso 可用 :param locate: expression 表达式 如 :new UiSelector().text("显示") :param el: 单个/多个 默认 find_element=None 单个 / 如果 find_element = 's' 代表多个 :return: str drive对象 """ try: logger.warning('此定位方法只ios系统!!!') if el is not None: # ios_predicate = self.driver.find_elements_by_ios_predicate(locate) ios_predicate = WebDriverWait( self.driver, timeout=IMPLICITLY_WAIT_TIME, poll_frequency=POLL_FREQUENCY).until( lambda x: x.find_elements_by_ios_predicate(locate) ) # 在显示登陆时间内查询元素 else: # ios_predicate = self.driver.find_element_by_ios_predicate(locate) ios_predicate = WebDriverWait( self.driver, timeout=IMPLICITLY_WAIT_TIME, poll_frequency=POLL_FREQUENCY).until( lambda x: x.find_element_by_ios_predicate(locate)) return ios_predicate except Exception as e: logger.error( f'元素在显示等待时间 {IMPLICITLY_WAIT_TIME} 未出现!请检查元素是否存在!! {e}')
def android_uiautomator(self, locate, el=None): """ 更具表达式 查询页面元素 此方法 只能安卓可用 :param locate: expression 表达式 如 :new UiSelector().text("显示") :param el: 单个/多个 默认 find_element=None 单个 / 如果 find_element = 's' 代表多个 :return: str drive对象 """ try: logger.warning('此定位方法只android系统!!!') if el is not None: # 多个定位 # android_uiautomator_driver = self.driver.find_elements_by_android_uiautomator(locate) android_uiautomator_driver = WebDriverWait( self.driver, timeout=IMPLICITLY_WAIT_TIME, poll_frequency=POLL_FREQUENCY).until( lambda x: x.find_elements_by_android_uiautomator(locate )) else: # 单个定位 # android_uiautomator_driver = self.driver.find_element_by_android_uiautomator(locate) android_uiautomator_driver = WebDriverWait( self.driver, timeout=IMPLICITLY_WAIT_TIME, poll_frequency=POLL_FREQUENCY).until( lambda x: x.find_element_by_android_uiautomator(locate )) return android_uiautomator_driver except Exception as e: logger.error(f'元素在显示等待时间 {IMPLICITLY_WAIT_TIME} 未出现!请检查元素是否存在!!')
def uesd_keyevent(self, code): """ 发送 keyevent 操作 * 可以百度搜索 keyevent键列表 :param code: keyevent码 :return: """ logger.warning('此函数只支持安卓系统!') self.dri.keyevent(code)
def background_apps(self, s): """ 把 app 放到后台 :param s: 放置几秒 :return: """ logger.warning('此函数只支持安卓系统!') self.dri.background_app(s)
def reduce_volume(self, frequency=1): """ 减小声音 :param frequency: 减小次数 默认一次 :return: """ logger.warning('此函数只支持安卓系统!') for i in range(0, frequency): self.dri.keyevent(25)
def add_volume(self, frequency=1): """ 增加声音 ** 可以搜索 keyevent 查询具体参数 :param frequency: 增加次数 默认一次 :return: """ logger.warning('此函数只支持安卓系统!') for i in range(0, frequency): self.dri.keyevent(24)
def used_clear(self, types, locate, el=None, index=None): """ 清除输入框 :param types: 定位类型 :param locator: 定位元素 :param el: 单个/多个 默认 find_element=None 单个 / 如果 find_element = 's' 多个 :param index: 列表索引位置 find_element传递时 此值必填 """ if el is not None and index is not None: self.used_operate(types=types, locate=locate, el=el)[index].clear() else: self.used_operate(types=types, locate=locate).clear() logger.warning('此定位方法只android系统!!!')
def ios_predicate_clear(self, locate, el=None, index=None): """ 更具表达式 查询页面元素 并且清除输入文本 此方法 只能 iso 可用 :param locate: expression 表达式 如 :new UiSelector().text("显示") :param el: 单个/多个 默认 find_element=None 单个 / 如果 find_element = 's' 代表多个 :param index: 列表索引位置 find_element传递时 此值必填 :return: str drive对象 """ logger.warning('此定位方法只ios系统!!!') if el is not None and index is not None: self.ios_predicate(locate=locate, el=el)[index].clear() else: self.ios_predicate(locate=locate, el=el).clear()
def android_uiautomator_clear(self, locate, el=None, index=None): """ 更具表达式 查询页面元素 并 清除操作 此方法 只能安卓可用 :param locate: expression 表达式 如 :new UiSelector().text("显示") :param el: 单个/多个 默认 find_element=None 单个 / 如果 find_element = 's' 代表多个 :param index: 列表索引位置 find_element传递时 此值必填 :return: str drive对象 """ if el is not None and index is not None: self.android_uiautomator(locate, el=el)[index].clear() else: self.android_uiautomator(locate).clear() logger.warning('此定位方法只android系统!!!')
def android_uiautomator_input(self, locate, text, el=None, index=None): """ 更具表达式 查询页面元素 并输入 文本 此方法 只能安卓可用 :param locate: locate 表达式 如 :new UiSelector().text("显示") :param el: 单个/多个 默认 find_element=None 单个 / 如果 find_element = 's' 代表多个 :param index: 列表索引位置 find_element传递时 此值必填 :return: str drive对象 """ if el is not None and index is not None: self.android_uiautomator(locate, el=el)[index].send_keys(text) else: self.android_uiautomator(locate).send_keys(text) logger.warning('此定位方法只android系统!!!')
def ios_predicate_click(self, locate, el=None, index=None): """ 更具表达式 查询页面元素 并且点击该元素 此方法 只能 iso 可用 :param locate: locate 表达式 如 :new UiSelector().text("显示") :param el: 单个/多个 默认 find_element=None 单个 / 如果 find_element = 's' 代表多个 :param index: 列表索引位置 find_element传递时 此值必填 :return: str drive对象 """ logger.warning('此定位方法只ios系统!!!') if el is not None and index is not None: # 多个定位定位 利用index 列表索引点击 self.ios_predicate(locate=locate, el=el)[index].click() else: # 单个定位点击 self.ios_predicate(locate=locate).click()
def used_clear(self, types, locate, el=None, index=None): """ 清除输入框 :param types: 定位类型 :param locate: 定位元素 :param el: 单个/多个 默认 find_element=None 单个 / 如果 find_element = 's' 多个 :param index: 列表索引位置 find_element传递时 此值必填 """ try: if el is not None and index is not None: self.used_operate(types=types, locate=locate, el=el)[index].clear() else: self.used_operate(types=types, locate=locate).clear() logger.warning('此定位方法只android系统!!!') except Exception as e: if AttributeError: logger.error(f'未找到元素或此元素没有 {e}') else: logger.error(f'find_element 不为空时 index 参数必须传递!!{e}')
def get_by_type(self, types): """ 获取定位类型 目前 app 只提供了 , *安卓 (id(resource-id), class(ClassName) , xpath,) *iso (xpath, class(type) ,cont_name(name) , ) :param types: str :return: False """ types = types.lower() if types == "id": if PLATFORMNAME.lower() == 'android': logger.warning('此方法只支持android系统,ios不支持建议更换定位方式!!') return By.ID else: logger.error(f'{PLATFORMNAME} 不支持id定位') elif types == "xpath": return By.XPATH elif types == "class": return By.CLASS_NAME else: logger.info(f"Locator type {types} not correct/supported") raise ErrorExcep(f'不支持输入类型参数{types}!!!')
def app_expression(self, types, locate, operate=None, text=None, el=None, index=None, wait=0.5): """ app 执行操作判断 安卓 ios 表达式定位方法 (uiautomator(安卓) / ios_predicate(ios) accessibilityid(安卓/ios)) :param types: 定位类型 :param locate: 表达 或者定位元素 安卓 'new UiSelector().text("显示")' iOS "type == 'XCUIElementTypeButton' AND value == 'ClearEmail'" :param operate: 执行操作 input(输入) , clear(清除) , clear_continue_input(清除在输入) 、click(点击) ,text(提取文本) , slide(滑动) * 只支持 6种 :param text : 输入文本内容 :param el: 单个/多个 默认 el=None 单个 / 如果 el = 's' 代表多个 :param index: :param wait: 默认 等待0.5 秒 :return: """ # 只支持安卓 if PLATFORMNAME.lower() == 'android' and types == 'uiautomator': logger.warning('此方法只支持android系统!!') return self.if_android_operate_uiautomator(locate=locate, operate=operate, text=text, el=el, index=index, wait=wait) # 只支持 iso elif PLATFORMNAME.lower() == 'ios' and types == 'ios_predicate': logger.warning('此方法只支持ios系统!!') return self.if_operate_ios_predicate(locate=locate, operate=operate, text=text, el=el, index=index, wait=wait) elif types == 'accessibilityid': return self.if_acceaaibilityid_predicate(locate=locate, operate=operate, text=text, el=el, index=index, wait=wait) elif types in ('xpath', 'class', 'id'): return self.if_commonly_used_predicate(types=types, locate=locate, operate=operate, text=text, el=el, index=index, wait=wait) else: logger.error(f"""输入的{operate}操作类型,暂时不支持!! uiautomator 、ios_predicate 、accessibilityid、xpath、class、id 定位类型 """) raise ErrorExcep(f"""输入的{operate}操作类型,暂时不支持!! uiautomator 、ios_predicate 、accessibilityid、xpath、class、id 定位类型 """)
def setup(self): """ 设置单机版 浏览器驱动 :return: """ # 判断当前系统 try: if self.inspect_url_code(self.url): # 如果项目地址正常 current_sys = sys.platform.lower() log_path = os.path.join(LOG_DIR, f'{DAY}firefox.log') if current_sys == 'linux': # linux系统 if self.browser == 'chrome': # 谷歌浏览器 option = self.linux_chrome_args driver = webdriver.Chrome(executable_path=LUINX_CHROMEDRIVER, options=option) return self.browaer_setup_args(driver) elif self.browser == 'firefox': # 火狐浏览器 options = self.linux_firefox_args driver = webdriver.Firefox(executable_path=LUINX_FIREFOXDRIVER, options=options, service_log_path=log_path) drivers = self.browaer_setup_args(driver) return drivers # 在linux下启用 火狐浏览器需要借助Display else: logger.error(f'linux系统不支持此浏览器: {self.browser}') return False elif current_sys == 'darwin': # mac 系统 if self.browser == 'chrome': driver = webdriver.Chrome(executable_path=MAC_CHROMEDRIVER) return self.browaer_setup_args(driver) elif self.browser == 'firefox': driver = webdriver.Firefox(executable_path=MAC_FIREFOXDRIVER, service_log_path=log_path) return self.browaer_setup_args(driver) elif self.browser == 'safari': driver = webdriver.Safari() return self.browaer_setup_args(driver) else: logger.error(f'mac系统不支持此浏览器: {self.browser}') return False elif current_sys == 'win32': if self.browser == 'ie': logger.warning('请确保当前服务器安装IE!') driver = webdriver.Ie(executable_path=IE_PATH) return self.browaer_setup_args(driver) if self.browser == 'chrome': driver = webdriver.Chrome(executable_path=WIN_CHROMEDRIVER) return self.browaer_setup_args(driver) elif self.browser == 'firefox': driver = webdriver.Firefox(executable_path=WIN_FIREFOXDRIVER, service_log_path=log_path) return self.browaer_setup_args(driver, ) else: logger.error(f'windos系统不支持此浏览器: {self.browser}') return False else: logger.error(f'当前{current_sys}系统不支持!') return False else: logger.error('项目地址地址请求异常!!!') return False except Exception as e: logger.error(f'浏览器驱动启动失败 {e}') return False