Commit 05cafa5e authored by 齐 振鋆's avatar 齐 振鋆
Browse files

手术请领单维护

parent fc81126b
dbinfo:
'DB_HOST': '10.17.65.215'
'DB_PORT': 3306
'DB_USER': 'aws'
'DB_PASSWD': 'admins'
'DB_NAME': 'aws'
userinfo: # 登录用户信息
username: 'qizhenjun'
'DB_USER': 'sctest'
'DB_PASSWD': 'Cmic2022@'
'DB_NAME': 'awsuat'
userinfo: # 登录用户信息
username: 'bj_01'
password: 'Gyxc1234'
verificationCode: 0 # 验证码识别:1开启|0关闭
minNum: 2
\ No newline at end of file
......@@ -2,13 +2,13 @@
# 作者:齐振鋆
# 日期:2023/2/15
# 描述:
import os
import pytest
import allure
import logging
import os
from datetime import datetime
import allure
import pytest
from ddt import ddt, file_data
from datetime import datetime
from cases.UI.GuKeYiTiHua import PROJECTNAME
from component.GuKeYiTiHua.StorageManage.StorageIn.warehouse_accept import WarehouseVerify
......@@ -25,7 +25,6 @@ from component.GuKeYiTiHua.SurgeryFollow.SurgeryLend.orthopedic_lend import Orth
from component.GuKeYiTiHua.SurgeryFollow.SurgeryLend.out_ledger import OutLedger
from component.GuKeYiTiHua.SurgeryFollow.SurgeryLend.surgery_distribute import SurgeryDistribute
from component.GuKeYiTiHua.SurgeryFollow.SurgeryLend.surgery_require import SurgeryRequire
from page.GuKeYiTiHua.DBQuery.db_query import DBQuery
from page.GuKeYiTiHua.Public.common import CommonElement
from unit.public.DataDic import DataDic
......@@ -67,8 +66,8 @@ class TestSurgeryFollow(object):
@allure.description('测试时间:{}'.format(datetime.now()))
@pytest.mark.surgery
@pytest.mark.run(order=10)
# @file_data('{}/data/{}TestData.yaml'.format(os.getcwd(), dd.get_value('module')))
@file_data(dd.get_value('test_data_file'))
@file_data('{}/data/{}TestData.yaml'.format(os.getcwd(), dd.get_value('module')))
# @file_data(dd.get_value('test_data_file'))
def test_surgery_normal(self, **kwargs):
with allure.step('测试数据准备...'):
log.info(kwargs)
......@@ -91,7 +90,7 @@ class TestSurgeryFollow(object):
self.sd.surgery_distribute_search(tap_name='已办', order_code=ql_code)
self.common.close_tap()
with allure.step('骨科仓借出单'):
with allure.step('手术借出单'):
self.ol.orthopedic_lend_menu_open()
if process_type == 1:
self.ol.orthopedic_lend_search(ot='QL', order_code=ql_code)
......
......@@ -7,7 +7,6 @@ import os
import pytest
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from unit.public.DBUnit import MysqlDataBase
from unit.public.DataDic import DataDic
......@@ -36,13 +35,19 @@ def init_browser(pytestconfig):
# chrome_options.add_argument('--disable-gpu') # 禁用GPU加速
# chrome_options.add_argument('–disable-software-rasterizer')
# chrome_options.add_argument('--disable-extensions')
# driver = webdriver.Chrome(executable_path=os.path.join(dd.get_value('root_path'), 'driver', 'chromedriver.exe')) if test_host == 'localhost' else webdriver.Remote(command_executor='http://{}:5555/wd/hub'.format(test_host), options=chrome_options)
driver = webdriver.Chrome(ChromeDriverManager().install())if client == 'localhost' else webdriver.Remote(command_executor='http://{}:5555/wd/hub'.format(client), options=chrome_options)
driver = webdriver.Chrome(
executable_path=os.path.join(dd.get_value('root_path'), 'driver',
'chromedriver.exe')) if client == 'localhost' else webdriver.Remote(
command_executor='http://{}:5555/wd/hub'.format(client), options=chrome_options)
# driver = webdriver.Chrome(
# ChromeDriverManager(path=r'.\\driver').install()) if client == 'localhost' else webdriver.Remote(
# command_executor='http://{}:5555/wd/hub'.format(client), options=chrome_options)
dd.set_value('driver', driver)
driver.maximize_window()
log.info('读取项目配置文件......')
project_conf_path = os.path.join(dd.get_value('root_path'), 'cases', 'UI', dd.get_value('project'), 'envConfig.yaml')
project_conf_path = os.path.join(dd.get_value('root_path'), 'cases', 'UI', dd.get_value('project'),
'envConfig.yaml')
project_conf = UtilYaml(project_conf_path).load_yaml()
dd.set_value('project_conf', project_conf)
dd.set_value('minNum', project_conf['minNum'])
......
......@@ -45,45 +45,55 @@ class SurgeryRequire(object):
self.iframe.to_main_iframe()
if order_code is None:
self.button.new()
log.info('获取请领单号&存储')
ql_code = ''
while ql_code.startswith('QL') is False:
sleep(1)
ql_code = self.order_detail_main.get_element_text('请领单号 ')
log.info('请领单号:【{}】'.format(ql_code))
else:
self.surgery_require_search(order_code=order_code)
self.list_page.open_order(order_code=order_code)
ql_code = order_code
self.order_detail_main.choose_tap('主体信息')
self.menu.dd.set_value('ql_code', ql_code)
UtilYaml(self.menu.dd.get_value('extract_path')).write_yaml({'ql_code': ql_code})
# self.order_detail_main.choose_tap('主体信息') 已作废
# 公司
self.order_detail_main.some_click_item('公司名称 ')
company_code = test_data_info['company']
self.modal.search_and_choose_items(placeholder='模糊检索:公司名称,公司编码', text=company_code)
self.order_detail_main.drop_choose_item('手术类型 ', '翻修手术')
# 手术日期
date_str = self.menu.tu.get_date_str(1)
self.order_detail_main.date_input_item('手术日期 ', date_str)
# self.order_detail_main.some_click_item('公司名称 ')
# company_code = test_data_info['company']
# self.modal.search_and_choose_items(placeholder='模糊检索:公司名称,公司编码', text=company_code)
self.order_detail_main.choose_tap('客户信息')
self.order_detail_main.some_click_item('客户名称 ')
customer_code = test_data_info['customer']
self.modal.search_and_choose_items(title='选择客户', text=customer_code)
self.order_detail_main.some_click_item('配销客户名称 ')
self.modal.search_and_choose_items(title='选择配销客户', text=customer_code)
# self.order_detail_main.choose_tap('其他信息')
# 手术类型
self.order_detail_main.drop_choose_item('手术类型 ', '翻修髋')
# 手术日期
date_str = self.menu.tu.get_date_str(1)
self.order_detail_main.date_input_item('手术日期 ', date_str)
# 手术医生
self.order_detail_main.text_input_item('手术医生 ', '齐振鋆')
# 手术种类
self.order_detail_main.drop_choose_item('手术种类 ', '髋关节')
# self.order_detail_main.choose_tap('客户信息') 已作废
# self.order_detail_main.choose_tap('其他信息') 已作废
# self.order_detail_main.some_click_item(name='是否启用开单校验 ', end_str="div[@class='awsui-component']")
# 保存获得请领单号
self.order_detail_main.choose_tap('主体信息')
self.button.save()
log.info('获取请领单号&存储')
ql_code = ''
while ql_code.startswith('QL') is False:
sleep(1)
ql_code = self.order_detail_main.get_element_text('请领单号 ')
log.info('请领单号:【{}】'.format(ql_code))
self.menu.dd.set_value('ql_code', ql_code)
UtilYaml(self.menu.dd.get_value('extract_path')).write_yaml({'ql_code': ql_code})
# self.order_detail_main.choose_tap('主体信息') 已作废
# self.button.save()
log.info('添加商品')
self.button.click_button(button_name='商品信息')
self.button.click_button(button_name='添加商品(内部)')
goods = test_data_info['goods']
self.modal.search_and_choose_items(placeholder='模糊检索:商品编码,商品名称,规格型号,厂家物料编码,存储条件', text=goods)
self.modal.search_and_choose_items(placeholder='模糊检索:商品编码,商品名称,规格型号,厂家物料编码,存储条件',
text=goods)
sleep(3 * len(goods))
self.order_detail_table.get_cell_text('商品名称', goods[0])
min_num = self.menu.dd.get_value('minNum')
......
-
description: 'normal sense' # 场景说明
process_type: 2 # 1:请领单开始,2:借出单开始
company: '00122' # 公司
warehouse_lend: '122302' # 借出仓
warehouse_borrow: '122310' # 借入仓
warehouse_return: '122302' # 还回仓
salesman: '12345678' # 业务员
customer: '1219166' # 客户
agreement: '38618' # 合同
follow: 'N' # 是否连台
goods: # 借出商品
# - 非序列号商品:10174665、10154871、10153570、10155572、10156326、10156327、10156331、10157133
# - 序列号商品:10171873、10184703、10154042、10157849、10157852、10155177
# - '10157133'
# - '10045736'
# - '10184703'
# - '10157852'
- '10155177'
- description: 'normal sense' # 场景说明
process_type: 1 # 1:请领单开始,2:借出单开始
company: '00103' # 公司
warehouse_lend: '103303' # 借出仓
warehouse_borrow: '103503' # 借入仓
warehouse_return: '103303' # 还回仓
salesman: '11353403' # 业务员
customer: '1000486' # 客户
agreement: '38618' # 合同
follow: 'N' # 是否连台
goods: # 借出商品
- '10154043'
- '10006180'
......@@ -2,4 +2,6 @@ Edge:
https://developer.microsoft.com/zh-cn/microsoft-edge/tools/webdriver/
Chrome:
https://registry.npmmirror.com/binary.html?path=chromedriver/
\ No newline at end of file
https://registry.npmmirror.com/binary.html?path=chromedriver/
https://chromedriver.storage.googleapis.com/index.html
http://npm.taobao.org/mirrors/chromedriver/
\ No newline at end of file
......@@ -19,8 +19,13 @@ def get_results(index, col):
sql = func(self, *args, **kwargs)
log.info(sql)
result = db.exec(sql)
return result if index is None else result[index] if col is None else result[index][col]
try:
return result if index is None else result[index] if col is None else result[index][col]
except IndexError:
return "IndexError"
return wrapper
return query
......
......@@ -2,6 +2,9 @@
# 作者:齐振鋆
# 日期:2022/9/23
import logging
import time
from selenium.webdriver.common.by import By
from unit.public.UI.BasePage import BasePage
......@@ -11,12 +14,17 @@ log = logging.getLogger(__name__)
class MenuElement(BasePage):
def open_menu(self, first_menu_name, last_menu_name):
log.info('打开菜单:{}'.format(last_menu_name))
first_menu = "//div[contains(@class,'menuNavTop')]//div[text()='{}']".format(first_menu_name)
second_menu = "//div[contains(@class, 'third-menu') and @navname='{}']/ancestor::div[@class='sec-menu']".format(
last_menu_name)
third_menu = "//div[contains(@class, 'third-menu') and @navname='{}']".format(last_menu_name)
# first_menu = "//div[contains(@class,'menuNavTop')]//div[text()='{}']".format(first_menu_name)
# second_menu = "//div[contains(@class, 'third-menu') and @navname='{}']/ancestor::div[@class='sec-menu']".format(
# last_menu_name)
# third_menu = "//div[contains(@class, 'third-menu') and @navname='{}']".format(last_menu_name)
menu = f"//div[contains(@class, 'menu') and @navname='{last_menu_name}']/span"
# self.move_to_element(first_menu)
# self.move_to_element(second_menu)
# self.click(third_menu) if self.wait_element(third_menu) else self.click(second_menu)
self.js("arguments[0].click();", self.get_element(third_menu)) if self.wait_element(third_menu) else self.js(
"arguments[0].click();", self.get_element(second_menu))
driver = self.dd.get_value('driver')
em = driver.find_element(By.XPATH, menu)
time.sleep(3)
driver.execute_script("arguments[0].click();", em)
# self.js("arguments[0].click();", menu)
......@@ -4,7 +4,7 @@ python_classes = Test*
python_functions = test
log_cli = 1
log_cli_level = INFO
log_cli_level = DEBUG
log_cli_format = %(asctime)s [%(levelname)s] %(message)s (%(filename)s:%(lineno)s)
log_cli_date_format=%Y-%m-%d %H:%M:%S
......
......@@ -2,38 +2,23 @@
import argparse
import os
import flet
import pytest
from flet import ResponsiveRow, Column, ElevatedButton, Text, TextField, Dropdown, icons, FilePickerResultEvent, \
FilePicker, alignment, Container, dropdown, KeyboardType
from flet import Ref
from unit.public.DataDic import DataDic
dd = DataDic()
def py_run():
tab_code = dd.get_value('tab')
if tab_code is None:
pytest.main(['cases/UI/{}/{}'.format(dd.get_value('project'), dd.get_value('module'))])
else:
pytest.main(
['cases/UI/{}/{}'.format(dd.get_value('project'), dd.get_value('module')), '-m', tab_code])
# allure generate allure-results -o allure-report --clean
os.system("allure generate allure-results -o allure-report --clean")
def get_command_args():
"""命令行参数解析"""
parser = argparse.ArgumentParser(description=u'可选择参数:')
parser.add_argument("--client", default='localhost', help="client:客户端IP")
parser.add_argument("--project", default='GuKeYiTiHua', help="project:项目")
# url: 'http://10.17.65.216:8088/portal/' 'http://10.17.65.200:8088/portal/'
parser.add_argument("--url", default='http://10.17.65.216:8088/portal/', help="url: 地址")
# url: 'http://scdev.cmic.com.cn:8088/beta/r/w'
parser.add_argument("--url", default='http://scdev.cmic.com.cn:8088/beta/r/w', help="url: 地址")
# ;手术跟台: surgery | 采购管理:purchase | 调拨管理: Transfer | 库存管理:inventory | 调试:debug
parser.add_argument("--module", default='purchase', help="module:模块")
parser.add_argument("--tab", default='purchase', help="tab:标记")
parser.add_argument("--module", default='surgery', help="module:模块")
parser.add_argument("--tab", default='surgery', help="tab:标记")
parser.add_argument("--order", help="order: 单据编码")
parser.add_argument("--co", help="co: 公司")
parser.add_argument("--wh", help="wh: 仓库")
......@@ -50,110 +35,16 @@ def get_command_args():
dd.set_value('warehouse', args.wh)
dd.set_value('custGood', args.good)
dd.set_value('custNum', args.num)
py_run()
def get_ui_args(page):
page.title = "国药自动化测试启动器"
client_ip = Ref[TextField]()
test_url = Ref[TextField]()
project_name = Ref[Dropdown]()
module_name = Ref[Dropdown]()
tab_name = Ref[Dropdown]()
test_file = Ref[TextField]()
greetings = Ref[Column]()
def run(e):
greetings.current.controls.append(
Text(f"【测试环境】:{test_url.current.value}")
)
greetings.current.controls.append(
Text(f"【项目】:{project_name.current.value}-【模块】:{module_name.current.value}-【标签】:{tab_name.current.value}")
)
page.update()
dd.set_value('client', client_ip.current.value)
p_name = project_name.current.value
p_code = 'GuKeYiTiHua' if p_name == '骨科一体化' else 'TestProject'
dd.set_value('project', p_code)
dd.set_value('url', test_url.current.value)
m_name = module_name.current.value
m_code = 'purchase' if m_name == '采购管理' \
else 'surgery' if m_name == '手术跟台' \
else 'transfer' if m_name == '调拨管理' \
else None
dd.set_value('module', m_code)
t_name = tab_name.current.value
t_code = 'all' if t_name == '全量' else 'smoking' if t_name == '冒烟' else 'debug' if t_name == '调试' else None
dd.set_value('tab', t_code)
py_run()
def stop(e):
dd.get_value('driver').close()
dd.get_value('driver').quit()
def module_update(e):
m_options = []
module_list = ['采购管理', '手术跟台', '调拨管理'] if project_name.current.value == '骨科一体化' \
else ['模块1', '模块2', '模块3'] if project_name.current.value == '测试项目' \
else []
for m_item in module_list:
m_options.append(dropdown.Option(m_item))
module.options = m_options
page.update()
def pick_files_result(e: FilePickerResultEvent):
selected_files.value = (
e.files[0].path if e.files else "Cancelled!"
)
selected_files.update()
test_data_file = test_file.current.value
dd.set_value('test_data_file', test_data_file)
client = TextField(ref=client_ip, label="客户端地址", icon=icons.BOY, autofocus=True, value='localhost',
read_only=True, )
url = TextField(ref=test_url, label="测试环境", icon=icons.HTTP, keyboard_type=KeyboardType.URL, value='http://10.17.65.216:8088/portal/r/w')
project_options = []
for item in ['骨科一体化', '测试项目']:
project_options.append(dropdown.Option(item))
project = Dropdown(ref=project_name, label="项目名称", icon=icons.HOUSE, options=project_options,
on_change=module_update)
module_options = []
module = Dropdown(ref=module_name, label="模块名称", icon=icons.MOOD, options=module_options)
tab_options = []
for item in ['全量', '冒烟', '调试']:
tab_options.append(dropdown.Option(item))
tab = Dropdown(ref=tab_name, label="标签名称", icon=icons.TAB, options=tab_options)
file = ElevatedButton(
"测试数据文件",
on_click=lambda _: pick_files_dialog.pick_files(
allow_multiple=False,
allowed_extensions=["yaml"]
),
)
pick_files_dialog = FilePicker(on_result=pick_files_result)
selected_files = TextField(ref=test_file, label="测试数据", icon=icons.DATASET, read_only=True, )
page.overlay.append(pick_files_dialog)
page.add(
Container(client, col={"sm": 6, "md": 4, "xl": 2}),
Container(url, col={"sm": 6, "md": 4, "xl": 2}),
Container(project, col={"sm": 6, "md": 4, "xl": 2}),
Container(module, col={"sm": 6, "md": 4, "xl": 2}),
Container(tab, col={"sm": 6, "md": 4, "xl": 2}),
ResponsiveRow([
Container(selected_files, col={"sm": 10}),
Container(file, col={"sm": 2}),
]),
ResponsiveRow([
Container(ElevatedButton("运行", on_click=run), col={"sm": 1}, alignment=alignment.center),
Container(ElevatedButton("停止", on_click=stop), col={"sm": 1}, alignment=alignment.center),
]),
Container(Column(ref=greetings), )
)
tab_code = dd.get_value('tab')
if tab_code is None:
pytest.main(['cases/UI/{}/{}'.format(dd.get_value('project'), dd.get_value('module'))])
else:
pytest.main(
['cases/UI/{}/{}'.format(dd.get_value('project'), dd.get_value('module')), '-m', tab_code])
# allure generate allure-results -o allure-report --clean
os.system("allure generate allure-results -o allure-report --clean")
if __name__ == '__main__':
UI = False # 运行模式
flet.app(target=get_ui_args) if UI is True else get_command_args()
py_run()
......@@ -63,9 +63,10 @@ class BasePage(object):
:param wait_time: 等待时间
"""
element_obj = self.split_locator(locator)
driver = self.dd.get_value('driver')
try:
wait = self.dd.get_value('element_wait_time') if wait_time is None else wait_time
WebDriverWait(self.dd.get_value('driver'), wait, 1).until(ec.visibility_of_element_located(element_obj))
WebDriverWait(driver, wait).until(ec.visibility_of_element_located(element_obj))
log.debug('等待元素:{}'.format(locator))
return True
except TimeoutException:
......@@ -101,10 +102,11 @@ class BasePage(object):
# if self.wait_element(locator, sec) is True:
# log.debug('获取元素:{}'.format(locator))
# with allure.step('获取元素:{}'.format(locator)):
driver = self.dd.get_value('driver')
wt = self.dd.get_value('element_wait_time')
element_obj = self.split_locator(locator)
try:
element = WebDriverWait(self.dd.get_value('driver'), self.dd.get_value('element_wait_time'), 1).until(
ec.visibility_of_element_located(element_obj))
element = WebDriverWait(driver, wt).until(ec.visibility_of_element_located(element_obj))
self.try_count = 0
return element
except Exception as e:
......@@ -124,10 +126,11 @@ class BasePage(object):
:param locator: 定位方法+定位表达式组合字符串,用逗号分隔,如'(xpath,//div[@class="username"])'
:return: elements
"""
driver = self.dd.get_value('driver')
wt = self.dd.get_value('element_wait_time')
element_objs = self.split_locator(locator)
try:
elements = WebDriverWait(self.dd.get_value('driver'), self.dd.get_value('element_wait_time'), 1).until(
ec.visibility_of_all_elements_located(element_objs))
elements = WebDriverWait(driver, wt).until(ec.visibility_of_all_elements_located(element_objs))
# log.debug('获取元素列表:{}'.format(locator))
return elements
except Exception as e:
......@@ -331,15 +334,15 @@ class BasePage(object):
element.click()
self.dd.get_value('driver').switch_to.window(self.dd.get_value('driver').window_handles[-1])
def js(self, script, xpath=None):
def js(self, script, locator=None):
"""
执行JavaScript
:param script: js语句
:param xpath:
:param locator:
"""
log.debug('执行JS语句:{}'.format(script))
self.dd.get_value('driver').execute_script(script) if xpath is None else self.dd.get_value(
'driver').execute_script(script, xpath)
driver = self.dd.get_value('driver')
driver.execute_script(script) if locator is None else driver.execute_script(script, self.get_element(locator))
@staticmethod
def zoom(z_type, times):
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment