diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 13566b81b018ad684f3a35fee301741b2734c8f4..0000000000000000000000000000000000000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/.idea/autotest-airtest-web-sc.iml b/.idea/autotest-airtest-web-sc.iml index c444878a60b4aa9f0806053dcf95844c9151be6a..90a9730bcc7c6540f5c59a42cbcb0d4aafb715c2 100644 --- a/.idea/autotest-airtest-web-sc.iml +++ b/.idea/autotest-airtest-web-sc.iml @@ -1,8 +1,25 @@ - + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml deleted file mode 100644 index 7cb67dd64bfd9ed652df0954c63feda173c51d27..0000000000000000000000000000000000000000 --- a/.idea/encodings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml index 212a436014e3da690b6f3795410552b4e7fc3092..b9c76e91aa67538de3f10aad71cf4327ecd44162 100644 --- a/.idea/inspectionProfiles/Project_Default.xml +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -8,5 +8,12 @@ + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index a2e120dcc86d18fdcb6ccfbe56c5d0b0dcd7c04a..22f9dd0087aa488c2beadfc173daf8d3d7bf1916 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,7 @@ + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 308d9f07aada1cec78e9dd8813c4ac0d0f1a8b0b..35eb1ddfbbc029bcab630581847471d7f238ec53 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -2,6 +2,5 @@ - \ No newline at end of file diff --git a/actions/actions_buy/__init__.py b/actions/actions_buy/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..ca8fa404e522dcba9c63772a99da1e9305f070cf --- /dev/null +++ b/actions/actions_buy/__init__.py @@ -0,0 +1,8 @@ +#!/user/bin/env python3 +# -*- coding: utf-8 -*- +# ddate:2023/12/8 8:59 +__author__: "qinguanglei" + +""" +case_tag:case +""" diff --git a/actions/actions_buy/page_buy.py b/actions/actions_buy/page_buy.py new file mode 100644 index 0000000000000000000000000000000000000000..ce8482d24227e0914b3d309c90136c856b59814e --- /dev/null +++ b/actions/actions_buy/page_buy.py @@ -0,0 +1,433 @@ + +from selenium.webdriver.remote.webdriver import By +from actions.actions_login.page_login import PageLogin + + +class PageBuy(PageLogin): + """基础元素""" + # 采购管理元素 + _buy_management_locator = (By.XPATH, '//div[@class="menuNavItem" and @sysname="采购管理"]') + # 采购业务元素 + _buy_locator = (By.XPATH, '//div[@class="sec-menu" and @navname="采购业务"]') + # 采退业务元素 + _return_locator = (By.XPATH, '//div[@class="sec-menu" and @navname="采退业务"]') + # 普通采购订单元素 + _buy_op_locator = (By.XPATH, '//div[@class="third-menu" and @navname="普通采购订单"]') + # 采购iframe + _iframe_buy_locator = ( + By.XPATH, '//iframe[@class="metro-main-frame" and contains(@src,"purchases")]') + # 新建按钮 + _new_locator = (By.XPATH, '//span[text() = "新建"]') + # 对话框iframe,填写订单信息需要 + _sub_iframe_dialog_locator = (By.XPATH, '//iframe[contains(@name,"dialog-iframe")]') + # 请求查询公司信息按钮元素 + _company_request_locator = (By.XPATH, '//input[starts-with(@id,"el-id-") and contains(@id,"-106")]/../span/span/i') + # 公司信息输入元素 + _company_input_locator = (By.XPATH, '//input[@placeholder = "模糊检索:公司名称,公司编码"]') + # 公司信息搜索元素 + _company_search_locator = (By.XPATH, '//input[@placeholder = "模糊检索:公司名称,公司编码"]/../span/span/i') + # 公司表dialog body + _company_dialog_locator = ( + By.XPATH, '//div[starts-with(@id,"el-id-") and contains(@id,"-21") and @class="el-dialog__body"]') + _company_table_locator = (By.CLASS_NAME, "el-table__body") + # 公司确定按钮 + _company_table_ensure_locator = (By.XPATH, '//span[@class="ensureBtn"]/button/span[text() = "确定"]') + # 主体信息 + _main_info_locator = (By.ID, 'tab-7667cf55-c391-4f2c-a5ba-c0f6d27b6d3a') + '''仓库信息''' + # 仓库输入内容 + _warehouse_content_locator = (By.XPATH, '//input[starts-with(@id,"el-id-") and contains(@id,"-122")]') + # 请求查询仓库元素 + _ware_request_locator = (By.XPATH, '//input[starts-with(@id,"el-id-") and contains(@id,"-122")]/../span/span/i') + # _ware_request_locator = (By.XPATH, '//div[text() = "仓库名称"]/../div[@class="el-form-item__content"]/descendant::i[@class="awsui-iconfont" and @style="cursor: pointer;"]') + # _ware_request_locator = (By.XPATH,'//div[@id =contains(text(),"仓库名称")]') + # 仓库输入元素 + _ware_input_locator = (By.XPATH, '//input[@placeholder = "模糊检索:仓库名称,仓库编码"]') + # 仓库搜索元素 + _ware_search_locator = (By.XPATH, '//input[@placeholder = "模糊检索:仓库名称,仓库编码"]/../span/span/i') + # _ware_dialog_locator = ( + # By.XPATH, '//div[starts-with(@id,"el-id-") and contains(@id,"-26") and @class="el-dialog__body"]') + # _ware_dialog_locator = (By.XPATH, '//div[@role="dialog" and @aria-label="选择仓库"]') + _ware_dialog_locator = ( + By.XPATH, '//div[starts-with(@id,"el-id-") and contains(@id,"-32") and @class="el-dialog__body"]') + _ware_table_locator = 'By.XPATH, "//table[@class = "el-table__body""' + # 仓库表确认元素---这中确定看着可以统一 + _ware_table_ensure_locator = (By.XPATH, '//span[@class="ensureBtn"]/button/span[text() = "确定"]') + + '''供应商信息''' + # 供应商内容 + _supplier_content_locator = (By.XPATH, '//input[starts-with(@id,"el-id-") and contains(@id,"-119")]') + # 查询供应商请求元素 + _supplier_request_locator = (By.XPATH, '//input[starts-with(@id,"el-id-") and contains(@id,"-119")]/../span/span/i') + # 供应商输入信息 + _supplier_input_locator = (By.XPATH, '//input[@placeholder = "模糊检索:供应商名称,供应商编码"]') + # 供应商搜索元素 + _supplier_search_locator = (By.XPATH, '//input[@placeholder = "模糊检索:供应商名称,供应商编码"]/../span/span/i') + # 供应商表元素-----这个只能找绝对路径了,开发太狠了 + _supplier_table_locator = ( + By.XPATH, '/html/body/div[10]/div/div/div/div[1]/div[2]/div[1]/div/div/div/div[1]/div[3]/div/div[1]/div/table') + # 供应商dialog + _supplier_dialog_locator = ( + By.XPATH, '//div[starts-with(@id,"el-id-") and contains(@id,"-20") and @class="el-dialog__body"]') + # 供应商表确定元素---这中确定看着可以统一 + _supplier_table_ensure_locator = (By.XPATH, './span[@class="ensureBtn"]/button/span[text() = "确定"]') + + _dialog_ensure_locator = './*/span[@class="ensureBtn"]/button/span[text() = "确定"]' + + '''协议信息''' + # 协议输入内容元素 + _protocol_content_locator = (By.XPATH, '//input[starts-with(@id,"el-id-") and contains(@id,"-124")]') + + # 协议请求元素 + _protocol_request_locator = (By.XPATH, '//input[starts-with(@id,"el-id-") and contains(@id,"-109")]/../span/span/i') + # 协议输入元素 + _protocol_input_locator = (By.XPATH, + '//input[@placeholder = "模糊检索:合同/协议号,合同号,项目编码,项目名称,业态编码,对方编码,产品线编码"]') + # 协议搜索元素 + _protocol_search_locator = (By.XPATH, + '//input[@placeholder = "模糊检索:合同/协议号,合同号,项目编码,项目名称,业态编码,对方编码,产品线编码"]/../span/span/i') + # 协议dialog元素 + _protocol_dialog_locator = ( + By.XPATH, '//div[starts-with(@id,"el-id-") and contains(@id,"-36") and @class="el-dialog__body"]') + + '''业务员信息''' + # 业务员输入内容元素 + _businessman_content_locator = (By.XPATH, '//input[starts-with(@id,"el-id-") and contains(@id,"-127")]') + # 业务员请求元素 + _businessman_request_locator = ( + By.XPATH, '//input[starts-with(@id,"el-id-") and contains(@id,"-110")]/../span/span/i') + # 业务员输入元素 + _businessman_input_locator = (By.XPATH, '//input[@placeholder="模糊检索:业务员编码,业务员名称,部门编码,部门名称"]') + # 业务员搜索元素 + _businessman_search_locator = ( + By.XPATH, '//input[@placeholder="模糊检索:业务员编码,业务员名称,部门编码,部门名称"]/../span/span/i') + # 业务员dialog元素 + _businessman_dialog_locator = ( + By.XPATH, '//div[starts-with(@id,"el-id-") and contains(@id,"-41") and @class="el-dialog__body"]') + + '''商品信息''' + # 商品最高复选框 + _merchandise_all_select_locator = (By.XPATH, + '/html/body/div[38]/div/div/div/div[1]/div[2]/div[1]/div/div[2]/div/div[1]/div[2]/table/thead/tr/th[1]/div/label') + # 商品录入按钮 + _merchandise_locator = (By.XPATH, '//span[text()="添加商品"]') + # 商品dialog + _merchandise_dialog_locator = ( + By.XPATH, '//div[starts-with(@id,"el-id-") and contains(@id,"-136") and @class="el-dialog__body"]') + # 商品输入元素 + _merchandise_input_locator = (By.XPATH, '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,厂家物料编码"]') + # 商品搜索元素 + _merchandise_search_locator = ( + By.XPATH, '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,厂家物料编码"]/../span/span/i') + + # dialog中的输入元素 + _dialog_input_locator = './*/input[@class="el-input__inner" and @placeholder="模糊检索:商品编码,商品名称,规格型号,厂家物料编码"]' + # dialog中的搜索元素 + _dialog_search_locator = './*/span[@class="el-input__prefix-inner"]/i' + """表格中输入元素""" + _input_in_table_locator = 'input' + + # 保存按钮 + # _save_locator = (By.XPATH, '//*[@id="process-toolbar"]/button[4]/span/text()') + _save_locator = (By.XPATH, '//*[@id="process-toolbar"]/*/span[text()="保存"]') + # _submit_locator + _submit_locator = (By.XPATH, '//*[@id="process-toolbar"]/*/span[text()="提交"]') + + # 订单号 + _order_no_locator = (By.XPATH, '//*[@id="0b83dfe6-67bc-46bf-b271-5e768a59e415"]/div/div[2]/span') + # 商品明细表 + _detail_table = ( + By.XPATH, + '//*[@id="a55ef0dd-0262-4caa-b701-684a33007ac5"]/div/div[2]/div/div/div[2]/div[2]/div[1]/div[2]/table') + # _detail_table = ( + # By.XPATH, '//*[@id="a55ef0dd-0262-4caa-b701-684a33007ac5"]/*/table[@class="vxe-table--body"]') + + '''获取采购管理元素''' + + def get_buy_management(self): + return self.get_element_wait_presence(self._buy_management_locator) + + '''获取采购元素''' + + def get_buy(self): + return self.get_element_wait_presence(self._buy_locator) + + '''获取采退元素''' + + def get_return(self): + return self.get_element_wait_presence(self._return_locator) + + '''获取采购订单op元素''' + + def get_buy_op(self): + return self.get_element_wait_presence(self._buy_op_locator) + + '''获取采购iframe元素''' + + def get_iframe_buy(self): + return self.get_element_wait_presence(self._iframe_buy_locator) + + '''获取新建按钮元素''' + + def get_new(self): + return self.get_element_wait_presence(self._new_locator) + + '''获取对话框iframe元素''' + + def get_sub_iframe_dialog(self): + return self.get_element_wait_presence(self._sub_iframe_dialog_locator) + + '''获取查询公司请求按钮''' + + def get_company_request(self): + return self.get_element_wait_presence(self._company_request_locator) + + '''获取公司输入信息元素''' + + def get_company_input(self): + return self.get_element_wait_presence(self._company_input_locator) + + '''获取公司搜索按钮元素''' + + def get_company_search(self): + return self.get_element_wait_presence(self._company_search_locator) + + '''获取公司表元素''' + + def get_company_table(self): + # return self.get_element_wait_presence(self._company_table_locator) + # 首先获取公司dialog + company_dialog = self.get_company_dialog() + '''再从公司dialog中获取公司表''' + return self.get_table_from_dialog(company_dialog) + + '''获取公司表确定按钮''' + + def get_company_table_ensure(self): + return self.get_element_wait_presence(self._company_table_ensure_locator) + + '''获取仓库信息''' + + def get_ware_info(self): + return self.get_element_wait_presence(self._ware_info_locator) + + '''获取主体信息''' + + def get_main_info(self): + return self.get_element_wait_presence(self._main_info_locator) + + '''仓库信息hold''' + '''获取仓库内容元素''' + + def get_warehouse_content(self): + return self.get_element_wait_presence(self._warehouse_content_locator) + + '''获取请求查询仓库元素''' + + def get_ware_request(self): + return self.get_element_wait_presence(self._ware_request_locator) + + '''获取仓库输入元素''' + + def get_ware_input(self): + return self.get_element_wait_presence(self._ware_input_locator) + + '''获取仓库搜索元素''' + + def get_ware_search(self): + return self.get_element_wait_presence(self._ware_search_locator) + + '''选择某行''' + + def select_one_row(self, row): + tds = row.find_elements(By.TAG_NAME, "td") + span = tds[1].find_element(By.XPATH, './div/label/span[1]') + span.click() + + '''获取仓库dialog''' + + def get_ware_dialog(self): + return self.get_element_wait_presence(self._ware_dialog_locator) + + '''获取仓库表元素''' + + def get_ware_table(self): + ware_dialog = self.get_ware_dialog() + return self.get_table_from_dialog(ware_dialog) + + '''获取仓库表确定按钮''' + + def get_ware_table_ensure(self): + ware_dialog = self.get_ware_dialog() + return ware_dialog.find_element(By.XPATH, '//span[@class="ensureBtn"]/button/span[text() = "确定"]') + + # return self.get_child(ware_dialog, self._ware_table_ensure_locator) + + '''供应商信息hold''' + '''获取供应商内容元素''' + + def get_supplier_content(self): + return self.get_element_wait_presence(self._supplier_content_locator) + + '''获取供应商dialog元素''' + + def get_supplier_dialog(self): + return self.get_element_wait_presence(self._supplier_dialog_locator) + + '''从dialog中获取输入元素''' + + def get_input_from_dialog(self, dialog_element): + result = dialog_element.find_element(By.XPATH, self._dialog_input_locator) + self.wait_seconds(self.time_seconds) + return result + + '''从dialog中获取搜索元素''' + + def get_search_from_dialog(self, dialog_element): + search = dialog_element.find_element(By.XPATH, self._dialog_search_locator) + self.wait_seconds(self.time_seconds) + return search + + '''从dialog中获取表信息''' + + def get_table_from_dialog(self, dialog_element): + tables = dialog_element.find_elements(By.TAG_NAME, "table") + self.wait_seconds(self.time_seconds) + return tables[1] + + '''从dialog中获取确定按钮''' + + def get_ensure_from_dialog(self, dialog_element): + ensure = dialog_element.find_element(By.XPATH, self._dialog_ensure_locator) + return ensure + + """从表格中的一个栏位中获取输入元素""" + + def get_input_from_table_field(self, field): + element = field.find_element(By.XPATH, self._input_in_table_locator) + return element + + '''获取供应商请求元素''' + + def get_supplier_request(self): + return self.get_element_wait_presence(self._supplier_request_locator) + + '''获取供应商输入元素''' + + def get_supplier_input(self): + return self.get_element_wait_presence(self._supplier_input_locator) + + '''获取供应商搜索元素''' + + def get_supplier_search(self): + return self.get_element_wait_presence(self._supplier_search_locator) + + '''获取供应商表元素''' + + def get_supplier_table(self): + return self.get_element_wait_presence(self._supplier_table_locator) + + '''获取供应商表确定元素''' + + def get_supplier_table_ensure(self): + return self.get_element_wait_presence(self._supplier_table_ensure_locator) + + '''获取公司dialog''' + + def get_company_dialog(self): + return self.get_element_wait_presence(self._company_dialog_locator) + + '''协议信息hold''' + '''获取协议输入内容''' + + def get_protocol_context(self): + return self.get_element_wait_presence(self._protocol_content_locator) + + '''获取协议请求元素''' + + def get_protocol_request(self): + return self.get_element_wait_presence(self._protocol_request_locator) + + '''获取协议输入元素''' + + def get_protocol_input(self): + return self.get_element_wait_presence(self._protocol_input_locator) + + '''获取协议搜索元素''' + + def get_protocol_search(self): + return self.get_element_wait_presence(self._protocol_search_locator) + + '''获取协议dialog''' + + def get_protocol_dialog(self): + return self.get_element_wait_presence(self._protocol_dialog_locator) + + '''业务员信息hold''' + '''获取业务员输入信息''' + + def get_businessman_content(self): + return self.get_element_wait_presence(self._businessman_content_locator) + + '''获取业务员请求元素''' + + def get_businessman_request(self): + return self.get_element_wait_presence(self._businessman_request_locator) + + '''获取业务员输入元素''' + + def get_businessman_input(self): + return self.get_element_wait_presence(self._businessman_input_locator) + + '''获取业务员搜索元素''' + + def get_businessman_search(self): + return self.get_element_wait_presence(self._businessman_search_locator) + + '''获取业务员dialog''' + + def get_businessman_dialog(self): + return self.get_element_wait_presence(self._businessman_dialog_locator) + '''商品信息hold''' + '''获取商品全选复选框''' + def get_merchandise_all_select(self): + return self.get_element_wait_presence(self._merchandise_all_select_locator) + + '''商品录入按钮''' + + def get_merchandise(self): + return self.get_element_wait_presence(self._merchandise_locator) + + '''商品dialog按钮''' + + def get_merchandise_dialog(self): + return self.get_element_wait_presence(self._merchandise_dialog_locator) + + '''商品输入元素''' + + def get_merchandise_input(self): + return self.get_element_wait_presence(self._merchandise_input_locator) + + '''商品搜索元素''' + + def get_merchandise_search(self): + return self.get_element_wait_presence(self._merchandise_search_locator) + + '''保存按钮元素''' + + def get_save(self): + return self.get_element_wait_presence(self._save_locator) + + '''订单号''' + + def get_order_no(self): + return self.get_element_wait_presence(self._order_no_locator) + + '''商品明细表''' + + def get_detail_table(self): + return self.get_element_wait_presence(self._detail_table) + + '''订单提交''' + def get_submit_element(self): + return self.get_element_wait_presence(self._submit_locator) diff --git a/actions/actions_buy/steps_buy.py b/actions/actions_buy/steps_buy.py new file mode 100644 index 0000000000000000000000000000000000000000..2962a48101b0a479af229a1eb7a6ca6c5b48d3e3 --- /dev/null +++ b/actions/actions_buy/steps_buy.py @@ -0,0 +1,425 @@ +# author:qinguanglei +# ddate:2023/11/20 10:15 +import traceback +from selenium.webdriver.chrome import webdriver +from selenium.webdriver import ActionChains +from common import constant +from common.common_func import commonFuc +from common.logger import logger +from common.read_yaml import get_filed_from_yaml +from common.verifycode import VerifyCode +from test_buy.page_buy import PageBuy + +module = 'buy' + + +class StepsBuy(object): + def __init__(self, driver): + self.page_buy = PageBuy(driver) + self.driver = driver + + def open_browser(self): + try: + logger.info('当前url: %s', get_filed_from_yaml(module, "data", "url")) + self.page_buy.open_page(get_filed_from_yaml(module, "data", "url")) + commonFuc.step_ok_info(commonFuc(), "浏览器打开成功。") + except Exception as e: + logger.error(f'打开浏览器问题:{e.__doc__}{traceback.format_exc()}') + commonFuc.step_fail_info(commonFuc(), self.driver, "浏览器打开失败。") + + def login(self): + try: + # 获取账号输入元素 + account_element = self.page_buy.get_account() + # 获取密码输入元素 + password_element = self.page_buy.get_password() + # 获取账号与密码 + account = get_filed_from_yaml(module, "data", "account") + password = get_filed_from_yaml(module, "data", "password") + # 填充账号密码 + self.page_buy.input_text(account_element, account) + self.page_buy.input_text(password_element, password) + # 登录特殊处理一下,验证码最多尝试5次,有一次成功,则成功。若5次都失败,案例直接失败 + max_retry = 5 + i = 5 + while i > 0: + # 先获取验证码图片元素 + verify_code_element = self.page_buy.get_verify_image() + # 获取验证码输入元素 + verify_input_element = self.page_buy.get_verify_code() + # 获取验证码中的文字信息 + verify_code_text = VerifyCode(verify_code_element, self.driver).indentify_verify_image() + # 填充验证码 + self.page_buy.input_text(verify_input_element, verify_code_text) + logger.info(f'填充的验证码内容为{verify_code_text}。') + # 获取登录按钮 + login_button_element = self.page_buy.get_login_button() + # 点击登录 + self.page_buy.single_click(login_button_element) + # 判断登录是否成功,登录成功会切换到另外一个页面,通过页面title来判断是否切换成功 + if self.page_buy.get_window_title() != constant.LOGIN_SUCCESS: + # 表示不登录成功,此时将1减去1 + i -= 1 + logger.warn('执行登录失败一次,次数多了将直接导致案例失败。') + else: + # 表示登录成功,跳出循环 + logger.info('登录成功,开始执行案例。') + commonFuc.step_ok_info(commonFuc(), "登录成功。") + break + if i <= 0: + logger.error( + f'验证码已经连续{max_retry}次识别失败,本案例执行时登录失败,请检查环境是否出现问题,特别是分辨率是否调整。') + commonFuc.step_fail_info(commonFuc(), self.driver, "登录验证码错误次数过多。") + logger.info(f'登录成功。') + except Exception as e: + logger.error(f'登录过程问题:{e.__doc__}{traceback.format_exc()}') + commonFuc.step_fail_info(commonFuc(), self.driver, "登录失败。") + + def enter_buy_op_page(self): + try: + # 定位采购管理元素 + buy_management_button = self.page_buy.get_buy_management() + # 鼠标移动到采购管理按钮 + self.page_buy.move_to_element(buy_management_button) + # 定位到隐藏的采购按钮 + buy_button = self.page_buy.get_buy() + # 鼠标移动到采购按钮 + self.page_buy.move_to_element(buy_button) + # 定位到采购申请op + buy_op_button = self.page_buy.get_buy_op() + # 鼠标移动到采购申请op + self.page_buy.move_to_element(buy_op_button) + # 点击采购申请op + buy_op_button.click() + logger.info(f'成功进去普通采购单页面。') + commonFuc.step_ok_info(commonFuc(), "成功进去普通采购单页面。") + except Exception as e: + logger.error(f'进入普通采购单界面问题:{e.__doc__}{traceback.format_exc()}') + commonFuc.step_fail_info(commonFuc(), self.driver, "进入普通采购单界面出现问题。") + + def enter_new_op_frame(self): + try: + # 先进入到采购iframe + iframe_buy = self.page_buy.get_iframe_buy() + # 转到这个iframe下 + self.page_buy.switch_to_iframe(iframe_buy) + # 获取新建按钮 + new_create_button = self.page_buy.get_new() + # 点击新建 + self.page_buy.single_click(new_create_button) + + # 后续操作在一对话框形式的iframe里,切换到这个子iframe + sub_iframe_dialog = self.page_buy.get_sub_iframe_dialog() + self.page_buy.switch_to_iframe(sub_iframe_dialog) + logger.info(f'成功打开新建普通采购单界面。') + commonFuc.step_ok_info(commonFuc(), "成功打开新建普通采购单界面。") + except Exception as e: + logger.error(f'进入新建普通采购单界面问题:{e.__doc__}{traceback.format_exc()}') + commonFuc.step_fail_info(commonFuc(), self.driver, "进入新建普通采购单界面出现问题。") + + def input_supplier_bk(self): + try: + # 先从yaml中获取供应商内容 + supplier_content = get_filed_from_yaml(module, "data", "supplier") + # 触发请求供应商按钮 + supplier_request = self.page_buy.get_supplier_request() + self.page_buy.single_click(supplier_request) + # 输入供应商信息 + supplier_input = self.page_buy.get_supplier_input() + self.page_buy.input_text(supplier_input, supplier_content) + # 开始查询,点击搜索按钮查询 + supplier_search = self.page_buy.get_supplier_search() + self.page_buy.single_click(supplier_search) + # 获取供应商dialog + supplier_dialog = self.page_buy.get_supplier_dialog() + # 获取查询结果,先获取结果表 + supplier_table = self.page_buy.get_table_from_dialog(supplier_dialog) + # 获取供应商表中的所有行 + supplier_table_rows = self.page_buy.get_all_rows_from_tale(supplier_table) + # 遍历供应商 + for i, current_row in enumerate(supplier_table_rows): + self.page_buy.single_click(current_row) + # 获取当前供应商的列信息 + columns = self.page_buy.get_all_columns_from_row(current_row) + # 遍历列内容,这里只是先打印出日志,便于查看问题 + for j, curr_column in enumerate(columns): + logger.info( + '查询出供应商表,的第 %s 行,第 %s 列的内容为 %s' % (i, j, self.page_buy.get_text(curr_column))) + # 挑选出一列,因为前端是模糊查询,有可能是供应商编码,有可能是供应商名称,匹配第一条即可 + if (supplier_content in self.page_buy.get_text(columns[1])) or ( + supplier_content in self.page_buy.get_text(columns[2])): + '''选中当前行''' + # self.page_buy.single_click(current_row) + # self.page_buy.single_click(columns[1]) + current_row.click() + '''点击确认''' + supplier_table_ensure = self.page_buy.get_ensure_from_dialog(supplier_dialog) + self.page_buy.single_click(supplier_table_ensure) + commonFuc.step_ok_info(commonFuc(), f'供应商{supplier_content}输入成功。') + '''选中后退出,不再查询''' + break + logger.info(f'供应商{supplier_content}输入成功。') + except Exception as e: + logger.error(f'输入供应商问题:{e.__doc__}{traceback.format_exc()}') + commonFuc.step_fail_info(commonFuc(), self.driver, "输入供应商出现问题。") + + def input_supplier(self): + try: + # 先从yaml中获取供应商内容 + supplier_content = get_filed_from_yaml(module, "data", "supplier") + # 获取供应商输入内容元素 + supplier_input = self.page_buy.get_supplier_content() + # 输入供应商 + self.page_buy.input_text(supplier_input, supplier_content) + logger.info(f'供应商{supplier_content}输入成功。') + commonFuc.step_ok_info(commonFuc(), f'供应商{supplier_content}输入成功。') + except Exception as e: + logger.error(f'输入供应商问题:{e.__doc__}{traceback.format_exc()}') + commonFuc.step_fail_info(commonFuc(), self.driver, "输入供应商出现问题。") + + def input_warehouse_bk(self): + try: + # 先从yaml中获取仓库内容 + ware_content = get_filed_from_yaml(module, "data", "warehouse") + # 点击仓库请求按钮 + ware_request = self.page_buy.get_ware_request() + self.page_buy.single_click(ware_request) + # 输入仓库数据 + # ware_input = self.page_buy.get_ware_input() + # self.page_buy.input_text(ware_input, ware_content) + # 搜索仓库信息 + ware_search = self.page_buy.get_ware_search() + self.page_buy.single_click(ware_search) + # 仓库dialog + ware_dialog = self.page_buy.get_ware_dialog() + # 确定仓库信息的表 + ware_table = self.page_buy.get_table_from_dialog(ware_dialog) + # 获取该表下的行数据集 + ware_table_rows = self.page_buy.get_all_rows_from_tale(ware_table) + logger.info("仓库表的行数:%s" % len(ware_table_rows)) + # 遍历仓库表行 + for i, current_row in enumerate(ware_table_rows): + # 获取当前行的列 + columns = self.page_buy.get_all_columns_from_row(current_row) + + logger.info(f'仓库表第{i}行一共有{len(columns)}列。') + # 遍历列内容,这里只是先打印出日志,便于查看问题 + for j, curr_column in enumerate(columns): + logger.info( + '查询出仓库表,的第 %s 行,第 %s 列的内容为 %s' % (i, j, self.page_buy.get_text(curr_column))) + # 挑选出一列,因为前端是模糊查询,有可能是仓库编码,有可能是仓库名称,匹配第一条即可 + if (ware_content in self.page_buy.get_text(columns[1])) or ( + ware_content in self.page_buy.get_text(columns[2])): + '''选中当前行''' + # self.driver.execute_script("arguments[0].click();", current_row) + # self.page_buy.single_click(current_row) + self.page_buy.select_one_row(current_row) + '''点击确认''' + ware_table_ensure = self.page_buy.get_ensure_from_dialog(ware_dialog) + self.page_buy.single_click(ware_table_ensure) + commonFuc.step_ok_info(commonFuc(), f'仓库{ware_content}输入成功。') + '''选中后退出,不再查询''' + break + logger.info(f'仓库{ware_content}输入成功。') + except Exception as e: + logger.error(f'输入仓库问题:{e.__doc__}{traceback.format_exc()}') + commonFuc.step_fail_info(commonFuc(), self.driver, "输入仓库出现问题。") + + def input_warehouse_bk(self): + try: + # 先从yaml中获取仓库内容 + ware_content = get_filed_from_yaml(module, "data", "warehouse") + # 点击仓库请求按钮 + ware_request = self.page_buy.get_ware_request() + self.page_buy.single_click(ware_request) + # 输入仓库数据 + # ware_input = self.page_buy.get_ware_input() + # self.page_buy.input_text(ware_input, ware_content) + # 搜索仓库信息 + ware_search = self.page_buy.get_ware_search() + self.page_buy.single_click(ware_search) + # 仓库dialog + ware_dialog = self.page_buy.get_ware_dialog() + # 确定仓库信息的表 + ware_table = self.page_buy.get_table_from_dialog(ware_dialog) + # 获取该表下的行数据集 + ware_table_rows = self.page_buy.get_all_rows_from_tale(ware_table) + logger.info("仓库表的行数:%s" % len(ware_table_rows)) + # 遍历仓库表行 + for i, current_row in enumerate(ware_table_rows): + # 获取当前行的列 + columns = self.page_buy.get_all_columns_from_row(current_row) + + logger.info(f'仓库表第{i}行一共有{len(columns)}列。') + # 遍历列内容,这里只是先打印出日志,便于查看问题 + for j, curr_column in enumerate(columns): + logger.info( + '查询出仓库表,的第 %s 行,第 %s 列的内容为 %s' % (i, j, self.page_buy.get_text(curr_column))) + # 挑选出一列,因为前端是模糊查询,有可能是仓库编码,有可能是仓库名称,匹配第一条即可 + if (ware_content in self.page_buy.get_text(columns[1])) or ( + ware_content in self.page_buy.get_text(columns[2])): + '''选中当前行''' + # self.driver.execute_script("arguments[0].click();", current_row) + # self.page_buy.single_click(current_row) + self.page_buy.select_one_row(current_row) + '''点击确认''' + ware_table_ensure = self.page_buy.get_ensure_from_dialog(ware_dialog) + self.page_buy.single_click(ware_table_ensure) + '''选中后退出,不再查询''' + break + logger.info(f'仓库{ware_content}输入成功。') + except Exception as e: + logger.error(f'输入仓库问题:{e.__doc__}{traceback.format_exc()}') + assert False + + def input_warehouse(self): + try: + # 先从yaml中获取仓库内容 + ware_content = get_filed_from_yaml(module, "data", "warehouse") + # 点击仓库输入内容元素 + warehouse_content_input = self.page_buy.get_warehouse_content() + # 输入仓库信息 + self.page_buy.input_text(warehouse_content_input, ware_content) + logger.info(f'仓库{ware_content}输入成功。') + commonFuc.step_ok_info(commonFuc(), f'仓库{ware_content}输入成功。') + except Exception as e: + logger.error(f'输入仓库问题:{e.__doc__}{traceback.format_exc()}') + commonFuc.step_fail_info(commonFuc(), self.driver, "输入仓库出现问题。") + + def input_protocol(self): + try: + # 先从yaml中获取协议内容 + protocol_content = get_filed_from_yaml(module, "data", "protocol") + # 获取协议输入内容元素 + protocol_content_input = self.page_buy.get_protocol_context() + # 输入仓库信息 + self.page_buy.input_text(protocol_content_input, protocol_content) + logger.info(f'协议{protocol_content}输入成功。') + commonFuc.step_ok_info(commonFuc(), f'协议{protocol_content}输入成功。') + except Exception as e: + logger.error(f'输入协议问题:{e.__doc__}{traceback.format_exc()}') + commonFuc.step_fail_info(commonFuc(), self.driver, "输入协议出现问题。") + + def input_businessman(self): + try: + # 先从yaml中获取协议内容 + businessman_content = get_filed_from_yaml(module, "data", "businessman") + # 获取业务员输入内容元素 + businessman_content_input = self.page_buy.get_businessman_content() + # 输入业务员 + self.page_buy.input_text(businessman_content_input, businessman_content) + logger.info(f'业务员{businessman_content}输入成功。') + commonFuc.step_ok_info(commonFuc(), f'业务员{businessman_content}输入成功。') + except Exception as e: + logger.error(f'输入业务员问题:{e.__doc__}{traceback.format_exc()}') + commonFuc.step_fail_info(commonFuc(), self.driver, "输入业务员出现问题。") + + def add_merchandise(self): + try: + # 先从yaml中获取协议内容 + merchandise_content = get_filed_from_yaml(module, "data", "merchandise") + # 点击商品录入按钮 + merchandise = self.page_buy.get_merchandise() + self.page_buy.single_click(merchandise) + # 获取商品dialog + merchandise_dialog = self.page_buy.get_merchandise_dialog() + # 输入商品信息 + # merchandise_input = self.page.get_input_from_dialog(merchandise_dialog) + merchandise_input = self.page_buy.get_merchandise_input() + self.page_buy.input_text(merchandise_input, merchandise_content) + # 点击搜索 + # merchandise_search = self.page.get_search_from_dialog(merchandise_dialog) + merchandise_search = self.page_buy.get_merchandise_search() + self.page_buy.single_click(merchandise_search) + # 获取搜索出来的表信息 + merchandise_table = self.page_buy.get_table_from_dialog(merchandise_dialog) + # 获取表的全部行 + merchandise_table_rows = self.page_buy.get_all_rows_from_tale(merchandise_table) + # 遍历行 + for i, current_row in enumerate(merchandise_table_rows): + # 获取当前供应商的列信息 + columns = self.page_buy.get_all_columns_from_row(current_row) + # 遍历列内容,这里只是先打印出日志,便于查看问题 + for j, curr_column in enumerate(columns): + logger.info( + '查询出商品表,的第 %s 行,第 %s 列的内容为 %s' % (i, j, self.page_buy.get_text(curr_column))) + # 挑选出一列,模糊查询,匹配商品编码,商品名称,规格型号,厂家物料编码 + if ((merchandise_content in self.page_buy.get_text(columns[1])) or + (merchandise_content in self.page_buy.get_text(columns[3])) or + (merchandise_content in self.page_buy.get_text(columns[4])) or + (merchandise_content in self.page_buy.get_text(columns[6]))): + '''选中当前行''' + '''先获取复选框''' + box = self.page_buy.get_merchandise_all_select() + self.page_buy.single_click(box) + '''点击确认''' + ensure = self.page_buy.get_ensure_from_dialog(merchandise_dialog) + self.page_buy.single_click(ensure) + commonFuc.step_ok_info(commonFuc(), f'商品{merchandise_content}输入成功。') + '''选中后退出,不再查询''' + break + logger.info(f'商品{merchandise_content}输入成功。') + except Exception as e: + logger.error(f'添加商品问题:{e.__doc__}{traceback.format_exc()}') + commonFuc.step_fail_info(commonFuc(), self.driver, "输入商品出现问题。") + + def detail_proc(self): + try: + # 获取商品明细表 + detail_table = self.page_buy.get_detail_table() + # 获取明细表中所有行 + detail_rows = self.page_buy.get_all_rows_from_tale(detail_table) + # 遍历商品行,填入商品数量 + for i, current_row in enumerate(detail_rows): + # 获取当前行所有的列 + columns = self.page_buy.get_all_columns_from_row(current_row) + # 遍历列内容,这里只是先打印出日志,便于查看问题 + for j, curr_column in enumerate(columns): + # 第1列columns[1]为数量 + if j == 1: + # 先点击该元素 + self.page_buy.single_click(columns[j]) + # 再获取输入元素信息 + quantity_element = self.page_buy.get_input_from_column(columns[j]) + # 输入数量 + quantity_element.clear() + self.page_buy.input_text(quantity_element, 1000) + # 第10列columns[10]为含税单价 + if j == 10: + # 先点击该元素 + self.page_buy.single_click(columns[j]) + # 再获取输入元素信息 + price_element = self.page_buy.get_input_from_column(columns[j]) + # 输入价格 + price_element.clear() + self.page_buy.input_text(price_element, 100) + + logger.info('详情清单,的第 %s 行,第 %s 列的内容为 %s' % (i, j, self.page_buy.get_text(curr_column))) + logger.info(f'商品明细处理成功。') + commonFuc.step_ok_info(commonFuc(), f'商品明细处理成功。') + except Exception as e: + logger.error(f'商品明细处理问题:{e.__doc__}{traceback.format_exc()}') + commonFuc.step_fail_info(commonFuc(), self.driver, "商品明细处理出现问题。") + + def save_proc(self): + try: + # 保存 + save_button = self.page_buy.get_save() + self.page_buy.single_click(save_button) + # 获取采购单号 + order_no = self.page_buy.get_order_no() + logger.info("订单号:%s" % self.page_buy.get_text(order_no)) + commonFuc.step_ok_info(commonFuc(), f'订单{self.page_buy.get_text(order_no)}保存成功。') + except Exception as e: + logger.error(f'商品明细处理问题:{e.__doc__}{traceback.format_exc()}') + commonFuc.step_fail_info(commonFuc(), self.driver, "保存订单出现问题。") + + def submit_proc(self): + try: + # 提交 + submit_button = self.page_buy.get_submit_element() + self.page_buy.single_click(submit_button) + commonFuc.step_ok_info(commonFuc(), f'订单提交成功。') + except Exception as e: + logger.error(f'商品明细处理问题:{e.__doc__}{traceback.format_exc()}') + commonFuc.step_fail_info(commonFuc(), self.driver, "保存提交出现问题。") diff --git a/actions/actions_login/__init__.py b/actions/actions_login/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..894621a30f140108fbf7b832267f0b6e8ae71f5c --- /dev/null +++ b/actions/actions_login/__init__.py @@ -0,0 +1,8 @@ +#!/user/bin/env python3 +# -*- coding: utf-8 -*- +# ddate:2023/11/24 15:21 +__author__: "qinguanglei" + +""" +case_tag:case +""" diff --git a/test_login/page_login.py b/actions/actions_login/page_login.py similarity index 97% rename from test_login/page_login.py rename to actions/actions_login/page_login.py index d80bb3113b7be54c4ba17cf094856c5beadc69af..77f48d26c89766e5c0d844a9e2a1be8424aa0748 100644 --- a/test_login/page_login.py +++ b/actions/actions_login/page_login.py @@ -1,6 +1,8 @@ # author:qinguanglei # ddate:2023/11/16 11:13 +from airtest_selenium.proxy import * from selenium.webdriver.common.by import By + from page_class.base_page import BasePage diff --git a/test_login/steps_login.py b/actions/actions_login/steps_login.py similarity index 61% rename from test_login/steps_login.py rename to actions/actions_login/steps_login.py index 65ce88a896e6d2f85932a8378c04f4c5cd9565e6..c38336855769bd49b411804be32f2b495be42ef0 100644 --- a/test_login/steps_login.py +++ b/actions/actions_login/steps_login.py @@ -1,16 +1,16 @@ # author:qinguanglei # ddate:2023/11/16 16:46 -import datetime -import random -import time import traceback + +from actions.actions_login.page_login import PageLogin from common import constant -from common.logger import log +from common.logger import logger from common.read_yaml import get_filed_from_yaml from common.verifycode import VerifyCode -from test_login.page_login import PageLogin +from common.common_func import commonFuc +from airtest.core.api import * -module = 'test_login' +module = 'login' class StepsLogin(object): @@ -20,11 +20,12 @@ class StepsLogin(object): def open_browser(self): try: - log.info('当前url: %s', get_filed_from_yaml(module, "data", "url")) + logger.info('当前url: %s', get_filed_from_yaml(module, "data", "url")) self.page_login.open_page(get_filed_from_yaml(module, "data", "url")) + commonFuc.step_ok_info(commonFuc(), "浏览器打开成功。") except Exception as e: - log.error(f'打开浏览器问题:{e.__doc__}{traceback.format_exc()}') - assert False + commonFuc.step_fail_info(commonFuc(), self.driver, "浏览器打开失败。") + logger.error(f'打开浏览器问题:{e.__doc__}{traceback.format_exc()}') def enter_account_password(self, flag): try: @@ -49,9 +50,10 @@ class StepsLogin(object): self.page_login.input_text(account_element, account) if flag == 0 or flag == 2 or flag == 3 or flag == 4: self.page_login.input_text(password_element, password) + commonFuc.step_ok_info(commonFuc(), "成功输入账号密码。") except Exception as e: - log.error(f'账号密码输入过程出现问题:{e.__doc__}{traceback.format_exc()}') - assert False + commonFuc.step_fail_info(commonFuc(), self.driver, "输入账号密码失败。") + logger.error(f'账号密码输入过程出现问题:{e.__doc__}{traceback.format_exc()}') def enter_verify_code(self, flag): try: @@ -68,10 +70,11 @@ class StepsLogin(object): verify_code_text = '4571' if flag == 1 or flag == 0: self.page_login.input_text(verify_input_element, verify_code_text) - log.info(f'输入的验证码为:{verify_code_text}') + logger.info(f'输入的验证码为:{verify_code_text}') + commonFuc.step_ok_info(commonFuc(), "成功输入验证码。") except Exception as e: - log.error(f'获取验证码问题:{e.__doc__}{traceback.format_exc()}') - assert False + logger.error(f'获取验证码问题:{e.__doc__}{traceback.format_exc()}') + commonFuc.step_fail_info(commonFuc(), self.driver, "输入验证码失败。") def click_login_button(self): try: @@ -79,24 +82,25 @@ class StepsLogin(object): login_button_element = self.page_login.get_login_button() # 点击登录 self.page_login.single_click(login_button_element) + commonFuc.step_ok_info(commonFuc(), "点击登录正常。") except Exception as e: - log.error(f'点击登录动作出现问题:{e.__doc__}{traceback.format_exc()}') - assert False + logger.error(f'点击登录动作出现问题:{e.__doc__}{traceback.format_exc()}') + commonFuc.step_fail_info(commonFuc(), self.driver, "点击登录失败。") def judge_result(self): try: # 判断登录是否成功,登录成功会切换到另外一个页面,通过页面title来判断是否切换成功 if self.page_login.get_window_title() == constant.LOGIN_SUCCESS: - assert True + commonFuc.step_ok_info(commonFuc(), "成功登录。") else: - log.error('案例执行失败') - log.error(f'self.page_login.get_window_title()={self.page_login.get_window_title()}') - log.error(f'constant.LOGIN_SUCCESS={constant.LOGIN_SUCCESS}') - log.error('self.page_login.get_window_title()与constant.LOGIN_SUCCESS不一致') - assert False + logger.error('案例执行失败') + logger.error(f'self.page_login.get_window_title()={self.page_login.get_window_title()}') + logger.error(f'constant.LOGIN_SUCCESS={constant.LOGIN_SUCCESS}') + logger.error('self.page_login.get_window_title()与constant.LOGIN_SUCCESS不一致') + commonFuc.step_fail_info(commonFuc(), self.driver, "登录失败。") except Exception as e: - log.error(f'判断是否登录成功问题:{e.__doc__}{traceback.format_exc()}') - assert False + logger.error(f'判断是否登录成功问题:{e.__doc__}{traceback.format_exc()}') + commonFuc.step_fail_info(commonFuc(), self.driver, "登录失败。") def judge_result_error(self, flag): try: @@ -124,14 +128,14 @@ class StepsLogin(object): result_value = constant.NO_VERIFY_CODE if result_value in self.page_login.get_text(login_result_element): - assert True + commonFuc.step_ok_info(commonFuc(), "登录结果错误与预期错误一致。") else: - log.error('登录错误结果校验,案例执行失败') - log.error( + logger.error('登录错误结果校验,案例执行失败') + logger.error( f'self.page_login.get_text(login_result_element)={self.page_login.get_text(login_result_element)}') - log.error(f'result_value={result_value}') - log.error('self.page_login.get_text(login_result_element)与result_value不一致') - assert False + logger.error(f'result_value={result_value}') + logger.error('self.page_login.get_text(login_result_element)与result_value不一致') + commonFuc.step_fail_info(commonFuc(), self.driver, "登录结果错误与预期错误不一致。") except Exception as e: - log.error(f'登录错误结果校验问题:{e.__doc__}{traceback.format_exc()}') - assert False + logger.error(f'登录错误结果校验问题:{e.__doc__}{traceback.format_exc()}') + commonFuc.step_fail_info(commonFuc(), self.driver, "登录结果错误与预期错误不一致。") diff --git a/air_case/case_buy/case_buy_one_nonseq_commodity.air/case_buy_one_nonseq_commodity.py b/air_case/case_buy/case_buy_one_nonseq_commodity.air/case_buy_one_nonseq_commodity.py new file mode 100644 index 0000000000000000000000000000000000000000..24fd4c231041b0242c7e1d756c363539a37c367e --- /dev/null +++ b/air_case/case_buy/case_buy_one_nonseq_commodity.air/case_buy_one_nonseq_commodity.py @@ -0,0 +1,51 @@ +#!/user/bin/env python3 +# -*- coding: utf-8 -*- +# ddate:2023/12/8 9:06 +__author__ = "qinguanglei" + +import time + +# 购买一个非序列号商品 + +""" +case_tag:case,buy,case_buy_one_nonseq_commodity +""" + +from actions.actions_buy.steps_buy import StepsBuy +from airtest_selenium.proxy import WebChrome + +"""家庭作业""" +# 获取驱动器 +driver = WebChrome() +driver.implicitly_wait(20) +# 最大化页面 +driver.maximize_window() + +"""开始执行案例""" +# 载入步骤集合 +steps_buy = StepsBuy(driver) +# 打开浏览器 +steps_buy.open_browser() +# 登录 +steps_buy.login() +# 进入普通采购单页面 +steps_buy.enter_buy_op_page() +# 进入新建单据界面 +steps_buy.enter_new_op_frame() +# 输入供应商 +steps_buy.input_supplier() +# 输入仓库 +steps_buy.input_warehouse() +# 输入合同协议 +steps_buy.input_protocol() +# 输入业务员员 +steps_buy.input_businessman() +# 添加商品 +steps_buy.add_merchandise() +# 商品明细处理 +steps_buy.detail_proc() +# 订单保存处理 +steps_buy.save_proc() +# 订单提交 +steps_buy.submit_proc() +time.sleep(15) diff --git a/air_case/case_login/case_login_no_input_userid.air/case_login_no_input_userid.py b/air_case/case_login/case_login_no_input_userid.air/case_login_no_input_userid.py index bda9514710e0a651540aae511a384f8d83445e88..38dad9b22e437ab70111164bfb2d03b7024ffd4a 100644 --- a/air_case/case_login/case_login_no_input_userid.air/case_login_no_input_userid.py +++ b/air_case/case_login/case_login_no_input_userid.air/case_login_no_input_userid.py @@ -1,22 +1,22 @@ # author:qinguanglei # ddate:2023/11/17 15:54 +__author__ = "qinguanglei" """ -case_tag:case,case_login,case_login_no_input_userid +case_tag:case,login,case_login_no_input_userid """ -from selenium import webdriver -from test_login.steps_login import StepsLogin +from actions.actions_login.steps_login import StepsLogin +from airtest_selenium.proxy import WebChrome - -option = webdriver.ChromeOptions() -# option.add_experimental_option("detach", True) # 设置不要自动关闭浏览器 +"""家庭作业""" # 获取驱动器 -driver = webdriver.Chrome(options=option) +driver = WebChrome() +driver.implicitly_wait(20) # 最大化页面 driver.maximize_window() - +"""开始执行案例""" # 载入步骤集合 steps_login = StepsLogin(driver) # 打开浏览器 @@ -29,6 +29,3 @@ steps_login.enter_verify_code(0) steps_login.click_login_button() # 判断结果 steps_login.judge_result_error(2) - - - diff --git a/air_case/case_login/case_login_no_input_verifycode.air/case_login_no_input_verifycode.py b/air_case/case_login/case_login_no_input_verifycode.air/case_login_no_input_verifycode.py index 3380ae34c81e6e23456a2c990d35f7a45b1d4523..551ad1ab729c009712d148f2998309a16f4e547f 100644 --- a/air_case/case_login/case_login_no_input_verifycode.air/case_login_no_input_verifycode.py +++ b/air_case/case_login/case_login_no_input_verifycode.air/case_login_no_input_verifycode.py @@ -1,18 +1,20 @@ # author:qinguanglei # ddate:2023/11/20 9:56 +__author__ = "qinguanglei" + """ -case_tag:case,case_login,case_login_no_input_verifycode +case_tag:case,login,case_login_no_input_verifycode """ -from selenium import webdriver -from test_login.steps_login import StepsLogin +from airtest_selenium.proxy import * +from actions.actions_login.steps_login import StepsLogin """家庭作业""" -option = webdriver.ChromeOptions() -# option.add_experimental_option("detach", True) # 设置不要自动关闭浏览器 # 获取驱动器 -driver = webdriver.Chrome(options=option) +driver = WebChrome() # 最大化页面 driver.maximize_window() +# 加载 +driver.implicitly_wait(20) """开始执行案例""" # 载入步骤集合 diff --git a/air_case/case_login/case_login_password_error.air/case_login_password_error.py b/air_case/case_login/case_login_password_error.air/case_login_password_error.py index c5a8a61137dbd2e2ec306cf5f4e9a64ebb130e55..37279e5ed5fa0624502d2c9016f4aa20e491bb92 100644 --- a/air_case/case_login/case_login_password_error.air/case_login_password_error.py +++ b/air_case/case_login/case_login_password_error.air/case_login_password_error.py @@ -1,19 +1,20 @@ # author:qinguanglei # ddate:2023/11/20 9:43 +__author__ = "qinguanglei" + """ -case_tag:case,case_login,case_login_password_error +case_tag:case,login,case_login_password_error """ -from selenium import webdriver -from test_login.steps_login import StepsLogin +from airtest_selenium.proxy import * +from actions.actions_login.steps_login import StepsLogin """家庭作业""" -option = webdriver.ChromeOptions() -# option.add_experimental_option("detach", True) # 设置不要自动关闭浏览器 # 获取驱动器 -driver = webdriver.Chrome(options=option) +driver = WebChrome() # 最大化页面 driver.maximize_window() - +# 加载 +driver.implicitly_wait(20) """开始执行案例""" # 载入步骤集合 @@ -28,7 +29,3 @@ steps_login.enter_verify_code(0) steps_login.click_login_button() # 判断结果 steps_login.judge_result_error(1) - - - - diff --git a/air_case/case_login/case_login_success.air/case_login_success.py b/air_case/case_login/case_login_success.air/case_login_success.py index bd108a3aa4747fff4dde7a1613e59517c4a5312e..530eb49687e441c67a73fb1ea1ee74e22906c295 100644 --- a/air_case/case_login/case_login_success.air/case_login_success.py +++ b/air_case/case_login/case_login_success.air/case_login_success.py @@ -1,19 +1,20 @@ # author:qinguanglei # ddate:2023/11/16 11:18 +__author__ = "qinguanglei" + """ -case_tag:case,case_login,case_login_success +case_tag:case,login,case_login_success """ -from selenium import webdriver -from test_login.steps_login import StepsLogin +from airtest_selenium.proxy import * +from actions.actions_login.steps_login import StepsLogin """家庭作业""" -option = webdriver.ChromeOptions() -# option.add_experimental_option("detach", True) # 设置不要自动关闭浏览器 # 获取驱动器 -driver = webdriver.Chrome(options=option) +driver = WebChrome() # 最大化页面 driver.maximize_window() - +# 加载 +driver.implicitly_wait(20) """开始执行案例""" # 载入步骤集合 diff --git a/air_case/case_login/case_login_userid_error.air/case_login_userid_error.py b/air_case/case_login/case_login_userid_error.air/case_login_userid_error.py index 72a3144643a3d7d6a8e0bb8a98404ce9f6a8a4b1..1c7f08ce8cc3aed74ba7f1eeb3c5f4df9a41aafa 100644 --- a/air_case/case_login/case_login_userid_error.air/case_login_userid_error.py +++ b/air_case/case_login/case_login_userid_error.air/case_login_userid_error.py @@ -1,19 +1,21 @@ # author:qinguanglei # ddate:2023/11/20 9:23 +__author__ = "qinguanglei" + """ -case_tag:case,case_login,case_login_userid_error +case_tag:case,login,case_login_userid_error """ -from selenium import webdriver -from test_login.steps_login import StepsLogin + +from airtest_selenium.proxy import * +from actions.actions_login.steps_login import StepsLogin """家庭作业""" -option = webdriver.ChromeOptions() -# option.add_experimental_option("detach", True) # 设置不要自动关闭浏览器 # 获取驱动器 -driver = webdriver.Chrome(options=option) +driver = WebChrome() # 最大化页面 driver.maximize_window() - +# 加载 +driver.implicitly_wait(20) """开始执行案例""" # 载入步骤集合 diff --git a/air_case/case_login/case_login_verify_code_error.air/case_login_verify_code_error.py b/air_case/case_login/case_login_verify_code_error.air/case_login_verify_code_error.py index c27bedd30f7c464bf5e07d2b6dd4a1b264b4d3c1..b0689a6b48d88e10acb3aa17a0dde2b1bae67987 100644 --- a/air_case/case_login/case_login_verify_code_error.air/case_login_verify_code_error.py +++ b/air_case/case_login/case_login_verify_code_error.air/case_login_verify_code_error.py @@ -1,19 +1,21 @@ # author:qinguanglei # ddate:2023/11/16 16:40 +__author__ = "qinguanglei" + """ -case_tag:case,case_login,case_login_verify_code_error +case_tag:case,login,case_login_verify_code_error """ -from selenium import webdriver -from test_login.steps_login import StepsLogin + +from airtest_selenium.proxy import * +from actions.actions_login.steps_login import StepsLogin """家庭作业""" -option = webdriver.ChromeOptions() -# option.add_experimental_option("detach", True) # 设置不要自动关闭浏览器 # 获取驱动器 -driver = webdriver.Chrome(options=option) +driver = WebChrome() # 最大化页面 driver.maximize_window() - +# 加载 +driver.implicitly_wait(20) """开始执行案例""" # 载入步骤集合 diff --git a/air_case/demo/baidu.air/baidu.py b/air_case/demo/baidu.air/baidu.py index e40475a493b4d65dc2cfa4ab9f376de6e77b30b6..def0e034689fcf8ea09e5449672b3d86e2356ba8 100644 --- a/air_case/demo/baidu.air/baidu.py +++ b/air_case/demo/baidu.air/baidu.py @@ -16,7 +16,9 @@ sleep(4) driver.find_element_by_id("kw").send_keys("airtest") sleep(4) -driver.airtest_touch(Template(r"tpl1691374901526.png", record_pos=(12.3, 2.8), resolution=(100, 100))) +driver.snapshot() + +#driver.airtest_touch(Template(r"tpl1691374901526.png", record_pos=(12.3, 2.8), resolution=(100, 100))) diff --git a/air_case/demo/baidu1.air/baidu1.py b/air_case/demo/baidu1.air/baidu1.py deleted file mode 100644 index e52936ca9d4894e490aba8ec41b58bc2a6a35d91..0000000000000000000000000000000000000000 --- a/air_case/demo/baidu1.air/baidu1.py +++ /dev/null @@ -1,31 +0,0 @@ -# -*- encoding=utf8 -*- -__author__ = "Administrator" - - -""" -case_tag:api,baidu,sit,on -""" - - -from airtest.core.api import * -from selenium import webdriver -from selenium.webdriver.common.keys import Keys -from airtest_selenium.proxy import * -driver = WebChrome() -driver.implicitly_wait(20) -driver.get("https://www.baidu.com") -sleep(4) -driver.find_element_by_id("kw").send_keys("airtest") -sleep(4) - -driver.airtest_touch(Template(r"tpl1691374901526.png", record_pos=(12.3, 2.8), resolution=(100, 100))) - - - - - - - - - - diff --git a/air_case/demo/baidu1.air/tpl1691374901523.png b/air_case/demo/baidu1.air/tpl1691374901523.png deleted file mode 100644 index 6ffd5af4c861fc8bbfb9766c4a5bd9819f2494b2..0000000000000000000000000000000000000000 Binary files a/air_case/demo/baidu1.air/tpl1691374901523.png and /dev/null differ diff --git a/air_case/demo/baidu1.air/tpl1691374901526.png b/air_case/demo/baidu1.air/tpl1691374901526.png deleted file mode 100644 index 934889ce7271e6c611d50aa16fede484a7485b7c..0000000000000000000000000000000000000000 Binary files a/air_case/demo/baidu1.air/tpl1691374901526.png and /dev/null differ diff --git a/air_case/demo/baidu1.air/tpl1691375285206.png b/air_case/demo/baidu1.air/tpl1691375285206.png deleted file mode 100644 index 7970a269177baa880b83a462fad289d9db62d2a7..0000000000000000000000000000000000000000 Binary files a/air_case/demo/baidu1.air/tpl1691375285206.png and /dev/null differ diff --git a/air_case/demo/baidu2.air/baidu2.py b/air_case/demo/baidu2.air/baidu2.py deleted file mode 100644 index e40475a493b4d65dc2cfa4ab9f376de6e77b30b6..0000000000000000000000000000000000000000 --- a/air_case/demo/baidu2.air/baidu2.py +++ /dev/null @@ -1,29 +0,0 @@ -# -*- encoding=utf8 -*- -__author__ = "Administrator" - - -""" -case_tag:api,baidu,sit,on -""" -from airtest.core.api import * -from selenium import webdriver -from selenium.webdriver.common.keys import Keys -from airtest_selenium.proxy import * -driver = WebChrome() -driver.implicitly_wait(20) -driver.get("https://www.baidu.com") -sleep(4) -driver.find_element_by_id("kw").send_keys("airtest") -sleep(4) - -driver.airtest_touch(Template(r"tpl1691374901526.png", record_pos=(12.3, 2.8), resolution=(100, 100))) - - - - - - - - - - diff --git a/air_case/demo/baidu2.air/tpl1691374901523.png b/air_case/demo/baidu2.air/tpl1691374901523.png deleted file mode 100644 index 6ffd5af4c861fc8bbfb9766c4a5bd9819f2494b2..0000000000000000000000000000000000000000 Binary files a/air_case/demo/baidu2.air/tpl1691374901523.png and /dev/null differ diff --git a/air_case/demo/baidu2.air/tpl1691374901526.png b/air_case/demo/baidu2.air/tpl1691374901526.png deleted file mode 100644 index 934889ce7271e6c611d50aa16fede484a7485b7c..0000000000000000000000000000000000000000 Binary files a/air_case/demo/baidu2.air/tpl1691374901526.png and /dev/null differ diff --git a/air_case/demo/baidu2.air/tpl1691375285206.png b/air_case/demo/baidu2.air/tpl1691375285206.png deleted file mode 100644 index 7970a269177baa880b83a462fad289d9db62d2a7..0000000000000000000000000000000000000000 Binary files a/air_case/demo/baidu2.air/tpl1691375285206.png and /dev/null differ diff --git a/air_case/demo/httpget-demo.air/httpget-demo.py b/air_case/demo/httpget-demo.air/httpget-demo.py index c65aa894ffed06266161b0d03b790db4c6ffae50..274c8a0457dbcfc279f73bd05d672ded7ecfed8f 100644 --- a/air_case/demo/httpget-demo.air/httpget-demo.py +++ b/air_case/demo/httpget-demo.air/httpget-demo.py @@ -4,14 +4,14 @@ from common.common_func import commonFuc __author__ = "meimengting" """ -case_tag:api,medical-web11111,sit,on +case_tag:api,medical-web,sit,on """ from airtest.core.api import * -# import sys -# sys.path.append('..') +import sys +sys.path.append('..') from common.db.db import dbOP -# import time +import time # using("common_steps.air") # import common_steps # result_db = dbOP().selectSql('exp_expert', [0, 20]) @@ -20,9 +20,9 @@ from common.db.db import dbOP enc_user_id可替换成接口实际所需要id,默认是u779700044448 获取token和时间戳 """ -# enc_user_id = 'u97969333801' +enc_user_id = 'u97969333801' # token = common_steps.check_token(enc_user_id) -# timestamp = str(int(time.time())) +timestamp = str(int(time.time())) # "按照环境将url管理起来,更改api url后的接口名即可" # url = common_steps.get_api_url() diff --git a/common/cli/runner.py b/common/cli/runner.py index 83099cf2ed74871e830689c26b2cc92dfc715538..24110a2a9f748f1b6169784ab0417cb8cb5b69ce 100644 --- a/common/cli/runner.py +++ b/common/cli/runner.py @@ -14,9 +14,10 @@ from airtest.core.settings import Settings as ST from airtest.utils.compat import decode_path, script_dir_name, script_log_dir from copy import copy +from common.logger import logger as LOG -class AirtestCase(unittest.TestCase): +class AirtestCase(unittest.TestCase): PROJECT_ROOT = "." SCRIPTEXT = ".air" TPLEXT = ".png" @@ -50,17 +51,24 @@ class AirtestCase(unittest.TestCase): def runTest(self): scriptpath, pyfilename = script_dir_name(self.args.script) + LOG.info(f'Final Error1,scriptpath:{scriptpath}') + LOG.info(f'Final Error2,scriptpath:{pyfilename}') pyfilepath = os.path.join(scriptpath, pyfilename) + LOG.info(f'Final Error3,scriptpath:{pyfilename}') pyfilepath = os.path.abspath(pyfilepath) + LOG.info(f'Final Error4,scriptpath:{pyfilename}') self.scope["__file__"] = pyfilepath with open(pyfilepath, 'r', encoding="utf8") as f: code = f.read() pyfilepath = pyfilepath.encode(sys.getfilesystemencoding()) + LOG.info(f'Final Error5,scriptpath:{pyfilename}') + LOG.info(f'code.encode("utf-8"):{code.encode("utf-8")}') try: exec(compile(code.encode("utf-8"), pyfilepath, 'exec'), self.scope) except Exception as err: tb = traceback.format_exc() + LOG.error(f'traceback.format_exc(){traceback.format_exc()}') log("Final Error", tb) six.reraise(*sys.exc_info()) diff --git a/common/common_func.py b/common/common_func.py index d19ca9673ea677854dcf9c7bf3420bdd06beff03..db3e093e0eef5aa98be0ce668fea697b4e32a13c 100644 --- a/common/common_func.py +++ b/common/common_func.py @@ -109,13 +109,14 @@ class commonFuc(object): result = requests.post(url, data=json.dumps(postdata), headers=header) result = json.loads(result.content) return result - #删除请求 - def http_delte(self, url,header): + + # 删除请求 + def http_delte(self, url, header): """ 一个post请求,返回json """ # result = requests.post(url, data=postdata, headers=header) - result = requests.delete(url,headers=header) + result = requests.delete(url, headers=header) result = json.loads(result.content) return result @@ -129,6 +130,9 @@ class commonFuc(object): actual_value = self.analysis_json(k, result) assert_equal(str(v).replace(" ", ""), str(actual_value).replace(" ", "")) + def check_equal(self, one, two): + assert_equal(one, two, f'{one}与{two}不相等,失败') + def analysis_json(self, key, result): """ 解析json @@ -151,7 +155,6 @@ class commonFuc(object): pass return res - def typeof(self, variate): """ 变量类型 @@ -301,6 +304,13 @@ class commonFuc(object): return url + def step_ok_info(self, info): + assert_equal('step_ok', 'step_ok', info) + + def step_fail_info(self, driver, info): + #driver.snapshot() + assert_equal('step_fail', 'step_fail_plus', info) + def login_backend(self, driver): driver.get(self.get_url()) sleep(3) @@ -363,12 +373,13 @@ class commonFuc(object): 结果检查,检查文本内容是否存在于返回结果中 """ Flag = False - check_text=str(check_text) + check_text = str(check_text) # print('bbbbbbbbbbbbbbbbbbbbbbbbb'+str(result.values())) if check_text in str(result.values()): Flag = True # print('aaaaaaaaaaaaaaaaaaaaaaaaaaaaa',Flag) assert_equal(Flag, True, '验证文本' + check_text + "存在") + def check_text_no_exist(self, check_text, result): """ 结果检查,检查文本内容是否存在于返回结果中 @@ -385,7 +396,7 @@ class commonFuc(object): 结果检查,检查文本内容是否存在于返回结果中,返回结果也是文本 """ Flag = False - check_text=str(check_text) + check_text = str(check_text) # print('bbbbbbbbbbbbbbbbbbbbbbbbb'+str(result.values())) if check_text in result_text: Flag = True @@ -522,23 +533,25 @@ class commonFuc(object): chrome.get(url) return chrome - def logIn(self, username, password, login_button,chrome): + def logIn(self, username, password, login_button, chrome): chrome.find_element_by_xpath(username).clear() chrome.find_element_by_xpath(username).send_keys('xhs') chrome.find_element_by_xpath(password).clear() chrome.find_element_by_xpath(password).send_keys('a123456!') chrome.find_element_by_xpath(login_button).click() - def check_login_result(self,username,chrome): + + def check_login_result(self, username, chrome): for i in range(10000): sleep(1) try: if (chrome.find_element_by_xpath('//div[text()=" %s "]' % username)).is_displayed(): - print('看看这里显示了没有',username) + print('看看这里显示了没有', username) break except: continue return chrome.find_element_by_xpath('//div[text()=" %s "]' % username).text - def quit_chrome(self,chrome): + + def quit_chrome(self, chrome): chrome.quit() # 获取当前项目的根目录的路径 @@ -547,4 +560,4 @@ class commonFuc(object): curPath = os.path.abspath(os.path.dirname(__file__)) # 获取当前文件的所在目录的绝对路径 # print(os.path.split(curPath)) rootPath = os.path.split(curPath)[0] - return rootPath \ No newline at end of file + return rootPath diff --git a/common/logger.py b/common/logger.py index a0a5704d97a6aef56bc128cadfb2f66a1053a900..3e6d2876bff4b442747b9ca236b726e4267c5115 100644 --- a/common/logger.py +++ b/common/logger.py @@ -74,4 +74,4 @@ class Log(object): # 实例化,后面直接引入使用 -log = Log().logger +logger = Log().logger diff --git a/common/read_yaml.py b/common/read_yaml.py index c78f3ad1f6b7cbef3891adc96746cc69caeec4d8..0cb8b9a065069d132c465dcd4be2aad3acf1949a 100644 --- a/common/read_yaml.py +++ b/common/read_yaml.py @@ -3,7 +3,7 @@ # 该功能为读取yaml数据功能 import yaml import os -from common.logger import log +from common.logger import logger def read_yaml(yaml_path): @@ -11,7 +11,7 @@ def read_yaml(yaml_path): 参数path: 相对路径,起始路径:项目的根目录 realPath: 文件的真实路径,绝对路径地址 ''' if not os.path.isfile(yaml_path): - log.error("文件路径不存在,请检查路径是否正确:%s" % yaml_path) + logger.error("文件路径不存在,请检查路径是否正确:%s" % yaml_path) raise FileNotFoundError("文件路径不存在,请检查路径是否正确:%s" % yaml_path) # open方法打开直接读出来 f = open(yaml_path, 'r', encoding='utf-8') @@ -31,9 +31,9 @@ def get_filed_from_yaml(module, file, field): project_dir = os.path.dirname(common_dir) # 开始拼接目录 yaml_path = project_dir + os.sep + "data" + os.sep + module + os.sep + file + ".yaml" - log.info(f'当前的yaml文件路径:{yaml_path}') + logger.info(f'当前的yaml文件路径:{yaml_path}') # 获取读取的结果,为字典形式 dictionary = read_yaml(yaml_path) - log.info(f'文件{file}中字段{field}值为{dictionary[field]}') + logger.info(f'文件{file}中字段{field}值为{dictionary[field]}') # 专门返回指定的栏位 return dictionary[field] diff --git a/common/verifycode.py b/common/verifycode.py index e6c856f09ae667150f3ec4f2fee2d92425985a32..cde0a2abf09284a81ec3d8365c24b5d482e60c2c 100644 --- a/common/verifycode.py +++ b/common/verifycode.py @@ -2,11 +2,11 @@ import os from pytesseract import image_to_string from PIL import Image, ImageEnhance -from common.logger import log +from common.logger import logger def gen_text_from_picture(element_screenshot_path): - log.info('开始解析验证码') + logger.info('开始解析验证码') # 打开图片,将图片转换为obj image = Image.open(element_screenshot_path) # 图片2直化 @@ -20,7 +20,7 @@ def gen_text_from_picture(element_screenshot_path): verify_code_text = image_to_string(image2) # 针对平台,去掉最后一个字符“\n”,不同的平台最后一个字符可能不一样 verify_code_text_no_wrap = verify_code_text.replace('\n', '') - log.info("当前验证码的文字为:" + verify_code_text_no_wrap) + logger.info("当前验证码的文字为:" + verify_code_text_no_wrap) # 使用完成后关闭 image.close() # 返回验证码 @@ -52,21 +52,21 @@ class VerifyCode(object): page_shot_obj = Image.open(page_screenshot_path) # 获取验证码元素图片的位置 location = self.web_element.location - log.debug("验证码元素图片位置:%s" % location) + logger.debug("验证码元素图片位置:%s" % location) # 获取验证码元素图片的大小 size = self.web_element.size - log.debug("验证码元素图片大小:%s" % size) + logger.debug("验证码元素图片大小:%s" % size) # 获取图片的四个坐标点 left = location['x'] bottom = location['y'] right = left + size['width'] top = bottom + size['height'] - log.debug("图片的四个位置。左:%s右:%s上:%s下:%s" % (left, right, top, bottom)) + logger.debug("图片的四个位置。左:%s右:%s上:%s下:%s" % (left, right, top, bottom)) # 开始按照位置截图 crop_image_obj = page_shot_obj.crop((left, bottom, right, top)) # 将切割好的图片保存 crop_image_obj.save(element_screenshot_path) # 识别验证码中的字符 verify_code_text = gen_text_from_picture(element_screenshot_path) - log.debug("当前验证码的文字为:%s" % verify_code_text) + logger.debug("当前验证码的文字为:%s" % verify_code_text) return verify_code_text diff --git a/data/business_func.py b/data/business_func.py new file mode 100644 index 0000000000000000000000000000000000000000..d66179ae805c37c9d1cf8c56b10fb3e817471fdd --- /dev/null +++ b/data/business_func.py @@ -0,0 +1,44 @@ +from math import radians, cos, sin, asin, sqrt +from common.common_func import commonFuc +import json + + +class businessFuc(object): + + def diff_years(self, source_year, target_year): + """ + 计算两个日期之间相差的年数 + :param target_year: 当前时间 + :param source_year: 原始年日期 + :return: + """ + years = int(target_year.strftime('%Y')) - int(str(source_year).split("-")[0]) + return years + + def geopy_distance(self, lng1, lat1, lng2, lat2): + """ + 计算两个经纬度之间的距离 + :return: + """ + lng1, lat1, lng2, lat2 = map(radians, [float(lng1), float(lat1), float(lng2), float(lat2)]) + dlon = lng2 - lng1 + dlat = lat2 - lat1 + a = sin(dlat / 2) ** 2 + cos(lat1) * cos(lat2) * sin(dlon / 2) ** 2 + distance = 2 * asin(sqrt(a)) * 6371 * 1000 # 地球平均半径,6371km + distance = round(distance / 1000, 3) + return distance + + def get_globalsid(self): + login_url = commonFuc().get_business_data("", "login_url") + result = commonFuc().http_get(login_url) + return result["sid"] + + + + + + + + + + diff --git a/data/test_buy/data.yaml b/data/buy/data.yaml similarity index 100% rename from data/test_buy/data.yaml rename to data/buy/data.yaml diff --git a/data/data b/data/data new file mode 100644 index 0000000000000000000000000000000000000000..a035c748276198b56d1434cb2767b607276903f8 --- /dev/null +++ b/data/data @@ -0,0 +1,21 @@ +# 默认数据 +"enc_user_id": "u779700044448" +"headers": { + 'clientInfo': '{"birthday":"2018-11-18","screenwidth":"375","clientVersion":"2.4.2","screenheight":"667","partner":"meitunmama","clientip":"10.180.81.127","traderName":"iPhone 6S","clientAppVersion":"2.4.2","clientYunyuVersion":"7.9.6","clientSystem":"ios","nettype":"wifi","deviceCode":"1f4b3860acfa303bca0407f5128bc5ea0f529fec"}', + 'platform': "1", + 'signature': "144c6b3c78fc20ad57da1ebdb879615b", + 'token': "%s", + 'timestamp': "%s", +} +payload: {} +"post_headers": { + 'clientInfo': '{"birthday":"2018-11-18","screenwidth":"375","clientVersion":"2.4.2","screenheight":"667","partner":"meitunmama","clientip":"10.180.81.127","traderName":"iPhone 6S","clientAppVersion":"2.4.2","clientYunyuVersion":"7.9.6","clientSystem":"ios","nettype":"wifi","deviceCode":"1f4b3860acfa303bca0407f5128bc5ea0f529fec"}', + 'platform': "1", + 'signature': "144c6b3c78fc20ad57da1ebdb879615b", + 'token': "%s", + 'timestamp': "%s", + 'Content-Type': "%s", +} +default_contentType: "application/x-www-form-urlencoded" + +login_url: "http://backend-web-backend-web.1.java.babytree-test.com/sso-service/login?loginName=test001&pwd=test001@123" \ No newline at end of file diff --git a/data/hosts b/data/hosts new file mode 100644 index 0000000000000000000000000000000000000000..68cce88d4ac9a39df8b03c6f8536e8244ff70f4c --- /dev/null +++ b/data/hosts @@ -0,0 +1,27 @@ + +172.16.10.203 api.babytree-dev.com +172.16.10.203 api-test11.babytree-test.com +172.16.10.203 api.test11.babytree-fpm.com +172.16.10.203 api.babytree.com +# online + +10.54.11.80 idb.baobaoshu.com +10.54.11.80 grafana.baobaoshu.com +10.54.11.80 zabbix.baobaoshu.com +10.54.11.80 cacti.baobaoshu.com +10.54.11.80 ucm.baobaoshu.com +10.54.11.80 rundeck.baobaoshu.com dubbo.baobaoshu.com +10.54.11.80 cmdb.baobaoshu.com +10.54.11.80 apollo.baobaoshu.com muse.baobaoshu.com +10.54.11.80 splunk.baobaoshu.com + +172.16.10.203 test100.babytree-dev.com g.babytree-dev.com +122.9.41.244 gerrit.babytree-inc.com +10.54.17.153 localproxy.baobaoshu.com +192.168.24.43 gerrit.mtmm.com +#10.17.65.22 case.cmic.com.cn +10.54.50.90 sso.baobaoshu.com +8.131.247.52 docp.plt.babytree-inc.com +10.17.65.49 spd2hospitaltest2.cmic.com.cn +#10.17.65.49 spd2hospitaluat.cmic.com.cn +10.17.65.49 case.cmic.com.cn diff --git a/data/idbSet b/data/idbSet new file mode 100644 index 0000000000000000000000000000000000000000..8cf1f2dd2d7ba04ed03c8ee09eace12837f5f7b8 --- /dev/null +++ b/data/idbSet @@ -0,0 +1,97 @@ +user: + live: 6ea032c10ef24b10aa7fcfe5424446afin01 + pre: 6ea032c10ef24b10aa7fcfe5424446afin01 + +health: + live: 6013c13418a245b9866e9cdec92ff9b9in01 + pre : 6013c13418a245b9866e9cdec92ff9b9in01 + sit: health + +alimall: + live: f4d539e7b8204a8890929320f2052d68in01 + pre : f4d539e7b8204a8890929320f2052d68in01 + sit: alimall + +promotion: + live: 9e33dd3e26a54c8caeaf871e873edb38in01 + pre: 9e33dd3e26a54c8caeaf871e873edb38in01 + sit: promotion + +salesorder: + live: 7f9c968b57084c0782aeb620e2a064b1in01 + pre : 7f9c968b57084c0782aeb620e2a064b1in01 + sit: salesorder + +seller: + live: 2888c1775daf4c60897073068b6c219ain01 + pre: 2888c1775daf4c60897073068b6c219ain01 + sit: seller + +cms: + live: 790afd094355416895ca39891c09c0d3in01 + pre: 790afd094355416895ca39891c09c0d3in01 + sit: cms + +community: + live: 790afd094355416895ca39891c09c0d3in01 + pre: 790afd094355416895ca39891c09c0d3in01 + sit: community + +price: + live: 6ea032c10ef24b10aa7fcfe5424446afin01 + pre: 6ea032c10ef24b10aa7fcfe5424446afin01 + sit: price + +medical: + live: 89a813f93c454db0a23c25f95c0d2e2cin01 + pre: 89a813f93c454db0a23c25f95c0d2e2cin01 + sit: medical + +bcoin: + live: f4d539e7b8204a8890929320f2052d68in01 + pre: f4d539e7b8204a8890929320f2052d68in01 + sit: bcoin + +edu: + live: 8e7f2572f92e49f4b0061f75682470eain01 + pre: 8e7f2572f92e49f4b0061f75682470eain01 + sit: edu + +account: + live: 2888c1775daf4c60897073068b6c219ain01 + pre: 2888c1775daf4c60897073068b6c219ain01 + sit: account + +finance: + live: 6013c13418a245b9866e9cdec92ff9b9in01 + pre: 6013c13418a245b9866e9cdec92ff9b9in01 + sit: finance + +socialec: + live: 89a813f93c454db0a23c25f95c0d2e2cin01 + pre: 89a813f93c454db0a23c25f95c0d2e2cin01 + sit: socialec + +item: + live: 2888c1775daf4c60897073068b6c219ain01 + pre: 2888c1775daf4c60897073068b6c219ain01 + sit: item + +new_wms: + live: 89a813f93c454db0a23c25f95c0d2e2cin01 + pre: 89a813f93c454db0a23c25f95c0d2e2cin01 + sit: new_wms + +distribution: + live: 8e7f2572f92e49f4b0061f75682470eain01 + pre: 8e7f2572f92e49f4b0061f75682470eain01 + sit: distribution + +supplier: + live: 790afd094355416895ca39891c09c0d3in01 + sit: supplier + +local: + live: pc-2zerh8cqy748e33i8 + sit : b9e5fbff-08e9-11ed-866f-00163e324a72 + diff --git a/data/test_login/data.yaml b/data/login/data.yaml similarity index 100% rename from data/test_login/data.yaml rename to data/login/data.yaml diff --git a/data/msg b/data/msg new file mode 100644 index 0000000000000000000000000000000000000000..e5a0b6ebc82d429bda9d6ce6fe209851aff43827 --- /dev/null +++ b/data/msg @@ -0,0 +1,4 @@ +"dingding_msg": +- 59d455293168352cecfaa4fb67f2568f3fa54453a2fdb87ce9817c316dc41b57 + + diff --git a/data/test_sell/data.yaml b/data/sell/data.yaml similarity index 100% rename from data/test_sell/data.yaml rename to data/sell/data.yaml diff --git a/data/sql b/data/sql new file mode 100644 index 0000000000000000000000000000000000000000..55789897be35bddc2f676399c4b3425e72a7825d --- /dev/null +++ b/data/sql @@ -0,0 +1,11 @@ +"select_user_token": +- user +- select token from user.uc_user_token where enc_user_id=%s; + +"exp_expert": +- medical +- SELECT id,expert_name,base_service_count,service_count from exp_expert where deleted=%s and status=%s; + +"select_memberPrivilegeId": +- user +- SELECT id ,enc_user_id,privilege_type FROM uc_member_privilege WHERE left_times>0 and status=1 AND privilege_type IN (5,12,9,2,10,11) AND start_time NOW() AND enc_user_id IN (SELECT enc_user_id FROM uc_user_member WHERE final_end_time >NOW() AND level_type_code=001) order by id desc limit 1 \ No newline at end of file diff --git a/main.py b/main.py index 1e4bae3d6b11cd70dee21f8f9761b96e7fd26052..1ede8b56cf8bd8b7d6580551abad22bdfaafe0a0 100644 --- a/main.py +++ b/main.py @@ -31,7 +31,7 @@ def print_hi(name): if __name__ == '__main__': print_hi('PyCharm') # pytest.main( - # ['-vs', 'D:/pythonProject/atuobase/test_login/test_login_success.py', '--reruns', '3', '--reruns-delay', '2', '--alluredir', + # ['-vs', 'D:/pythonProject/atuobase/operator_login/test_login_success.py', '--reruns', '3', '--reruns-delay', '2', '--alluredir', # os.path.join(os.sep, 'autotest_sc_report'), # '--clean-alluredir']) @@ -39,20 +39,20 @@ if __name__ == '__main__': report_dir = create_report_dir() # pytest.main( - # ['-vs', 'D:/pythonProject/atuobase/test_login/test_login_success.py', '--reruns', '3', '--reruns-delay', '2', '--alluredir', + # ['-vs', 'D:/pythonProject/atuobase/operator_login/test_login_success.py', '--reruns', '3', '--reruns-delay', '2', '--alluredir', # report_dir, '--clean-alluredir']) # 开始执行用例 # pytest.main( - # ['-vs', 'D:/pythonProject/atuobase/test_login', 'D:/pythonProject/atuobase/test_buy/test_buy_one_nonseq_commodity.py::TestBuyOneNonseqCommodity::test_buy_one_nonseq_commodity', '--reruns', '3', '--reruns-delay', '2', '--alluredir', + # ['-vs', 'D:/pythonProject/atuobase/operator_login', 'D:/pythonProject/atuobase/buy/test_buy_one_nonseq_commodity.py::TestBuyOneNonseqCommodity::test_buy_one_nonseq_commodity', '--reruns', '3', '--reruns-delay', '2', '--alluredir', # report_dir, '--clean-alluredir']) # Mail().send() #pytest.main( - # ['-vs', '../autotest-airtest-web-sc/test_buy','../autotest-airtest-web-sc/test_login', '--reruns', '3', '--reruns-delay', '2', '--alluredir', + # ['-vs', '../autotest-airtest-web-sc/buy','../autotest-airtest-web-sc/operator_login', '--reruns', '3', '--reruns-delay', '2', '--alluredir', # report_dir, '--clean-alluredir']) pytest.main( - ['-vs', '../autotest-airtest-web-sc/test_login', '--reruns', '3', '--reruns-delay', '2', '--alluredir', + ['-vs', '../autotest-airtest-web-sc/operator_login', '--reruns', '3', '--reruns-delay', '2', '--alluredir', report_dir, '--clean-alluredir']) os.system('allure generate -c results/ -o report/') #os.system('allure serve %s' % report_dir) - # 可以在终端执行命令 pytest D:\pythonProject\atuobase\test_login\test_login_success.py + # 可以在终端执行命令 pytest D:\pythonProject\atuobase\operator_login\test_login_success.py diff --git a/page_class/base_page.py b/page_class/base_page.py index 38acefc4bbe6d7cd070623b26b88a4f254db0414..651e837f45e7af0cdff576ed5c9fa4d414f25bb1 100644 --- a/page_class/base_page.py +++ b/page_class/base_page.py @@ -1,11 +1,10 @@ from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait -from selenium.webdriver.remote.webdriver import WebElement from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver import ActionChains from time import sleep from datetime import datetime -from common.logger import log +from common.logger import logger import os @@ -31,10 +30,10 @@ class BasePage(object): def single_click(self, page_element): self.wait_seconds(1) page_element.click() - #action_chains = ActionChains(self.driver) - #action_chains.move_to_element(page_element) - #action_chains.click() - #action_chains.perform() + # action_chains = ActionChains(self.driver) + # action_chains.move_to_element(page_element) + # action_chains.click() + # action_chains.perform() # self.driver.execute_script("arguments[0].click();", page_element) def single_click_then_wait(self, page_element, seconds): @@ -127,10 +126,10 @@ class BasePage(object): '''展示窗口句柄信息,测试用,只下日志''' def display_window_handle(self): - log.info('当前窗口的title:%s' % self.driver.title) - log.info('当前窗口的url:%s' % self.driver.current_url) - log.info('当前窗口的句柄:%s' % self.driver.current_window_handle) - log.info('所有句柄:%s' % self.driver.window_handles) + logger.info('当前窗口的title:%s' % self.driver.title) + logger.info('当前窗口的url:%s' % self.driver.current_url) + logger.info('当前窗口的句柄:%s' % self.driver.current_window_handle) + logger.info('所有句柄:%s' % self.driver.window_handles) '''获取当前页面title''' diff --git a/report/report/report.py b/report/report/report.py index 4b31c0bd4158df8993a076b896f872fcbbcdab1c..db7d54029db7f8b89e3fa519285d7335a2a3926b 100644 --- a/report/report/report.py +++ b/report/report/report.py @@ -492,7 +492,7 @@ def simple_report(filepath, logpath=True, logfile=LOGFILE, output=HTML_FILE): path, name = script_dir_name(filepath) if logpath is True: logpath = os.path.join(path, LOGDIR) - rpt = LogToHtml(path, logpath, logfile=logfile, script_name=name) + rpt = LogToHtml(path, logpath, logfile=logfile, script_name=name, plugins=['airtest_selenium.report']) rpt.report(HTML_TPL, output_file=output) diff --git a/report/summary.html b/report/summary.html index fd809b0b35ab4caae86d5d579b2091e24faa1150..8eb5268616aeb31ffd567822a2f0666f467054b3 100644 --- a/report/summary.html +++ b/report/summary.html @@ -54,10 +54,10 @@ - 6 - 6 - 1分5秒 - 100.0% + 1 + 0 + 0分34秒 + 0.0% @@ -72,45 +72,10 @@ - case_login_no_input_userid - 成功 - 10.549 - Unknown - - - - case_login_no_input_verifycode - 成功 - 9.908 - Unknown - - - - case_login_password_error - 成功 - 9.955 - Unknown - - - - case_login_success - 成功 - 9.955 - Unknown - - - - case_login_userid_error - 成功 - 10.563 - Unknown - - - - case_login_verify_code_error - 成功 - 9.981 - Unknown + case_buy_one_nonseq_commodity + 失败 + 34.545 + qinguanglei diff --git a/runner.py b/runner.py index 0d291532e8b1a4d0095dc9a290dd7688d5c85666..83ac454cf6c01ed10e2a7637cd057a33cc7de8eb 100644 --- a/runner.py +++ b/runner.py @@ -9,7 +9,7 @@ curPath = os.path.abspath(os.path.dirname(__file__)) rootPath = os.path.split(curPath)[0] sys.path.append(rootPath) - +# python runner.py tag case_login_success debug sit if __name__ == '__main__': # 第一个参数 case 执行类型,'all', 'sc', 'tag' caseType = sys.argv[1] diff --git a/screen_shot/test_login/1700469774.png b/screen_shot/test_login/1700469774.png deleted file mode 100644 index 0e79e81e9810cb8da326bfb01f602964b5b1ea99..0000000000000000000000000000000000000000 Binary files a/screen_shot/test_login/1700469774.png and /dev/null differ diff --git a/screen_shot/test_login/1700469810.png b/screen_shot/test_login/1700469810.png deleted file mode 100644 index d964eee164357a0271e0396586042152b3205fe7..0000000000000000000000000000000000000000 Binary files a/screen_shot/test_login/1700469810.png and /dev/null differ diff --git a/screen_shot/test_login/1700469840.png b/screen_shot/test_login/1700469840.png deleted file mode 100644 index 0d1fbec7865ecad6767669f8a6f29df727346fe7..0000000000000000000000000000000000000000 Binary files a/screen_shot/test_login/1700469840.png and /dev/null differ diff --git a/screen_shot/test_login/1700469957.png b/screen_shot/test_login/1700469957.png deleted file mode 100644 index adda9a263ef9271380f331678f1260b80557e792..0000000000000000000000000000000000000000 Binary files a/screen_shot/test_login/1700469957.png and /dev/null differ diff --git a/test_buy/page_buy.py b/test_buy/page_buy.py index c2614b4ae1c05e565ee3e643a90c2be9eb3a3130..c9f4d02b3777b3a0954dc30b54be8cbc0afc78ce 100644 --- a/test_buy/page_buy.py +++ b/test_buy/page_buy.py @@ -1,6 +1,7 @@ -from test_login.page_login import PageLogin from selenium.webdriver.remote.webdriver import By +from actions.actions_login.page_login import PageLogin + class PageBuy(PageLogin): """基础元素""" @@ -35,7 +36,7 @@ class PageBuy(PageLogin): _main_info_locator = (By.ID, 'tab-7667cf55-c391-4f2c-a5ba-c0f6d27b6d3a') '''仓库信息''' # 仓库输入内容 - _warehouse_content_locator = (By.XPATH, '//input[starts-with(@id,"el-id-") and contains(@id,"-122")]') + _warehouse_content_locator = (By.XPATH, '//input[starts-with(@id,"el-id-") and contains(@id,"-121")]') # 请求查询仓库元素 _ware_request_locator = (By.XPATH, '//input[starts-with(@id,"el-id-") and contains(@id,"-122")]/../span/span/i') # _ware_request_locator = (By.XPATH, '//div[text() = "仓库名称"]/../div[@class="el-form-item__content"]/descendant::i[@class="awsui-iconfont" and @style="cursor: pointer;"]') @@ -75,7 +76,7 @@ class PageBuy(PageLogin): '''协议信息''' # 协议输入内容元素 - _protocol_content_locator = (By.XPATH, '//input[starts-with(@id,"el-id-") and contains(@id,"-124")]') + _protocol_content_locator = (By.XPATH, '//input[starts-with(@id,"el-id-") and contains(@id,"-123")]') # 协议请求元素 _protocol_request_locator = (By.XPATH, '//input[starts-with(@id,"el-id-") and contains(@id,"-109")]/../span/span/i') @@ -91,7 +92,7 @@ class PageBuy(PageLogin): '''业务员信息''' # 业务员输入内容元素 - _businessman_content_locator = (By.XPATH, '//input[starts-with(@id,"el-id-") and contains(@id,"-127")]') + _businessman_content_locator = (By.XPATH, '//input[starts-with(@id,"el-id-") and contains(@id,"-126")]') # 业务员请求元素 _businessman_request_locator = ( By.XPATH, '//input[starts-with(@id,"el-id-") and contains(@id,"-110")]/../span/span/i') @@ -112,7 +113,7 @@ class PageBuy(PageLogin): _merchandise_locator = (By.XPATH, '//span[text()="添加商品"]') # 商品dialog _merchandise_dialog_locator = ( - By.XPATH, '//div[starts-with(@id,"el-id-") and contains(@id,"-136") and @class="el-dialog__body"]') + By.XPATH, '//div[starts-with(@id,"el-id-") and contains(@id,"-135") and @class="el-dialog__body"]') # 商品输入元素 _merchandise_input_locator = (By.XPATH, '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,厂家物料编码"]') # 商品搜索元素 @@ -387,8 +388,10 @@ class PageBuy(PageLogin): def get_businessman_dialog(self): return self.get_element_wait_presence(self._businessman_dialog_locator) + '''商品信息hold''' '''获取商品全选复选框''' + def get_merchandise_all_select(self): return self.get_element_wait_presence(self._merchandise_all_select_locator) @@ -428,5 +431,6 @@ class PageBuy(PageLogin): return self.get_element_wait_presence(self._detail_table) '''订单提交''' + def get_submit_element(self): return self.get_element_wait_presence(self._submit_locator) diff --git a/test_buy/steps_buy.py b/test_buy/steps_buy.py index 5f65d25e60da4536fe2e078e249b9a34fa2bb7df..3940bb0d115de6741c21b4bedade0a4487414cd3 100644 --- a/test_buy/steps_buy.py +++ b/test_buy/steps_buy.py @@ -10,7 +10,7 @@ from common.read_yaml import get_filed_from_yaml from common.verifycode import VerifyCode from test_buy.page_buy import PageBuy -module = 'test_buy' +module = 'buy' class StepsBuy(object): diff --git a/test_login/__init__.py b/test_login/__init__.py deleted file mode 100644 index 33481c8bf7c3d64f77a21769a746e910eaaced66..0000000000000000000000000000000000000000 --- a/test_login/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# author:qinguanglei -# ddate:2023/11/16 11:00 diff --git a/test_login/test_login_no_input_userid.py b/test_login/test_login_no_input_userid.py deleted file mode 100644 index 1895c7fb410a29173887d64db97c404d9c10c15a..0000000000000000000000000000000000000000 --- a/test_login/test_login_no_input_userid.py +++ /dev/null @@ -1,28 +0,0 @@ -# author:qinguanglei -# ddate:2023/11/17 15:54 -import allure -import pytest -from test_login.steps_login import StepsLogin - - -@allure.feature('登录模块') -class TestLoginNoInputUserid(object): - @pytest.fixture(scope='function', autouse=True) - def housework(self, driver_fixture): - # 驱动器从fixture传来 - self.driver = driver_fixture - - @allure.story('不输入用户名登录失败案例-点击登录') - def test_login_no_input_userid(self): - # 载入步骤集合 - steps_login = StepsLogin(self.driver) - # 打开浏览器 - steps_login.open_browser() - # 输入账号密码,只输入密码 - steps_login.enter_account_password(2) - # 输入验证码,输入正确的验证码 - steps_login.enter_verify_code(0) - # 点击登录 - steps_login.click_login_button() - # 判断结果 - steps_login.judge_result_error(2) diff --git a/test_login/test_login_no_input_verifycode.py b/test_login/test_login_no_input_verifycode.py deleted file mode 100644 index de2519765a9cac868fe468216c2fd36b0c078b26..0000000000000000000000000000000000000000 --- a/test_login/test_login_no_input_verifycode.py +++ /dev/null @@ -1,28 +0,0 @@ -# author:qinguanglei -# ddate:2023/11/20 9:56 -import allure -import pytest -from test_login.steps_login import StepsLogin - - -@allure.feature('登录模块') -class TestLoginNoInputVerifycode(object): - @pytest.fixture(scope='function', autouse=True) - def housework(self, driver_fixture): - # 驱动器从fixture传来 - self.driver = driver_fixture - - @allure.story('不输入验证码案例-点击登录') - def test_login_no_input_verifycode(self): - # 载入步骤集合 - steps_login = StepsLogin(self.driver) - # 打开浏览器 - steps_login.open_browser() - # 输入账号密码,都输入正确的 - steps_login.enter_account_password(0) - # 输入验证码,不输入验证码 - steps_login.enter_verify_code(2) - # 点击登录 - steps_login.click_login_button() - # 判断结果 - steps_login.judge_result_error(3) diff --git a/test_login/test_login_password_error.py b/test_login/test_login_password_error.py deleted file mode 100644 index a93228b22174a8df26fb4b48efa5ea9177e51a8c..0000000000000000000000000000000000000000 --- a/test_login/test_login_password_error.py +++ /dev/null @@ -1,35 +0,0 @@ -# author:qinguanglei -# ddate:2023/11/20 9:43 -import allure -import pytest -from test_login.page_login import PageLogin -from test_login.steps_login import StepsLogin - - -@allure.feature('登录模块') -class TestLoginPasswordError(object): - @pytest.fixture(scope='function', autouse=True) - def housework(self, driver_fixture): - # 驱动器从fixture传来 - self.driver = driver_fixture - # 执行案例前统一获取页面元素操作方法 - self.page_login = PageLogin(self.driver) - - @allure.story('输入错误密码登录失败案例-点击登录') - def test_login_password_error(self): - # 载入步骤集合 - steps_login = StepsLogin(self.driver) - # 打开浏览器 - steps_login.open_browser() - # 输入账号密码,密码输入错误 - steps_login.enter_account_password(4) - # 输入验证码,输入正确的验证码 - steps_login.enter_verify_code(0) - # 点击登录 - steps_login.click_login_button() - # 判断结果 - steps_login.judge_result_error(1) - - - - diff --git a/test_login/test_login_success.py b/test_login/test_login_success.py deleted file mode 100644 index edca518a6b353a241014919dc462424403f57686..0000000000000000000000000000000000000000 --- a/test_login/test_login_success.py +++ /dev/null @@ -1,30 +0,0 @@ -# author:qinguanglei -# ddate:2023/11/16 11:18 -import pytest -import allure -from test_login.steps_login import StepsLogin - -module = 'test_login' - - -@allure.feature('登录模块') -class TestLoginSuccess(object): - @pytest.fixture(scope='function', autouse=True) - def housework(self, driver_fixture): - # 驱动器从fixture传来 - self.driver = driver_fixture - - @allure.story('登录成功案例-点击登录') - def test_login_success_click(self): - # 载入步骤集合 - steps_login = StepsLogin(self.driver) - # 打开浏览器 - steps_login.open_browser() - # 输入账号密码,账号与密码都输入 - steps_login.enter_account_password(0) - # 输入验证码,正确的验证码 - steps_login.enter_verify_code(0) - # 点击登录 - steps_login.click_login_button() - # 判断结果 - steps_login.judge_result() diff --git a/test_login/test_login_userid_error.py b/test_login/test_login_userid_error.py deleted file mode 100644 index 0f2f7a0b45af3537c99162cc5da1af09095d2685..0000000000000000000000000000000000000000 --- a/test_login/test_login_userid_error.py +++ /dev/null @@ -1,28 +0,0 @@ -# author:qinguanglei -# ddate:2023/11/20 9:23 -import allure -import pytest -from test_login.steps_login import StepsLogin - - -@allure.feature('登录模块') -class TestLoginUseridError(object): - @pytest.fixture(scope='function', autouse=True) - def housework(self, driver_fixture): - # 驱动器从fixture传来 - self.driver = driver_fixture - - @allure.story('登录用户名错误案例-点击登录') - def test_login_userid_error(self): - # 载入步骤集合 - steps_login = StepsLogin(self.driver) - # 打开浏览器 - steps_login.open_browser() - # 输入账号密码,用户名输入错误 - steps_login.enter_account_password(3) - # 输入验证码,输入正确的验证码 - steps_login.enter_verify_code(0) - # 点击登录 - steps_login.click_login_button() - # 判断结果 - steps_login.judge_result_error(1) diff --git a/test_login/test_login_verify_code_error.py b/test_login/test_login_verify_code_error.py deleted file mode 100644 index 13b37d6d3ca4e5824e3adc8b6173ff28f3b599f2..0000000000000000000000000000000000000000 --- a/test_login/test_login_verify_code_error.py +++ /dev/null @@ -1,30 +0,0 @@ -# author:qinguanglei -# ddate:2023/11/16 16:40 -import allure -import pytest -from test_login.steps_login import StepsLogin - -module = 'test_login' - - -@allure.feature('登录模块') -class TestLoginVerifyCodeError(object): - @pytest.fixture(scope='function', autouse=True) - def housework(self, driver_fixture): - # 驱动器从fixture传来 - self.driver = driver_fixture - - @allure.story('登录验证码错误案例-点击登录') - def test_login_verify_code_error(self): - # 载入步骤集合 - steps_login = StepsLogin(self.driver) - # 打开浏览器 - steps_login.open_browser() - # 输入账号密码,都输入正确的 - steps_login.enter_account_password(0) - # 输入验证码,错误的验证码 - steps_login.enter_verify_code(1) - # 点击登录 - steps_login.click_login_button() - # 判断结果 - steps_login.judge_result_error(0) diff --git a/test_sell/page_sell.py b/test_sell/page_sell.py index 0a6fe6cccaeed5070c73691c81f15e404b0e3506..8ef6f49a0cfcc69db0771a67afbd284e9e7f051d 100644 --- a/test_sell/page_sell.py +++ b/test_sell/page_sell.py @@ -1,6 +1,6 @@ # author:qinguanglei # ddate:2023/11/22 9:17 -from test_login.page_login import PageLogin +from operator.operator_login import PageLogin from selenium.webdriver.remote.webdriver import By diff --git a/test_sell/steps_sell.py b/test_sell/steps_sell.py index 1e9b6ec6d20c0ab7335c5b6e07be4fa3fa566413..d75550f742d61f30c947a03a30b2bca03661b7f2 100644 --- a/test_sell/steps_sell.py +++ b/test_sell/steps_sell.py @@ -10,7 +10,7 @@ from common.read_yaml import get_filed_from_yaml from common.verifycode import VerifyCode from test_sell.page_sell import PageSell -module = 'test_sell' +module = 'sell' class StepsSell(object):