def __init__(self,responseData,setApp,setpath,responseResult,istoken,token_value,Authorization): self.responseData = responseData self.istoken = istoken self.setpath = setpath self.setApp = setApp self.responseResult = responseResult self.tokenvalue =token_value self.Authorization = Authorization self.log = Log().logger()
class BaseApp: logger = Log().logger() def __init__(self,driver): self.driver = driver self.TouchAction = TouchAction(driver) #滑动操作 def implicitly_wait(self): time.sleep(2) self.driver.implicitly_wait(10) def getElementByElement(self, page_keyword, ui_keyword): """ 返回定位的单个元素 :param page_keyword: :param ui_keyword: :return: """ try: self.logger.info("查找【%s】的【%s】元素", page_keyword, ui_keyword) self.implicitly_wait() element =self.driver.find_element(page_keyword, ui_keyword) except NoSuchElementException: self.logger.info('页面元素不存在') else: return element def getElementByElements(self, page_keyword, ui_keyword): """ 返回定位的单个元素 :param page_keyword: :param ui_keyword: :return: """ try: self.logger.info("查找【%s】的【%s】元素", page_keyword, ui_keyword) self.implicitly_wait() elements = self.driver.find_elements(page_keyword, ui_keyword) except NoSuchElementException: self.logger.info('页面元素不存在') else: return elements def click(self, driver_ele): """ 判断页面元素是否存在,存在点击 :param page_keyword: :param ui_keyword: :return: """ driver_ele.click() def sendkeys(self,elements,ele_value): """ 判断页面元素是否存在,如果存在输入信息 :param elements: :param ele_value: :return: """ self.clear(elements) self.implicitly_wait() elements.send_keys(ele_value) def clear(self,driver_ele): """ 清除缓存信息 :param driver_ele: :return: """ driver_ele.clear() def save_img(self,img_path,time_stamp): """ 截图 :img_path :图片路径 :time_stamp: 获取时间格式 :return: """ self.implicitly_wait() self.driver.get_screenshot_as_file("%s/error%s.png" %(img_path,time_stamp)) def get_text(self,driver_ele): """ 获取文本内容 :param driver_ele: driver_ele = self.driver.find_elements(page_keyword, ui_keyword) :return: """ self.logger.info("获取文本内容【%s】", driver_ele.text) self.implicitly_wait() return driver_ele.text def get_size(self): """ 获取手机屏幕尺寸 :return: """ x = self.driver.get_window_size()['width'] y = self.driver.get_window_size()['height'] return x, y #修改刘建培新增内容 def swipes(self,x1,y1,x2,y2,times): """ 输入滑动信息 :param x1: :param y1: :param x2: :param y2: :param times: :return: """ self.implicitly_wait() self.driver.swipe(x1, y1, x2, y1, 1000) # 向左滑动屏幕 刘建培新增 def swipe_Left(self, t=1000, n=1): l = self.driver.get_window_size() x1 = l['width'] * 0.75 y1 = l['height'] * 0.5 x2 = l['width'] * 0.05 for i in range(n): self.driver.swipe(x1, y1, x2, y1, t) def swipLeft(self): """ 左滑 :return: """ self.implicitly_wait() appsize = self.get_size() x1 = int(appsize[0]*0.9) y1 = int(appsize[1]*0.5) x2 = int(appsize[0]*0.1) self.driver.swipe(x1,y1,x2,y1,1000) # 向上滑动屏幕 刘建培新增 def swipe_Up(self, t=1000, n=1): l = self.driver.get_window_size() x1 = l['width'] * 0.5 # x坐标 y1 = l['height'] * 0.75 # 起始y坐标 y2 = l['height'] * 0.25 # 终点y坐标 for i in range(n): self.driver.swipe(x1, y1, x1, y2, t) def swipeUp(self): """ 上滑 :return: """ self.implicitly_wait() appsize = self.get_size() x1 = int(appsize[0] * 0.5) y1 = int(appsize[1] * 0.9) y2 = int(appsize[1] * 0.35) self.driver.swipe(x1, y1, x1, y2, 1000) # 向下滑动屏幕 刘建培新增 def swipe_Down(self, t=1000, n=1): l = self.driver.get_window_size() x1 = l['width'] * 0.5 # x坐标 y1 = l['height'] * 0.25 # 起始y坐标 y2 = l['height'] * 0.75 # 终点y坐标 for i in range(n): self.driver.swipe(x1, y1, x1, y2, t) def swipeDown(self): """ 下滑 :return: """ self.implicitly_wait() appsize = self.get_size() x1 = int(appsize[0] * 0.5) y1 = int(appsize[1] * 0.35) y2 = int(appsize[1] * 0.85) self.driver.swipe(x1, y1, x1, y2, 1000) # 向右滑动屏幕 刘建培新增 def swip_Right(self, t=1000, n=1): l = self.driver.get_window_size() x1 = l['width'] * 0.05 y1 = l['height'] * 0.5 x2 = l['width'] * 0.75 for i in range(n): self.driver.swipe(x1, y1, x2, y1, t) def swipeRight(self): """ 右滑 :return: """ self.implicitly_wait() appsize = self.get_size() y1 = int(appsize[1] * 0.5) x1 = int(appsize[0] * 0.25) x2 = int(appsize[0] * 0.9) self.driver.swipe(x1, y1, x2, y1, 1000) def get_driver(self): """ 返回当前驱动 :return: """ self.logger.info("返回当前驱动") self.implicitly_wait() return self.driver def press_keycode(self,nums): """ 调用键盘操作 :param num: :return: """ self.driver.press_keycode(nums) def page_source(self): """ 获取页面源码 :return: """ return self.driver.page_source def isElementExist(self, By, value): flag = True if By == 'xpath': try: self.driver.find_element_by_xpath(value) except: flag = False elif By == "id": try: self.driver.find_element_by_id(value) except: flag = False return flag def back(self): self.driver.back() def getattribut(self,driver_ele, value): """ 获取元素中属性 #ele = self.driver.find_element(page_keyword, ui_keyword) #ele = self.driver.find_elements(page_keyword, ui_keyword) #ele[0].get_attribute(value) :return: """ self.implicitly_wait() self.logger.info("获取元素中属性【%s】", driver_ele.get_attribute(value)) return self.driver_ele.get_attribute(value) def current_activity(self): """ 获取当前activity :return: """ current_activity = self.driver.current_activity return current_activity def MultiAction_add(self,action1,action2): """ MultiAction多点触控操作,需要获取self.TouchAction属性方法 :param action1: action1=TouchAction(driver) | action1.press(x=x*0.2,y=y*0.2).wait(1000).move_to(x=x*0.4,y=y*0.4).wait(1000).release() :param action2: :return: """ self.multiaction = MultiAction(self.driver) self.multiaction.add(action1,action2) self.multiaction.perform()
class BaseApp: logger = Log().logger() def __init__(self, driver): self.driver = driver def implicitly_wait(self): time.sleep(2) self.driver.implicitly_wait(10) def getElementByElement(self, page_keyword, ui_keyword): """ 返回定位的单个元素 :param page_keyword: :param ui_keyword: :return: """ self.logger.info("点击【%s】的【%s】元素", page_keyword, ui_keyword) self.implicitly_wait() return self.driver.find_element(page_keyword, ui_keyword) def getElementByElements(self, page_keyword, ui_keyword): """ 返回定位的单个元素 :param page_keyword: :param ui_keyword: :return: """ self.logger.info("点击【%s】的【%s】元素", page_keyword, ui_keyword) self.implicitly_wait() return self.driver.find_elements(page_keyword, ui_keyword) def click(self, driver_ele): """ 点击方法 :param page_keyword: :param ui_keyword: :return: """ self.logger.info("点击【%s】元素", driver_ele) self.driver.implicitly_wait(5) self.highlight(driver_ele) driver_ele.click() def sendkeys(self, elements, ele_value): self.logger.info("通过【%s】的元素,录入信息为:【%s】", elements, ele_value) self.implicitly_wait() self.highlight(elements) elements.send_keys(ele_value) def save_img(self, img_path, time_stamp): """ 截图 :img_path :图片路径 :time_stamp: 获取时间格式 :return: """ self.implicitly_wait() self.driver.get_screenshot_as_file("%s/error%s.png" % (img_path, time_stamp)) def get_text(self, driver_ele): """ 获取文本内容 :param driver_ele: driver_ele = self.driver.find_elements(page_keyword, ui_keyword) :return: """ self.logger.info("获取文本内容【%s】", self.driver_ele.text) self.implicitly_wait() return self.driver_ele.text def get_size(self): """ 获取手机屏幕尺寸 :return: """ x = self.driver.get_window_size()['width'] y = self.driver.get_window_size()['height'] return x, y def swipLeft(self): """ 左滑 :return: """ appsize = self.get_size() x1 = int(appsize[0] * 0.9) y1 = int(appsize[1] * 0.5) x2 = int(appsize[0] * 0.1) self.driver.swipe(x1, y1, x2, y1, 1000) def swipeUp(self): """ 上滑 :return: """ appsize = self.get_size() x1 = int(appsize[0] * 0.5) y1 = int(appsize[1] * 0.95) y2 = int(appsize[1] * 0.35) self.driver.swipe(x1, y1, x1, y2, 1000) def swipeDown(self): """ 下滑 :return: """ appsize = self.get_size() x1 = int(appsize[0] * 0.5) y1 = int(appsize[1] * 0.35) y2 = int(appsize[1] * 0.85) self.driver.swipe(x1, y1, x1, y2, 1000) def swipeRight(self): """ 右滑 :return: """ appsize = self.get_size() y1 = int(appsize[1] * 0.5) x1 = int(appsize[0] * 0.25) x2 = int(appsize[0] * 0.95) self.driver.swipe(x1, y1, x2, y1, 1000) def get_driver(self): """ 返回当前驱动 :return: """ self.logger.info("返回当前驱动") self.implicitly_wait() return self.driver
class BasePage: def __init__(self,driver): """ 基础数据驱动封装 :param driver: """ self.driver =driver #日志对象 logger = Log().logger() ############################################################################## """ driver 数据基础操作 """ def title(self): """ 获取title :return: """ self.logger.info("获取title【%s】", self.driver.title ) self.implicitly_wait() time.sleep(2) return self.driver.title def implicitly_wait(self): time.sleep(2) self.driver.implicitly_wait(10) def getattribut(self,driver_ele, value): """ 获取元素中属性 #ele = self.driver.find_element(page_keyword, ui_keyword) #ele = self.driver.find_elements(page_keyword, ui_keyword) #ele[0].get_attribute(value) :return: """ self.implicitly_wait() self.logger.info("获取元素中属性【%s】", driver_ele.get_attribute(value)) return self.driver_ele.get_attribute(value) def get_text(self,driver_ele): """ 获取文本内容 :param driver_ele: driver_ele = self.driver.find_elements(page_keyword, ui_keyword) :return: """ self.logger.info("获取文本内容【%s】", self.driver_ele.text) self.implicitly_wait() return self.driver_ele.text def get_current_url(self): """ 获取当前url :return: """ self.logger.info("获取当前url【%s】", self.driver.current_url) self.implicitly_wait() return self.driver.current_url def get_url(self, url): """ 打开url :param url: :return: """ self.logger.info("获取当前url【%s】",url) self.implicitly_wait() return self.driver.get(url) def get_driver(self): """ 返回当前驱动 :return: """ self.logger.info("返回当前驱动") self.implicitly_wait() return self.driver def quit(self): """ 关闭浏览器以及驱动 :return: """ self.implicitly_wait() self.driver.quit() """ 高亮效果 """ def highlight(self,element): js = "arguments[0].setAttribute('style', 'background: yellow; border: 2px solid red;');"#高亮显示 try: self.driver.execute_script(js, element) except Exception as e: print(element+"高亮失败",EC) def clear(self,driver_ele): """ 清除文本框中的信息 :param driver_ele: driver_ele = self.driver.find_elements(page_keyword, ui_keyword) :return: """ self.logger.info("清除文本框中的信息") self.implicitly_wait() return driver_ele.clear() def refresh(self): """ 页面刷新 :return: """ self.logger.info("页面刷新") self.driver.refresh() def getElementByElement(self, page_keyword, ui_keyword): """ 返回定位的单个元素 :param page_keyword: :param ui_keyword: 获取驱动 ID = "id" XPATH = "xpath" LINK_TEXT = "link text" PARTIAL_LINK_TEXT = "partial link text" NAME = "name" TAG_NAME = "tag name" CLASS_NAME = "class name" CSS_SELECTOR = "css selector" :return: """ self.logger.info("点击【%s】的【%s】元素", page_keyword, ui_keyword) self.implicitly_wait() return self.driver.find_element(page_keyword,ui_keyword) def getElementByElements(self, page_keyword, ui_keyword): """ 返回定位的单个元素 :param page_keyword: :param ui_keyword: 获取驱动 ID = "id" XPATH = "xpath" LINK_TEXT = "link text" PARTIAL_LINK_TEXT = "partial link text" NAME = "name" TAG_NAME = "tag name" CLASS_NAME = "class name" CSS_SELECTOR = "css selector" :return: """ self.logger.info("点击【%s】的【%s】元素", page_keyword, ui_keyword) # self.implicitly_wait() WebDriverWait(self.driver,60).until(lambda x:x.find_elements(page_keyword,ui_keyword)) return self.driver.find_elements(page_keyword,ui_keyword) def click(self, driver_ele): """ 点击方法 :param page_keyword: :param ui_keyword: :return: """ self.logger.info("点击【%s】元素",driver_ele) self.driver.implicitly_wait(5) self.highlight(driver_ele) driver_ele.click() def sendkeys(self,elements,ele_value): self.logger.info("通过【%s】的元素,录入信息为:【%s】",elements, ele_value) self.implicitly_wait() self.highlight(elements) elements.send_keys(ele_value) def save_img(self,img_path,time_stamp): """ 截图 :img_path :图片路径 :time_stamp: 获取时间格式 :return: """ self.implicitly_wait() self.driver.get_screenshot_as_file("%s/error%s.png" %(img_path,time_stamp)) def maximize_window(self): self.implicitly_wait() self.driver.maximize_window() def alert_accept(self): """ 操作alert弹窗 :return: """ alert = self.driver.switch_to_alert() alert.accept() def get_alert_text_and_accept(self): alert = self.driver.switch_to_alert() text = alert.text # alert.accept() return text def get_switch_to_frame(self,driver_ele): """ :Usage: driver.switch_to.frame('frame_name') driver.switch_to.frame(1) driver.switch_to.frame(driver.find_elements_by_tag_name("iframe")[0]) driver.switch_to.parent_frame() driver.switch_to.window('main') :param driver_ele: driver_ele = self.driver.find_elements(page_keyword, ui_keyword) :return: """ self.logger.info("通过【%s】的元素,录入信息为:【%s】", driver_ele) self.driver.switch_to_frame(driver_ele) def get_switch_to_default_content(self): """ 退出iframe :return: """ self.driver.switch_to.default_content() def move_to_ele(self, bys, values): """ 页面移到所选元素 :return: """ ele = self.driver.find_element(bys, values) ActionChains(self.driver).move_to_element(ele).perform() ############################################################# """ alter/confirm/prompt处理 """ def alter_accept(self): """ 接收警告信息 :return: """ alert=self.driver.switch_to_alert() alert.accept() def alter_accept_text(self): """ 得到文本信息打印 :return: """ alert = self.driver.switch_to_alert() return alert.text() def alter_dismiss(self): """ 取消对话框 :return: """ alert = self.driver.switch_to_alert() alert.dismiss() def alter_senkeys(self,ele_text): """ 输入值 :return: """ alert = self.driver.switch_to_alert() self.logger.info("alter框输入信息:【%s】", ele_text) alert.send_keys(ele_text) ############################################################## """ 鼠标控件操作 """ def ActionChains(self,driver_ele): ActionChains(self.driver).move_to_element(driver_ele).perform() ############################################################ """ js处理方式 """ def get_js(self,js_value): self.logger.info("js文本内容:【%s】" %js_value) self.implicitly_wait() self.driver.execute_script(js_value) ######################################################## """ 键盘输入 """ def keys_back_space(self,driver_ele): """ 传入驱动后,删除一个 :param driver_ele: driver_ele = self.driver.find_elements(page_keyword, ui_keyword) :return: """ driver_ele.send_keys(Keys.BACK_SPACE)
class BasePage: def __init__(self, driver): """ 基础数据驱动封装 :param driver: """ self.driver = driver #日志对象 logger = Log().logger() ############################################################################## """ driver 数据基础操作 """ def title(self): """ 获取title :return: """ self.logger.info("获取title【%s】", self.driver.title) self.implicitly_wait() time.sleep(2) return self.driver.title def implicitly_wait(self): time.sleep(2) self.driver.implicitly_wait(10) def getattribut(self, driver_ele, value): """ 获取元素中属性 #ele = self.driver.find_element(page_keyword, ui_keyword) #ele = self.driver.find_elements(page_keyword, ui_keyword) #ele[0].get_attribute(value) :return: """ self.implicitly_wait() self.logger.info("获取元素中属性【%s】", driver_ele.get_attribute(value)) return self.driver_ele.get_attribute(value) def get_text(self, driver_ele): """ 获取文本内容 :param driver_ele: driver_ele = self.driver.find_elements(page_keyword, ui_keyword) :return: """ self.logger.info("获取文本内容【%s】", self.driver_ele.text) self.implicitly_wait() return self.driver_ele.text def get_current_url(self): """ 获取当前url :return: """ self.logger.info("获取当前url【%s】", self.driver.current_url) self.implicitly_wait() return self.driver.current_url def get_url(self, url): """ 打开url :param url: :return: """ self.logger.info("获取当前url【%s】", url) self.implicitly_wait() return self.driver.get(url) def get_driver(self): """ 返回当前驱动 :return: """ self.logger.info("返回当前驱动") self.implicitly_wait() return self.driver def quit(self): """ 关闭浏览器以及驱动 :return: """ self.implicitly_wait() self.driver.quit() def clear(self, driver_ele): """ 清除文本框中的信息 :param driver_ele: driver_ele = self.driver.find_elements(page_keyword, ui_keyword) :return: """ self.logger.info("清除文本框中的信息") self.implicitly_wait() return driver_ele.clear() def refresh(self): """ 页面刷新 :return: """ self.logger.info("页面刷新") self.driver.refresh() def getElementByElement(self, page_keyword, ui_keyword): """ 返回定位的单个元素 :param page_keyword: :param ui_keyword: 获取驱动 ID = "id" XPATH = "xpath" LINK_TEXT = "link text" PARTIAL_LINK_TEXT = "partial link text" NAME = "name" TAG_NAME = "tag name" CLASS_NAME = "class name" CSS_SELECTOR = "css selector" :return: """ self.logger.info("点击【%s】的【%s】元素", page_keyword, ui_keyword) self.implicitly_wait() return self.driver.find_element(page_keyword, ui_keyword) def getElementByElements(self, page_keyword, ui_keyword): """ 返回定位的单个元素 :param page_keyword: :param ui_keyword: 获取驱动 ID = "id" XPATH = "xpath" LINK_TEXT = "link text" PARTIAL_LINK_TEXT = "partial link text" NAME = "name" TAG_NAME = "tag name" CLASS_NAME = "class name" CSS_SELECTOR = "css selector" :return: """ self.logger.info("点击【%s】的【%s】元素", page_keyword, ui_keyword) self.implicitly_wait() return self.driver.find_elements(page_keyword, ui_keyword) def click(self, driver_ele): """ 点击方法 :param page_keyword: :param ui_keyword: :return: """ self.logger.info("点击【%s】元素", driver_ele) self.driver.implicitly_wait(5) driver_ele.click() def sendkeys(self, elements, ele_value): self.logger.info("通过【%s】的元素,录入信息为:【%s】", elements, ele_value) self.implicitly_wait() elements.send_keys(ele_value) def save_img(self, img_path, time_stamp): """ 截图 :img_path :图片路径 :time_stamp: 获取时间格式 :return: """ self.implicitly_wait() self.driver.get_screenshot_as_file("%s/error%s.png" % (img_path, time_stamp)) def maximize_window(self): self.implicitly_wait() self.driver.maximize_window() def alert_accept(self): """ 操作alert弹窗 :return: """ alert = self.driver.switch_to_alert() alert.accept() def get_alert_text_and_accept(self): alert = self.driver.switch_to_alert() text = alert.text # alert.accept() return text def get_switch_to_frame(self, driver_ele): """ :Usage: driver.switch_to.frame('frame_name') driver.switch_to.frame(1) driver.switch_to.frame(driver.find_elements_by_tag_name("iframe")[0]) driver.switch_to.parent_frame() driver.switch_to.window('main') :param driver_ele: driver_ele = self.driver.find_elements(page_keyword, ui_keyword) :return: """ self.logger.info("通过【%s】的元素,录入信息为:【%s】", driver_ele) self.driver.switch_to_frame(driver_ele) def get_switch_to_default_content(self): """ 退出iframe :return: """ self.driver.switch_to.default_content() ############################################################## """ 鼠标控件操作 drag_and_drop_by_offset(source, xoffset, yoffset) 拖动到某个位置松开 """ def ActionChains(self, driver_ele, x_location, y_location): ActionChains(self.driver).move_to_element(driver_ele).perform() ############################################################ """ js处理方式 """ # def get_js(self, *js_value): def get_js(self, js_value): self.logger.info("js文本内容:【%s】" % js_value) self.implicitly_wait() self.driver.execute_script(js_value)
def __init__(self, driver): self.driver = BaseApp(driver) self.log = Log().logger()
class test_Estate(): def __init__(self, driver): self.driver = BaseApp(driver) self.log = Log().logger() def is_Home_page(self): """ 判断当前是否在首页,不在首页就重启进入首页,重启失败返回False :return: """ flag = True locator = '//*[@text="我的应用"]' Home_page = self.driver.getElementByElement("xpath", locator) if Home_page: pass else: flag = False return flag def is_Login(self): """ 获取当前登录状态,未登录返回 0,登录返回 1,异常返回2 :return: """ flag = 0 try: login = self.driver.isElementExist("xpath", '//*[@text="请登录/注册"]') if login == False: flag = 1 except: try: login = self.driver.isElementExist('xpath', '//*[@text="请登录/注册"]') if login == False: flag = 1 except: # 如果没有检测到“我的应用”字样,说明还是没有打开首页,程序异常 flag = 2 return flag def test_dev_List(self): """ 楼盘列表 :return: """ flag = True home_page = self.is_Home_page() if home_page: login_status = self.is_Login() self.driver.swipes(20, 500, 20, 100, 1000) element = self.driver.getElementByElement( "id", "com.easylife.house.broker:id/tvDataNewHouse" ) #com.easylife.house.broker.test:id/tvDataNewHouse self.driver.clear(element) time.sleep(2) dev_list_res = self.driver.page_source() if login_status: try: assert '方案' in dev_list_res and '报备' in dev_list_res self.log.info('PASS,楼盘列表数据加载正常') element = self.driver.getElementByElement( "xpath", '//*[@text="添加到店铺"]') self.driver.click(element) time.sleep(1) res = self.driver.page_source() if "成功添加至我的店铺" in res: self.log.info('添加店铺成功') else: flag = False self.log.error('楼盘列表添加至我的店铺失败') element = self.driver.getElementByElement( 'xpath', '//*[@text="报备"]') self.driver.click(element) time.sleep(1) res = self.driver.page_source() if '注册用户不能报备' in res or '客户姓名' in res: self.log.info('楼盘列表,点击报备,成功跳转至报备页') else: flag = False self.log.info('楼盘列表,点击报备,没有跳转到报备页') except: self.log.error('楼盘列表,未检测到“报备按钮”和“佣金方案”数据') else: # 未登录状态下,点击楼盘列表里的”添加到店铺”和“报备” element = self.driver.getElementByElement( 'xpath', '//*[@text="添加到店铺"]') self.driver.click(element) res = self.driver.page_source() if "您暂未登录,不可添加至店铺" in res: self.log.info('PASS,未登录状态,不可添加至店铺') else: flag = False self.log.error('Failed,未登录状态,添加至店铺没有检测到toast提示') element = self.driver.getElementByElement( 'xpath', '//*[@text="报备"]') self.driver.click(element) locator = 'com.easylife.house.broker:id/btnLogin' try: #WebDriverWait(self.driver, 20, 0.5).until(EC.visibility_of_element_located((By.ID, locator))) time.sleep(5) self.log.info('PASS,未登录状态下,点击新房列表里的【报备】按钮,跳转到登录页') self.driver.back() except: flag = False self.log.error('Failed,未登录状态下,点击新房列表里的【报备】按钮,未跳转到登录页') else: flag = False self.log.error('程序未成功启动首页,楼盘列表用例未能正常执行') assert flag == True, 'test_dev_List 楼盘列表用例执行失败' def test_dev_info(self): home_page = self.is_Home_page() #super() print('home_page:', home_page) flag1 = True flag2 = True flag3 = True flag4 = True flag5 = True try: assert home_page == True, '当前页面不在APP首页,楼盘详情无法正常执行' self.driver.swipe(20, 500, 20, 100, 1000) element = self.driver.getElementByElement( 'id', 'com.easylife.house.broker:id/tvDataNewHouse') self.driver.click(element) time.sleep(2) # 搜索出霄云路8号 element = self.driver.getElementByElement( 'id', 'com.easylife.house.broker:id/edSearchDevNam') self.driver.click(element) time.sleep(1) element = self.driver.getElementByElement('xpath', '//*[@text="请输入楼盘名称"]') self.driver.sendkeys(element, '霄云路8号') self.driver.press_keycode(66) time.sleep(2) dev_name = self.driver.isElementExist( 'xpath', '//*[@text="朝阳区 | 住宅 | 建面 450-520㎡"]') dev_img = self.driver.isElementExist( 'id', 'com.easylife.house.broker:id/imgHouse') try: assert dev_name and dev_img, '楼盘列表搜索霄云路8号,搜索结果里 未检测到楼盘图片或霄云路8号字段' # 进入楼盘详情,查看详情数据 #self.driver.find_element_by_id('com.easylife.house.broker:id/tvHouseName').click() element = self.driver.getElementByElement( 'id', 'com.easylife.house.broker:id/tvHouseName') self.driver.click(element) # 等待元素加载完成 # WebDriverWait(self.driver,20,0.5).until_not(lambda x: x.find_element_by_id('com.easylife.house.broker:id/progressBar').is_displayed()) locator = '//*[@text="朝阳区霄云路8号"]' #WebDriverWait(self.driver, 20, 0.5).until(EC.visibility_of_element_located((By.XPATH, locator))) time.sleep(5) # 获取楼盘详情页数据,检查是否正确 dev_info_page1 = (('合生霄云路8号', '120000.0元/㎡', '朝阳区霄云路8号'), ('楼盘数据', '订单数')) dev_info_page2 = (('带客规则', '报备规则', '带看规则', '报备间隔:30分钟'), ('主力户型(2)', '5居(1)')) dev_info_page3 = (('楼盘动态(4)', '合生·霄云路8号450-520㎡产品在售', '合生·霄云路8号项目大户型房源在售'), ('楼盘信息', '合生', '2009-10-01', '2011-10-08', '京房售证字(2011)182号')) # 先检查第一屏幕里的信息是否正确 for info in dev_info_page1: for i in info: ele = self.driver.isElementExist( 'xpath', '//*[@text="' + i + '"]') try: assert ele except: flag1 = False self.log.error('Failed,楼盘详情:' + info[0] + '里未检测到元素:' + i) if flag1 == True: self.log.info('PASS,楼盘详情页地址价格及确客制度等数据检测正常') # 然后滑动到第二屏幕,检查信息 self.driver.swipe_Up() for info in dev_info_page2: for i in info: ele = self.driver.isElementExist( 'xpath', '//*[@text="' + i + '"]') try: assert ele except: flag2 = False self.log.error('Failed,楼盘详情:' + info[0] + '里未检测到元素:' + i) if flag2 == True: self.log.info('PASS,楼盘详情页主力户型、楼盘动态数据检测正常') # 然后滑动到第三屏幕,检查信息 self.driver.swipe_Up() for info in dev_info_page3: for i in info: ele = self.driver.isElementExist( 'xpath', '//*[@text="' + i + '"]') try: assert ele except: flag3 = False self.log.error('Failed,楼盘详情:' + info[0] + '里未检测到元素:' + i) if flag3 == True: self.log.info('PASS,楼盘详情页楼盘信息数据检测正常') # 进入楼盘信息详情页,检查是否数据正确 #self.driver.find_element_by_id('com.easylife.house.broker:id/tvMoreHouseInfo').click() element = self.driver.getElementByElement( 'id', 'com.easylife.house.broker:id/tvMoreHouseInf') self.driver.click(element) time.sleep(2) dev_more_info = ['京房售证字(2011)182号', '康景物业', '精装修'] for info in dev_more_info: ele = self.driver.isElementExist( 'xpath', '//*[@text="' + info + '"]') try: assert ele except: flag4 = False self.log.error('Failed,楼盘详情【更多信息】里未检测到元素:' + info) if flag4 == True: self.log.info('PASS,楼盘详情页【更多信息页】数据检测正常') self.driver.back() # 楼盘动态页加载检查 #self.driver.find_element_by_id('com.easylife.house.broker:id/tvMoreDynamic').click() element = self.driver.getElementByElement( 'id', 'com.easylife.house.broker:id/tvMoreDynamic') self.driver.click(element) time.sleep(2) text = self.driver.page_source() try: assert '地处燕莎商圈' in text and '合生·霄云路8号450-520㎡产品在售' in text except: flag5 = False self.log.error('Failed,楼盘动态详情页,加载数据异常') self.driver.back() except: assert 1 == 2 self.log.error('未检测到楼盘图片或霄云路8号字段') except: self.log.error('楼盘详情用例未执行') assert flag1 == True and flag2 == True and flag3 == True and flag4 == True and flag5 == True def dev_commision_login(self): """ 登录情况下,【缦合·北京】楼盘详情页佣金方案显示,及佣金查看详情 :return: """ #self.driver.find_element_by_id('com.easylife.house.broker:id/tvDataNewHouse').click() element = self.driver.getElementByElement( 'id', 'com.easylife.house.broker:id/tvDataNewHouse') self.driver.click(element) time.sleep(2) # self.driver.start_activity('com.easylife.house.broker', 'com.easylife.house.broker.ui.house.HouseListActivity') locator = 'com.easylife.house.broker:id/edSearchDevName' flag = True try: #WebDriverWait(self.driver, 20).until(EC.visibility_of_element_located((By.ID, locator))) time.sleep(5) #self.driver.find_element_by_id('com.easylife.house.broker:id/edSearchDevName').click() element = self.driver.getElementByElement( 'id', 'com.easylife.house.broker:id/edSearchDevName') self.driver.click(element) time.sleep(1) #self.driver.find_element_by_id('com.easylife.house.broker:id/edSearchDevName').click() element = self.driver.getElementByElement( 'id', 'com.easylife.house.broker:id/edSearchDevName') self.driver.click(element) time.sleep(1) #self.driver.find_element_by_xpath('//*[@text="请输入楼盘名称"]').send_keys('缦合·北京') element = self.driver.getElementByElement('xpath', '//*[@text="请输入楼盘名称"]') self.driver.sendkeys(element, '缦合·北京') self.driver.press_keycode(66) time.sleep(2) #self.driver.find_element_by_id('com.easylife.house.broker:id/tvHouseName').click() element = self.driver.getElementByElement( 'id', 'com.easylife.house.broker:id/tvHouseName') self.driver.click(element) locator = '//*[@text="朝阳区霄云路8号"]' #WebDriverWait(self.driver, 20, 0.5).until(EC.visibility_of_element_located((By.XPATH, locator))) time.sleep(5) # 先检查是否有佣金激励模块 page_res = self.driver.page_source() # exist_commision = BaseApp(self.driver).isElementExist('xpath', '//*[@text="佣金激励"]') if '佣金激励' in page_res: # 获取页面数据,检查是否有佣金数据 commision_res = self.driver.page_source() assert '有效期' in commision_res and '套餐' in commision_res, '登录状态下,慢合北京楼盘详情,佣金激励模块未检测到佣金方案详细数据' # 查看佣金详情数据 commision_info_btn = self.driver.isElementExist( 'id', 'com.easylife.house.broker:id/tvDetail') if commision_info_btn: #self.driver.find_element_by_id('com.easylife.house.broker:id/tvMoreCommission').click() element = self.driver.getElementByElement( 'id', 'com.easylife.house.broker:id/tvMoreCommission') self.driver.click(element) time.sleep(3) comm_cont = self.driver.page_source() try: assert '展开详情' in comm_cont and '有效期' in comm_cont, '佣金激励列表,未检测出数据' self.log.info('PASS,楼盘详情页,佣金激励方案,更多列表加载正确') except: flag = False else: flag = False self.log.error('慢合北京,楼盘详情页,佣金激励模块登录后,没有查看详情按钮') else: self.log.info('缦合·北京,楼盘详情页,未检测出佣金激励模块,请查看是否存在佣金数据') except: flag = False self.log.error('缦合·北京楼盘详情页,佣金方案异常') assert flag == True def dev_commission_not_login(self): """ 未登录状态下,楼盘详情页,佣金方案展示,及登录跳转 :return: """ #self.driver.find_element_by_id('com.easylife.house.broker:id/tvDataNewHouse').click() element = self.driver.getElementByElement( 'id', 'com.easylife.house.broker:id/tvDataNewHouse') self.driver.click(element) time.sleep(2) # self.driver.start_activity('com.easylife.house.broker', 'com.easylife.house.broker.ui.house.HouseListActivity') locator = 'com.easylife.house.broker:id/edSearchDevName' flag = True try: #WebDriverWait(self.driver, 20).until(EC.visibility_of_element_located((By.ID, locator))) time.sleep(3) #self.driver.find_element_by_id('com.easylife.house.broker:id/edSearchDevName').click() element = self.driver.getElementByElement( 'id', 'com.easylife.house.broker:id/edSearchDevName') self.driver.click(element) time.sleep(1) #self.driver.find_element_by_xpath('//*[@text="请输入楼盘名称"]').send_keys('缦合·北京') element = self.driver.getElementByElement('xpath', '//*[@text="请输入楼盘名称"]') self.driver.sendkeys(element, '缦合·北京') self.driver.press_keycode(66) time.sleep(3) #self.driver.find_element_by_id('com.easylife.house.broker:id/tvHouseName').click() element = self.driver.getElementByElement( 'id', 'com.easylife.house.broker:id/tvHouseName') self.driver.click(element) locator = '//*[@text="朝阳区霄云路8号"]' #WebDriverWait(self.driver, 20, 0.5).until(EC.visibility_of_element_located((By.XPATH, locator))) time.sleep(3) # 先检查是否有佣金激励模块 exist_commision = self.driver.isElementExist( 'xpath', '//*[@text="结佣规则"]') if exist_commision: login_tips = self.driver.isElementExist( 'xpath', '//*[@text="登录查看佣金激励,点击“立即登录”"]') assert login_tips, '未登录状态下,楼盘详情页,佣金激励模块,未检测到登录提示' self.log.info('PASS,未登录状态下,楼盘详情页,佣金激励模块显示去登录按钮') if login_tips: # 去登录,然后检查登录后是否可以展示 #self.driver.find_element_by_xpath('//*[@text="登录查看佣金激励,点击“立即登录”"]').click() element = self.driver.getElementByElement( 'xpath', '//*[@text="登录查看佣金激励,点击“立即登录”"]') self.driver.click(element) time.sleep(3) try: # 检查是否跳转到登录页面 login_btn = self.driver.isElementExist( 'id', 'com.easylife.house.broker:id/btnLogin') time.sleep(4) if login_btn: # 输入用户名密码登录 #self.driver.find_element_by_xpath('//*[@text="密码登录"]').click() element = self.driver.getElementByElement( 'xpath', '//*[@text="密码登录"]') self.driver.click(element) time.sleep(1) #self.driver.find_element_by_id('com.easylife.house.broker:id/edphone').send_keys('18810223040') element = self.driver.getElementByElement( 'id', 'com.easylife.house.broker:id/edphone') self.driver.sendkeys(element, '18810223040') #self.driver.find_element_by_id('com.easylife.house.broker:id/edPassword').send_keys('123456') element = self.driver.getElementByElement( 'id', 'com.easylife.house.broker:id/edPassword') self.driver.sendkeys(element, '18810223040') # self.driver.find_element_by_id('com.easylife.house.broker:id/cbAgree').click() # 勾选用户服务协议,默认是勾选的,不用点击勾选了 #self.driver.find_element_by_id('com.easylife.house.broker:id/btnLogin').click() element = self.driver.getElementByElement( 'id', 'com.easylife.house.broker:id/btnLogin') self.driver.click(element) time.sleep(1) # self.driver.refresh() # 由于返回的时候没有刷新页面,所以需要重新进入楼盘详情页 self.log.info('楼盘详情页登录成功') self.driver.back() #self.driver.find_element_by_id('com.easylife.house.broker:id/tvHouseName').click() element = self.driver.getElementByElement( 'id', 'com.easylife.house.broker:id/tvHouseName') self.driver.click(element) # WebDriverWait(self.driver, 20, 0.5).until( # EC.visibility_of_element_located((By.XPATH, locator))) time.sleep(5) # 获取页面数据,检查是否有佣金数据 commision_res = self.driver.page_source() assert '有效期' in commision_res and '套餐' in commision_res, '登录后,慢合北京楼盘详情,佣金激励模块未检测到佣金方案详细数据' # 查看佣金详情数据 commision_info_btn = self.driver.isElementExist( 'id', 'com.easylife.house.broker:id/tvDetail') if commision_info_btn: #self.driver.find_element_by_id('com.easylife.house.broker:id/tvMoreCommission').click() element = self.driver.getElementByElement( 'id', 'com.easylife.house.broker:id/tvMoreCommission' ) self.driver.click(element) time.sleep(3) comm_cont = self.driver.page_source() try: assert '展开详情' in comm_cont and '有效期' in comm_cont, '佣金激励列表,未检测出数据' except: flag = False else: flag = False self.log.error('慢合北京,楼盘详情页,佣金激励模块登录后,没有查看详情按钮') else: flag = False self.log.error('慢合北京,楼盘详情页,未登录状态下,佣金激励模块未检测到登录提示') except: flag = False self.log.error('慢合北京,楼盘详情页,通过佣金激励模块登录功能异常') else: self.log.info('缦合·北京楼盘详情页,未检测到佣金激励模块,请检查是否有佣金政策') except: flag = False self.log.error('缦合·北京楼盘详情页,佣金方案异常') assert flag == True def test_dev_house_info(self): """ 霄云路8号,户型详情 :return: """ home_page = self.is_Home_Page() try: assert home_page, '未能成功进入首页,户型详情执行失败' # self.driver.swipe(20, 500, 20, 100, 1000) # 点击新房列表 #self.driver.find_element_by_id('com.easylife.house.broker:id/tvDataNewHouse').click() element = self.driver.getElementByElement( 'id', 'com.easylife.house.broker:id/tvDataNewHouse') self.driver.click(element) time.sleep(3) # 搜索出霄云路8号,回车 #self.driver.find_element_by_id('com.easylife.house.broker:id/edSearchDevName').click() element = self.driver.getElementByElement( 'id', 'com.easylife.house.broker:id/edSearchDevName') self.driver.click(element) time.sleep(1) #self.driver.find_element_by_id('com.easylife.house.broker:id/edSearchDevName').click() element = self.driver.getElementByElement( 'id', 'com.easylife.house.broker:id/edSearchDevName') self.driver.click(element) time.sleep(1) #self.driver.find_element_by_xpath('//*[@text="请输入楼盘名称"]').send_keys('霄云路8号') element = self.driver.getElementByElement('xpath', '//*[@text="请输入楼盘名称"]') self.driver.sendkeys(element, '霄云路8号') self.driver.press_keycode(66) time.sleep(2) # 进入楼盘详情,查看详情数据 #self.driver.find_element_by_id('com.easylife.house.broker:id/tvHouseName').click() element = self.driver.getElementByElement( 'id', 'com.easylife.house.broker:id/tvHouseName') self.driver.click(element) # 等待元素加载完成 locator = '//*[@text="朝阳区霄云路8号"]' #WebDriverWait(self.driver, 20, 0.5).until(EC.visibility_of_element_located((By.XPATH, locator))) time.sleep(5) self.driver.swipe_Up() time.sleep(1) #self.driver.find_element_by_xpath('//*[@text="5室3厅5卫2厨"]').click() element = self.driver.getElementByElement('xpath', '//*[@text="5室3厅5卫2厨"]') self.driver.click(element) time.sleep(5) house_page_info = self.driver.page_source() self.driver.swipe_Up() house_page_info = self.driver.page_source() + house_page_info page_info = [ '住宅', '520㎡', '户型简介', '会客厅开间8.6米 2、进门双玄关处都更为宽大', '所属楼盘', '合生霄云路8号', '朝阳区 | 住宅 | 建面450.0-520.0㎡', '本楼盘其他户型', '4室3厅5卫1厨' ] flag = True for i in page_info: try: assert i in house_page_info except: flag = False self.log.error('Failed,楼盘动态详情页,未检测到数据:' + i) assert flag == True, 'Failed,户型详情页数据加载异常' self.log.info('PASS,楼盘-户型详情,数据加载正确') except: assert 1 == 2 self.log.error('户型详情用例执行失败') def test_dev_commission(self): login_state = self.is_Login() if login_state == 0: self.dev_commission_not_login() elif login_state == 1: self.dev_commision_login() else: # 如果登录状态为2,说明程序异常 self.log.error('程序异常,未能测试楼盘详情佣金数据') assert login_state != 2, ('程序异常,未能测试楼盘详情佣金数据') def test_broker_store(self): ''' 经纪人我的店铺-移除楼盘 :return: ''' home_page = self.is_Home_Page() assert home_page == True, 'Faied,未能成功启动首页' time.sleep(3) #self.driver.find_element_by_xpath('//*[@text="我的店铺"]').click() element = self.driver.getElementByElement('xpath', '//*[@text="我的店铺"]') self.driver.click(element) time.sleep(1) # 判断是否跳转到登录页,跳转的话就进行登录,否则直接进行后续流程 is_login = self.driver.isElementExist('xpath', '//*[@text="验证码登录"]') if is_login: # 输入用户名密码登录 #self.driver.find_element_by_xpath('//*[@text="密码登录"]').click() element = self.driver.getElementByElement('xpath', '//*[@text="密码登录"]') self.driver.click(element) time.sleep(1) # self.driver.find_element_by_id('com.easylife.house.broker:id/edphone').send_keys( # '18810223040') element = self.driver.getElementByElement( 'id', 'com.easylife.house.broker:id/edphone') self.driver.sendkeys(element, "18810223040") # self.driver.find_element_by_id('com.easylife.house.broker:id/edPassword').send_keys( # '123456') element = self.driver.getElementByElement( 'id', 'com.easylife.house.broker:id/edPassword') self.driver.sendkeys(element, "123456") # self.driver.find_element_by_id('com.easylife.house.broker:id/cbAgree').click() # 勾选用户服务协议,默认是勾选的,不用点击勾选了 #self.driver.find_element_by_id('com.easylife.house.broker:id/btnLogin').click() element = self.driver.getElementByElement( 'id', 'com.easylife.house.broker:id/btnLogin') self.driver.click(element) time.sleep(1) #self.driver.find_element_by_xpath('//*[@text="我的店铺"]').click() element = self.driver.getElementByElement('xpath', '//*[@text="我的店铺"]') self.driver.click(element) time.sleep(2) # 移除所有店铺 #res_text = self.driver.find_element_by_id('com.easylife.house.broker:id/tvMyDev').get_attribute('text') element = self.driver.getElementByElement( 'id', 'com.easylife.house.broker:id/tvMyDev') res_text = self.driver.getattribut(element, 'text') num = re.sub(r'\D', '', res_text) if num == '': self.log.info('PASS,我的店铺里没有收藏的店铺') else: for i in range(0, int(num)): #self.driver.find_element_by_xpath('//*[@text="移除店铺"]').click() element = self.driver.getElementByElement( 'xpath', '//*[@text="移除店铺"]') self.driver.click(element) time.sleep(2) #self.driver.find_element_by_xpath('//*[@text="确定"]').click() element = self.driver.getElementByElement( 'xpath', '//*[@text="确定"]') self.driver.click(element) time.sleep(2) self.log.info('PASS,成功移除店铺内所有楼盘')
class TestCase(unittest.TestCase): """ 全局变量中将excel中首行标题提取:testdata2 , yaml数据返回结果:datainfo 新脚本中配置新的excel需要改写内容如下 :对应新的配置文件信息 global:全局变量 file_path = SystemOs().sys_path(datainfo['file_path2']) testdata = xlsxoper(file_path).readerXLS_dict(datainfo['SheetName2'])[0] # 数据用于ddt使用 testdata2 = xlsxoper(file_path).readerXLS_dict(datainfo['SheetName2'])[1] # 首行标题 def: 执行脚本对应的excel写入sheet xls = xlsxoper(file_path).writeXLS_dict(datas['caseNo'],column,str(responseData),datainfo['SheetName2']) """ global log, file_path, datainfo, testdata2 log = Log().logger() conf = Config("ConfigApi") keys = conf.parsing_config("public_data") public_data = SystemOs().sys_path(keys) #通过主配置文件config获取主yaml配置文件路径- datainfo = yamlUtil(public_data).get_yalm() file_path = SystemOs().sys_path(datainfo['file_path2']) testdata = xlsxoper(file_path).readerXLS_dict( datainfo['SheetName2'])[0] # 数据用于ddt使用 testdata2 = xlsxoper(file_path).readerXLS_dict( datainfo['SheetName2'])[1] # 首行标题 #*testdata 只获取数据 @data(*testdata) def test_01_demo(self, datas): """ 接口测试 :param datas: 从yaml文件中获取excel路径,读取数据集,通过ddt形式 """ isSkip = datas['isSkip'] #获取excle中isSkip if isSkip == 'y': log.info("当isSkip==y跳过此条用例") else: #print("datas:",datas) webapp = datas['setApp'] setApp = datainfo[webapp] #获取excel中设备类型setApp是网页还是手机 log.info('setApp: %s ', setApp) setpath = SystemOs().sys_path( setApp ) #获取yaml子配置文件路径信息如:C:/Users/vivid/PycharmProjects/untitled/DestroyerRobot/yaml_file/header_cms.yaml header = yamlUtil(setpath).get_yalm() #获取header信息 url = datainfo[datas['domain']] + datas['requestUrl'] #"请求方式= %s",datas['method'],"请求参数= %s",datas['param'] "请求格式= %s",datas['paramType'],"请求头部信息= %s",header log.info("请求地址= %s ", url) # log.info("请求方式= %s",datas['method']) # log.info("请求格式= %s",datas['paramType']) # log.info("请求头部信息= %s",header) responseData = HttpClient().request(datas['method'], url, datas['paramType'], datas['param'], header) #实际结果 log.info("实际响应结果:%s", responseData) responseResult = CheckResult.check(responseData, datas["exceptResponse"]) log.info("判断预期结果与实际结果是否一致:0 为 False 1 为 True = %s ", responseResult) # 判断是否将token写入yaml对应的文件中 stort_token(responseData, webapp, setpath, responseResult, datas['istoken'], datainfo['token'], datainfo['Authorization']).token() #查找CASE_trueResponse中value值对应excel的列位置 column = testdata2.index(datainfo['CASE_trueResponse']) # 写入excel中 log.info("将实际响应结果集数据写入excel中对应列") #写入excel数据必须是字符串,不能是dict xls = xlsxoper(file_path).writeXLS_dict(datas['caseNo'], column, str(responseData), datainfo['SheetName2']) time.sleep(1)
class stort_token: """ stort_token只是为了满足权限系统而作 """ def __init__(self,responseData,setApp,setpath,responseResult,istoken,token_value,Authorization): self.responseData = responseData self.istoken = istoken self.setpath = setpath self.setApp = setApp self.responseResult = responseResult self.tokenvalue =token_value self.Authorization = Authorization self.log = Log().logger() def token(self): #print(self.responseData,"\n\t",self.istoken ,"\n\t",self.setpath ,"\n\t", self.setApp ,"\n\t" ,self.responseResult ,"\n\t",self.tokenvalue ,"\n\t",self.Authorization ) if self.istoken : if self.responseResult : if "data" in self.responseData.keys(): if self.responseData["data"] == None: self.log.info("data层为null") else: if self.tokenvalue in self.responseData['data'].keys(): reToken = self.responseData["data"][self.tokenvalue] #在权限系统中生成"Bearer "+applicationToken 对应Authorization reAuthorization = "Bearer "+self.responseData["data"]["applicationToken"] self.log.info("reToken:%s" % reToken) if self.setApp == 1 : data = yamlUtil(self.setpath).get_yalm() if self.tokenvalue in data.keys(): yamlUtil(self.setpath).update_yaml(self.tokenvalue,reToken) else: Token = {self.tokenvalue: reToken} yamlUtil(self.setpath).write_yaml(Token) if self.Authorization in data.keys(): yamlUtil(self.setpath).update_yaml(self.Authorization,reAuthorization) else: Authorization = {self.Authorization: reAuthorization} yamlUtil(self.setpath).write_yaml(Authorization) elif self.setApp == 2 : data = yamlUtil(self.setpath).get_yalm() if self.tokenvalue in data.keys(): yamlUtil(self.setpath).update_yaml(self.tokenvalue,reToken) else: reToken = {self.tokenvalue : reToken} yamlUtil(self.setpath).write_yaml(reToken) else: self.log.info("登录没有返回token") else: self.log.info("response没有data层") else: self.log.info("登录失败" ) else: self.log.info("不是登录")