def init_to_home(self): '''滑动引导页进入登录页面,登录进入首页''' try: mobile = get_yaml_value(TEST_ACCOUNT_PATH, 'account_1') pwd = get_yaml_value(TEST_ACCOUNT_PATH, 'pwd_1_right') StartPage(self.driver).swipe_start() lp = LoginPage(self.driver) lp.login_opera(mobile, pwd) time.sleep(1) # 判断是否登录成功 if lp.is_exist_element(self.update_ele): log.info("登录成功,进入首页...") self.update_cancel_opera() # 判断是否存在通知弹窗 if lp.is_exist_element(self.cancel_el): self.notice_cancel_opera() # 判断是否存在"知道了" if lp.is_exist_element(self.iknow_ele): self.iknow_click_opera() else: pass elif lp.is_exist_element(self.cancel_el): log.info("登录成功,进入首页...") self.notice_cancel_opera() elif lp.is_exist_element(self.iknow_ele): log.info("登录成功,进入首页...") self.iknow_click_opera() elif lp.is_exist_element(self.home_ele): log.info("登录成功,进入首页...") pass else: log.error("初始化登录失败,终止自动化程序!!!") sys.exit(0) except Exception as e: log.error("进入首页失败:{}".format(e))
def android_driver(self): '''Android driver''' # 从desired_caps.yaml读取driver配置数据 stream = open(DESIRED_CAPS_YAML_PATH, 'r') data = yaml.load(stream, Loader=yaml.FullLoader) desired_caps = {} desired_caps['platformName'] = data['platformName'] desired_caps['platformVersion'] = data['platformVersion'] desired_caps['deviceName'] = data['deviceName'] desired_caps['udid'] = data['udid'] desired_caps['appPackage'] = data['appPackage'] desired_caps['appActivity'] = data['appActivity'] desired_caps['noReset'] = data['noReset'] desired_caps['unicodeKeyBoard'] = True desired_caps['resetKeyboard'] = True desired_caps['automationName'] = data['automationName'] # 设置收到下一条命令的超时时间,超时appium会自动关闭session ,默认60秒 desired_caps['newCommondTimeout'] = data['newCommondTimeout'] try: driver = webdriver.Remote('http://' + str(data['ip']) + ':' + str(data['port']) + '/wd/hub', desired_caps) driver.implicitly_wait(8) log.info("驱动app打开成功...") return driver except Exception as e: log.error("驱动app打开失败:{}".format(e))
def get_apk_info(self): '''获取apk包的appPackage、启动类appActivity''' mac_aapt_path = '/Users/mac/Downloads/android-sdk-macosx/build-tools/29.0.3/' aapt_command_base = 'aapt dump badging ' app_path = self.get_apk_path() try: # mac获取方法 # p = subprocess.Popen(mac_aapt_path+aapt_command_base+app_path, stdout=subprocess.PIPE, # stderr=subprocess.PIPE, # stdin=subprocess.PIPE, # shell=True) # windows获取方法 p = subprocess.Popen(aapt_command_base + app_path, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE, shell=True) (output, err) = p.communicate() t = output.decode() # print(t) match_appPackage = re.compile("package: name='(.*?)'").search(t) match_apkActivity = re.compile( "launchable-activity: name='(.*?)'").search(t) appPackage = match_appPackage.groups()[0] appActivity = match_apkActivity.groups()[0] # print(appPackage) # print(appActivity) log.info("获取被测apk包的appPackage、appActivity成功...") return appPackage, appActivity except Exception as e: log.error("获取被测apk包的appPackage、appActivity失败:{}".format(e))
def start_appium(self): '''启动appium服务''' try: os.system('start appium -a 127.0.0.1 -p 4723') time.sleep(5) log.info("启动appium服务...") except Exception as e: log.error("appium启动失败:{}".format(e))
def get_clickable_element(self, locator, timeout=20): '''获取可点击元素''' try: return WebDriverWait(self.driver, timeout).until( ec.element_to_be_clickable(locator)) except Exception as e: Screenshots(self.driver, "获取可点击元素失败").screen_shot() log.error("可点击元素获取失败:{}".format(e))
def get_presence_element(self, locator, timeout=20): '''获取存在元素''' try: return WebDriverWait(self.driver, timeout).until( ec.presence_of_element_located(locator)) except Exception as e: Screenshots(self.driver, "获取存在元素失败").screen_shot() log.error("获取存在元素失败:{}".format(e))
def uninstall_app(self): '''卸载App基本方法''' try: log.info("开始卸载应用{}...".format(self.appName)) result = os.popen(self.uninstall_command).read() if "Success" in result: log.info("应用卸载成功...") except Exception as e: log.error("应用卸载失败:{}".format(e))
def install_app(self): '''安装App基本方法''' try: log.info("正在安装应用{},请稍后...".format(self.appName)) result = os.popen(self.install_command).read() if "Success" in result: log.info("{}应用安装成功...".format(self.appName)) except Exception as e: log.error("应用安装失败:{}".format(e))
def get_yaml_value(p, k): '''获取yaml文件中key对应的值''' try: with open(p, 'r', encoding='utf-8') as f: cont = yaml.load(f.read(), Loader=yaml.RoundTripLoader) val = cont[k] return val except Exception as e: log.error("获取{}对应的值失败:{}".format(k, e))
def get_text_element(self, text, timeout=20): '''通过text定位元素''' try: text_loc = (By.XPATH, "//*[@text=\'{}\']".format(text)) return WebDriverWait(self.driver, timeout).until( lambda driver: self.driver.find_element(*text_loc)) except Exception as e: Screenshots(self.driver, "通过text获取元素失败").screen_shot() log.error("通过text获取元素失败:{}".format(e))
def get_deviceName(self): '''获取连接设备的设备名deviceName''' try: result = os.popen(self.deviceName_command).read() deviceName = result.split('\n')[0] # print(deviceName) log.info("获取设备名成功...") return deviceName except Exception as e: log.error("获取设备名失败:{}".format(e))
def get_platformVersion(self): '''获取连接设备的系统版本号platformVersion''' try: result = os.popen(self.platformVersion_command).read() platformVersion = result.split('\n')[0] # print(platformVersion) log.info("获取设备系统版本号成功...") return platformVersion except Exception as e: log.error("获取系统版本号失败:{}".format(e))
def new_is_exist_element(self, text, timeout=20): ''' 重新封装,判断元素是否存在 text: 元素的文本 ''' sleep(2) try: text_loc = (By.XPATH, "//*[@text=\'{}\']".format(text)) WebDriverWait(self.driver, timeout).until( ec.visibility_of_element_located(text_loc)) return True except Exception as e: Screenshots(self.driver, "text获取失败").screen_shot() log.error("text获取失败:{}".format(e)) return False
def get_udid(self): '''获取设备udid。输出所有已连接电脑的android devices,去掉输出中无用的字符串,只保留devices SN''' devices_list = [] result = os.popen(self.udid_command).readlines() # print(result) list_len = len(result) if list_len == 2: log.error("没有测试设备连接,结束!!!") sys.exit(0) else: for i in range(list_len): if result[i].find('\t') != -1: devices_list.append(result[i].split('\t')[0]) # print(devices_list) # 返回第一个udid(通常只有一台设备进行测试) return devices_list[0]
def get_apk_path(self): '''获取app文件的完整路径''' # 获取app文件夹中的所有apk文件名 package_list = os.listdir(APP_PATH) # 判断app中apk文件的个数并选择 num = len(package_list) if num == 0: log.error("未添加需要测试的apk文件!!!") sys.exit(0) elif num == 1: apk_path = APP_PATH + package_list[0] elif num >= 2: print(package_list) index = int(input("请输入要测试的包名的编号(从0开始):")) apk_path = APP_PATH + package_list[index] # print(apk_path) return apk_path
def init_to_home(self): '''滑动引导页进入登录页面,登录进入首页''' try: mobile = get_yaml_value(TEST_ACCOUNT_PATH, 'account_1') pwd = get_yaml_value(TEST_ACCOUNT_PATH, 'pwd_1_right') StartPage(self.driver).swipe_start() lp = LoginPage(self.driver) lp.login_opera(mobile, pwd) time.sleep(2) # 判断是否登录成功,不成功则再进行一次判定操作 result = self.is_login_success() if result: log.info("登录成功,进入首页...") else: time.sleep(2) result_2 = self.is_login_success() if result_2: log.info("登录成功,进入首页...") else: log.error("初始化登录失败,终止自动化程序!!!") # sys.exit(0) except Exception as e: log.error("进入首页失败:{},终止用例执行!!!".format(e)) sys.exit(0)