def wait_ele_visible(self, locator, doc="", times=30, poll_frequency=0.5): """ :param locator: 元素定位表达式 :param doc: 操作的模块名_页面名_操作名(用于异常时截图存储的截图图片名称) :param times:等待时间 :param poll_frequency:轮询间隔时间 :return: """ MyLog().info('等待元素{}可见'.format(locator)) try: start_time = datetime.now() # MyLog().info("等待开始时间{}:".format(start_time)) WebDriverWait(self.driver, times, poll_frequency).until(EC.visibility_of_element_located(locator)) except Exception as e: MyLog().info('等待元素失败!!!!!!!!!!!!!') # 截图 self.save_screenshot(doc) raise e end_time = datetime.now() # 求等待的差值,写在日志中,等待了多久 wait_time = (end_time - start_time).seconds MyLog().info("wait_time:{}".format(wait_time)) MyLog().info("等待结束,等待时长为{}秒".format(wait_time))
def dismiss_alert(self, times=30, poll_frequency=0.5, doc=''): try: WebDriverWait(self.driver, times, poll_frequency).until(EC.alert_is_present()) alert = self.driver.switch_to_alert() alert.dismiss() except: MyLog.info('弹窗不存在!!!!!!!!!!!!!') self.save_screenshot(doc) raise
def click_elements(self, locator, index=0, doc=''): eles = self.get_elements(locator, doc) try: eles[index].click() MyLog().info('点击元素{}'.format(locator)) except: MyLog().info('点击元素失败!!!!!!!!!!!!!') self.save_screenshot(doc) raise
def clear_loc_text(self, locator, doc=""): ele = self.get_element(locator, doc) MyLog().info('清除元素{}的文本内容'.format(locator)) try: ele.clear() except: MyLog().info('清除元素文本失败!!!!!!!!!!!!!') self.save_screenshot(doc) raise
def get_ele_attribute(self, locator, attr, doc=""): # 先找到元素 ele = self.get_element(locator, doc) MyLog().info('获取元素{}的属性'.format(locator)) try: return ele.get_attribute(attr) except: MyLog.info('获取元素属性失败!!!!!!!!!!!!!') self.save_screenshot(doc) raise
def get_text(self, locator, doc=""): # 先找到元素 ele = self.get_element(locator, doc) MyLog().info('获取元素{}的文本内容'.format(locator)) try: return ele.text except: MyLog().info('获取元素文本失败!!!!!!!!!!!!!') self.save_screenshot(doc) raise
def click_element(self, locator, doc=""): # 先找到元素 ele = self.get_element(locator, doc) MyLog().info('点击元素{}'.format(locator)) try: ele.click() except: MyLog().info('点击元素失败!!!!!!!!!!!!!') self.save_screenshot(doc) raise
def input_text(self, locator, text, doc=""): # 先找到元素 ele = self.get_element(locator, doc) MyLog().info('向元素{}输入文本{}'.format(locator, text)) try: ele.send_keys(text) except: MyLog().info('输入文本失败!!!!!!!!!!!!!') self.save_screenshot(doc) raise
def get_elements(self, locator, doc=""): MyLog().info('查找元素{}'.format(locator)) try: eles = self.driver.find_elements(*locator) return eles except: MyLog().info('查找元素失败!!!!!!!!!!!!!') # 截图 self.save_screenshot(doc) raise
def get_toastMsg(self, str): # 1、xpath表达式,文本匹配 loc = (MobileBy.XPATH, '//*[contains(@text,"{}")]'.format(str)) # 等待室等待元素存在,不能用等待元素可见 try: WebDriverWait(self.driver, 10, 0.01).until(EC.visibility_of_element_located(loc)) return self.driver.find_element(*loc).text except: MyLog.info('没有找到匹配的toast!!!') raise
def save_screenshot(self, doc): MyLog().info("截取屏幕") # 图片名称:模块名_页面名_操作名_时间.png file_name = screenshot_dir + "\\{}_{}.png".format(datetime.strftime(datetime.now(), "%Y%m%d%H%M%S"), doc) self.driver.save_screenshot(file_name) with open(file_name, mode='rb') as f: file = f.read() # 截图添加为allure报告的附件 allure.attach(file, doc, allure.attachment_type.PNG) MyLog().info("截取屏幕完成,存放地址在{}".format(file_name))
def switch_to_native_app(self, img_doc): ''' 切换到app原生页面 :param img_doc: 截图说明 :return: ''' try: MyLog.info("切换到app原生页面") self.driver.switch_to.context('NATIVE_APP') except Exception as e: MyLog.error("切换到app原生页面失败!") self.save_screenshot(img_doc) raise e
def switch_to_webview(self, loc, img_doc, timeout=20, frequency=0.5): ''' 切换到webview页面 :param loc: webview页面的元素 :param img_doc: 截图说明 :param timeout: 等待的超时时间 :param frequency: 轮询频率 :return: ''' try: MyLog.info("等待元素{}可见,并进行webview切换".format(loc)) start_time = time.time() WebDriverWait(self.driver, timeout, frequency).until( EC.visibility_of_element_located(loc)) cons = self.driver.contexts MyLog.info("开始切换到webview:{}".format(cons[-1])) self.driver.switch_to.context(cons[-1]) except Exception as e: MyLog.error("切换webview失败!") self.save_screenshot(img_doc) raise e else: end_time = time.time() MyLog.info("切换到webview:{}成功,等待时间:{}秒".format( cons[-1], round(end_time - start_time, 2)))
def get_element(self, locator, doc=""): MyLog().info('查找元素{}'.format(locator)) try: # self.wait_ele_visible(*locator) time.sleep(2) ele = self.driver.find_element(*locator) print(ele) # 返回元素对象,以便进行后续操作 return ele except Exception as e: MyLog().info('查找元素失败!!!!!!!!!!!!!') # 截图 self.save_screenshot(doc) raise e
def application_switching(self, package_name, activity_name, img_doc): ''' 应用切换 :param package_name: 包名 :param activity_name: 欢迎页面名 :param img_doc: 截图说明 :return: ''' try: MyLog.info("切换应用到{}".format(package_name)) self.driver.start_activity(app_package=package_name, app_activity=activity_name) except Exception as e: MyLog.error("切换应用到{}失败!".format(package_name)) self.save_screenshot(img_doc) raise e
def get_alert_text(self, times=30, poll_frequency=0.5, doc=''): # 等待弹窗存在 try: WebDriverWait(self.driver, times, poll_frequency).until(EC.alert_is_present()) alert = self.driver.switch_to_alert() MyLog().info('弹窗存在,获取弹框的文本内容') try: return alert.text except: MyLog.info('获取弹框的文本内容失败!!!!!!!!!!!!!') self.save_screenshot(doc) raise except: MyLog.info('弹窗不存在!!!!!!!!!!!!!') self.save_screenshot(doc) raise
def is_ele_visible(self, locator, doc="", times=30, poll_frequency=0.5): """ :param locator: 元素定位表达式 :param doc: 操作的模块名_页面名_操作名(用于异常时截图存储的截图图片名称) :param times:等待时间 :param poll_frequency:轮询间隔时间 :return: """ MyLog().info('等待元素{}可见'.format(locator)) try: WebDriverWait(self.driver, times, poll_frequency).until(EC.visibility_of_element_located(locator)) return True except Exception as e: # 截图 self.save_screenshot(doc) MyLog().info(e) return False
def wait_element_to_be_click(self, loc, img_doc, timeout=20, frequency=0.5): ''' 等待元素可点击 :param loc: 元素定位的XPATH元组表达式 :param img_doc: 截图说明 :param timeout: 等待的超时时间 :param frequency: 轮询频率 :return: ''' try: MyLog.info("开始等待页面元素<{}>是否可点击!".format(loc)) start_time = time.time() WebDriverWait(self.driver, timeout, frequency).until(EC.element_to_be_clickable(loc)) except Exception as e: MyLog.error("页面元素<{}>等待可点击失败!".format(loc)) self.save_screenshot(img_doc) raise e else: end_time = time.time() MyLog.info("页面元素<{}>等待可点击,等待时间:{}秒".format( loc, round(end_time - start_time, 2)))
def wait_ele_exist(self, locator, doc="", times=30, poll_frequency=0.5): """ :param locator: 元素定位表达式 :param doc: 操作的模块名_页面名_操作名(用于异常时截图存储的截图图片名称) :param times:等待时间 :param poll_frequency:轮询间隔时间 :return: """ MyLog().info('等待元素{}存在'.format(locator)) try: # 开始等待时间 start_time = datetime.now() WebDriverWait(self.driver, times, poll_frequency).until(EC.presence_of_element_located(locator)) # 结束等待时间 end_time = datetime.now() # 求等待的差值,写在日志中,等待了多久 wait_time = (end_time - start_time).seconds MyLog().info("等待结束,等待时长为{}秒".format(wait_time)) except: MyLog().info('等待元素失败!!!!!!!!!!!!!') # 截图 self.save_screenshot(doc) raise
def get_element_text(self, loc, img_doc, timeout=20, poll_frequency=0.5): ''' 获取WebElement对象的文本值 :param loc: 元素定位的XPATH元组表达式 :param img_doc: 截图说明 :param timeout: 等待的超时时间 :param frequency: 轮询频率 :return: WebElement对象的文本值 ''' try: MyLog.info("在{}中获取元素<{}>的文本值".format(img_doc, loc)) self.wait_ele_visible(loc, img_doc, timeout, poll_frequency) text = self.get_element(loc, img_doc).text except Exception as e: MyLog.error("在{}中获取元素<{}>的文本值失败!".format(img_doc, loc)) self.save_screenshot(img_doc) raise e else: MyLog.info("获取到的元素文本值为:{}".format(text)) return text
def sliding_screen(self, direction, img_doc): ''' 滑屏操作 :param direction: 滑屏方向:上-up;下-down;左-left;右-right :param img_doc: 截图说明 :return: ''' size = self.driver.get_window_size() try: MyLog.info("开始向{}方向滑动".format(direction)) if direction.lower() == 'up': self.driver.swipe(start_x=size['width'] * 0.5, start_y=size['height'] * 0.9, end_x=size['width'] * 0.5, end_y=size['height'] * 0.1, duration=200) elif direction.lower() == 'down': self.driver.swipe(start_x=size['width'] * 0.5, start_y=size['height'] * 0.1, end_x=size['width'] * 0.5, end_y=size['height'] * 0.9, duration=200) elif direction.lower() == 'left': self.driver.swipe(start_x=size['width'] * 0.9, start_y=size['height'] * 0.5, end_x=size['width'] * 0.1, end_y=size['height'] * 0.5, duration=200) elif direction.lower() == 'right': self.driver.swipe(start_x=size['width'] * 0.1, start_y=size['height'] * 0.5, end_x=size['width'] * 0.9, end_y=size['height'] * 0.5, duration=200) else: MyLog.error("方向选择错误!") except Exception as e: MyLog.error("向{}方向滑动屏幕失败!".format(direction)) self.save_screenshot(img_doc) raise e
def get_elements_text(self, loc, doc="", timeout=20, poll_frequency=0.5): ''' 获取WebElement对象的所有文本值 :param loc: 元素定位的XPATH元组表达式 :param img_doc: 截图说明 :param timeout: 等待的超时时间 :param frequency: 轮询频率 :return: WebElement对象的文本值的列表 ''' try: MyLog.info("在{}中获取元素<{}>的所有文本值".format(doc, loc)) self.wait_ele_visible(loc, doc, timeout, poll_frequency) all_text = self.get_elements(loc, doc) text_list = [] for one_text in all_text: text_list.append(one_text.text) except Exception as e: MyLog.error("在{}中获取元素<{}>的所有文本值失败!".format(doc, loc)) self.save_screenshot(doc) raise e else: MyLog.info("获取到的元素文本值列表为:{}".format(text_list)) return text_list