Commit 22b60c14 authored by 齐 振鋆's avatar 齐 振鋆
Browse files

个人代码迁移

parent c6ba7a8b
Pipeline #10140 failed with stages
in 3 seconds
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
java -jar selenium-server-standalone-3.141.0.jar -role hub -host 0.0.0.0
\ No newline at end of file
# -*- coding:utf-8 -*-
# 作者:齐振鋆
# 日期:2022/11/8
# 描述:
# -*- coding:utf-8 -*-
# 作者:齐振鋆
# 日期:2022/11/8
# 描述:
# -*- coding:utf-8 -*-
# 作者:齐振鋆
# 日期:2022/11/8
# 描述:
# -*- coding:utf-8 -*-
import flet
from args_command import get_command_args
from args_ui import get_ui_args
from unit.public.DataDic import DataDic
dd = DataDic()
if __name__ == '__main__':
UI = False # 运行模式
flet.app(target=get_ui_args) if UI is True else get_command_args()
# -*- coding:utf-8 -*-
# 作者:齐振鋆
# 日期:2023/3/14
# 描述:
# -*- coding:utf-8 -*-
# 作者:齐振鋆
# 日期:2023/3/14
# 描述:
import logging
import allure
from unit.public.DataDic import DataDic
log = logging.getLogger(__name__)
dd = DataDic()
def get_results(index, col):
def query(func):
def wrapper(self, *args, **kwargs):
db = dd.get_value('db')
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]
return wrapper
return query
class DBQuery(object):
@get_results(0, 0)
def get_stock_cargo(self, warehouse):
"""仓库是否启用货位管理"""
with allure.step('DB:查询仓库是否启用货位管理'):
return """select
SPACE_MANAGEMENT
from
BO_EU_STOCK_CARGO_USING
where
BUSINESS_UNITS='{}';""".format(warehouse)
@get_results(0, 0)
def get_pro_num(self, warehouse, good):
"""获取生产批号"""
with allure.step('DB:获取生产批号'):
return """select
F_PRO_NUM
from
BO_EU_STOCK_CURRENT
where
F_ENTREPOT_CODE = '{warehouse}'
and F_COMMODITY_CODE = '{good}'
and F_CARGO_CODE in (
select
F_CARGO_CODE
from
BO_EU_STOCK_MGMT_CARGO_SPACE
where
F_ENTREPOT_CODE = '{warehouse}'
and F_COMMODITY_CODE = '{good}');""".format(**locals())
@get_results(0, 0)
def get_serial_flag(self, warehouse, good):
"""商品序列号标识"""
with allure.step('DB:查询商品序列号标识'):
return """select
F_IS_SERIAL_NO
from
BO_EU_BSI_GOODS_MCU
where
BUSINESS_UNITS='{warehouse}'
and COMMODITY_CODE='{good}';""".format(**locals())
@get_results(0, None)
def get_storage_sterilization_flag(self, company, good):
"""获取商品存储条件、灭菌管理标识"""
with allure.step('DB:获取商品存储条件、灭菌管理标识'):
return """select
STORAGECON, STERILIZATION_FLAG
from
bo_eu_bsi_commodity
where
COMPANY='{company}'
and COMMODITY_CODE='{good}';""".format(**locals())
@get_results(None, None)
def get_enable_serial(self, warehouse, good, batch, num):
"""获取可用序列号"""
with allure.step('DB:获取可用序列号'):
return """select
F_SERIAL
from
bo_eu_stock_serial
where
F_ENTREPOT_CODE = '{warehouse}'
and F_COMMODITY_CODE = '{good}'
and F_BATCH_SERIA = '{batch}'
and F_STATUS = '1'
and F_SERIAL not in (
select
F_SERIAL
from
bo_eu_stock_serial_occupy
where
F_ENTREPOT_CODE = '{warehouse}' and F_COMMODITY_CODE = '{good}'
and F_BATCH_SERIA = '{batch}')
limit 0,
{num};""".format(**locals())
@get_results(0, 0)
def get_follow_ql_code(self, hh_code):
"""获取连台请领单号"""
with allure.step('DB:获取连台请领单号'):
return """select
F_CST_ENQUIRY_NO
from
bo_eu_surgery_ior_header
where
BINDID in(
select
id
from
wfc_process
where
CREATEUSERDEPTID in(
select
TARGETDEPTID
from
wfc_task
where
TASKTITLE like '%{}%'))
order by
CREATEDATE desc
limit 0,1;""".format(hh_code)
@get_results(None, None)
def get_back_able_serial(self, order_code):
"""获取还回可用序列号"""
with allure.step('DB:获取还回可用序列号'):
return """select
F_SERIAL
from
aws.bo_eu_surgery_serial_detail
where
F_ORDER_NO = '{}'
and F_SERIAL_STATUS = 0;""".format(order_code)
@get_results(None, None)
def get_jr_info(self, order_code):
"""获取借入单信息"""
with allure.step('DB:获取借入单信息'):
return """select
F_COMMODITY_CODE,
F_SERIAL_MANGE_FLAG,
F_BATCH_NO,
F_RECEIVE_NUM
from
bo_eu_surgery_borrow_detail
where
F_REL_SALE_BILL_NO = '{}';""".format(order_code)
@get_results(None, None)
def get_surgery_serial(self, order_code, good, batch):
"""获取手术跟台序列号"""
with allure.step('DB:获取借出单商品序列号'):
return """select F_SERIAL from
bo_eu_surgery_serial_detail
where
F_ORDER_NO = '{order_code}'
and F_COMMODITY_CODE = '{good}'
and F_BATCH_NO = '{batch}';""".format(**locals())
# -*- coding:utf-8 -*-
# 作者:齐振鋆
# 日期:2023/2/14
# 描述:
import logging
import re
import allure
import pytest
from time import sleep
from page.GuKeYiTiHua.Public.errorMsg import ErrorMessage
from page.GuKeYiTiHua.Public.iFrame import IframeElement
from page.GuKeYiTiHua.Public.table import Table
from unit.public.UI.BasePage import BasePage
log = logging.getLogger(__name__)
class OrderList(BasePage):
em = ErrorMessage()
iframe = IframeElement()
table = Table()
def list_title(self, title):
self.wait_element("//p[@class='title-class' and text()='{}']".format(title))
def order_search(self, page_title, tap_name='待办', field_name=None, field_value=None, count=1, max_try=3,
count_check=True):
"""
查找单据
parameter page_title: 页面名称,一般为三级菜单
parameter tap_name:
parameter field_name: 查找字段 [field1, field2, ...]
parameter field_value: 查找值 [value1, value2, ...]
parameter count: 查询结果预期数量
parameter count_check: 是否启用数量验证,默认启用
"""
log.info('查询:{}-{}'.format(page_title, tap_name))
if type(field_name) != type(field_value):
raise Exception('字段名和字段值参数类型不一致')
self.out_frame()
self.iframe.to_main_iframe()
while self.list_title(page_title) is False:
sleep(1)
self.change_list_tap(tap_name) if tap_name is not None else 0
try_count = 0
fields = {}
if type(field_name) is not list:
fields.setdefault(field_name, field_value)
else:
for i in range(0, len(fields)):
fields.setdefault(field_name[i], field_value[i])
while self.get_results_number() != count and try_count < 5:
log.info("查找条件:{}".format(fields))
for index, key in enumerate(fields.keys()):
field_name, field_value = key, fields[key]
search_input = "//label[text()='{}']/following-sibling::div//input".format(field_name)
self.type(search_input, field_value)
self.enter(search_input) if index == len(fields) - 1 else 0
sleep(3)
if count_check is False:
break
try_count += 1
if try_count >= max_try:
self.screenshot()
pytest.fail('{}{}列表未查询到{}相关{}单据.'.format(page_title, tap_name, field_value, page_title))
def get_cell_text(self, field_name, row=1):
"""获取视图单元格内容"""
log.info('获取第{}行,字段{}的值')
col_id = self.table.get_col_id(field_name)
return self.get_ele_text("//td[@colid='{}' and not(contains(@class, 'fixed--hidden'))][{}]".format(col_id, row))
def open_order(self, column=None, row=1, order_code=None):
"""
param tag: link列名
param index: 行
"""
if order_code is None:
tag_colid = self.table.get_col_id(column)
text = self.get_cell_text(column, row)
log.info("打开单据【{}】".format(text))
self.click(
"(//td[@colid='{}' and not(contains(@class, 'fixed--hidden'))])[{}]//span".format(tag_colid, row))
else:
log.info("打开单据【{}】".format(order_code))
self.click("(//td[contains(@class, 'dw-click-cell')]//*[text()='{}'])[{}]".format(order_code, row))
self.iframe.to_edit_iframe()
self.em.check_message()
def checked_order(self, index=1, tag=None):
"""选择单据"""
if index == 0:
log.info("全选单据...")
check_box = "//th[not(contains(@class, 'fixed--hidden'))]//span[@title='全选/取消']"
else:
log.info("勾选单据...")
check_box_colid = self.table.get_col_id(tag)
check_box = "(//td[@colid='{}' and not(contains(@class, 'fixed--hidden'))])[{}]//span[contains(@class, 'vxe-cell--checkbox')]".format(
check_box_colid, index)
self.click(check_box)
def get_results_number(self):
"""获取视图查询统计数量"""
total_str = self.get_ele_text("//span[@class='vxe-pager--total']")
total = int(re.search(r"\d+", total_str).group(0))
return total
def change_list_tap(self, tap_name):
"""切换列表tap"""
log.info('切换到:【{}】tap页'.format(tap_name))
self.click("//li[@role='menuitem' and text()='{}']".format(tap_name))
def edit_iframe_is_show(self):
"""等待编辑窗口关闭"""
self.out_frame()
self.iframe.to_main_iframe()
count = 0
while self.wait_element("//div[@class='el-drawer__body']/ancestor::div[@class='el-overlay']",
wait_time=3) is True and count < 10:
sleep(1)
count += 1
def get_cell_text(self, field_name, row=1):
log.info('获取第{}行,字段{}的值')
col_id = self.table.get_col_id(field_name)
return self.get_ele_text("//div[@id='dw-grid-div']//tbody//td[@colid='{}'][{}]".format(col_id, row))
@allure.step('字段校验')
def field_value_check(self, field_name, expected_value, line=1):
"""视图单元格内容校验"""
text = self.get_cell_text(field_name, line)
if text != str(expected_value):
self.fail_screenshot()
pytest.fail('{}实际结果:{},与预期结果{} 不符'.format(field_name, text, expected_value))
# -*- coding:utf-8 -*-
# 作者:齐振鋆
# 日期:2022/11/7
# 描述:
# -*- coding:utf-8 -*-
# 作者:齐振鋆
# 日期:2023/3/4
# 描述:
import logging
from page.GuKeYiTiHua.Public.errorMsg import ErrorMessage
from page.GuKeYiTiHua.Public.iFrame import IframeElement
from unit.public.UI.BasePage import BasePage
log = logging.getLogger(__name__)
class ButtonElement(BasePage):
em = ErrorMessage()
iframe = IframeElement()
def click_button(self, root_str='', button_name='保存', end_str="/ancestor::button"):
"""点击按钮,默认为保存"""
log.info('点击:【{}】按钮'.format(button_name))
self.click("{}//*[text()='{}']{}".format(root_str, button_name, end_str))
self.em.check_message()
def new(self):
self.click_button(button_name='新建')
self.iframe.to_edit_iframe()
def all_delivery(self):
"""整单发货"""
self.click_button(button_name='整单发货')
def save(self):
"""保存"""
self.click_button(button_name='保存')
def submit(self):
"""提交"""
self.click_button(button_name='提交')
def nullify(self):
"""作废"""
self.click_button(button_name='作废')
def send(self):
"""发送"""
self.click_button(button_name='发送')
def transact(self):
"""办理"""
self.click_button(button_name='办理')
def scan_bar(self):
"""扫码"""
self.click("//button[text()='扫码']")
def all_cancel(self):
"""整单取消"""
self.click_button(button_name='整单取消')
def red_flush(self):
"""红冲"""
self.click_button(button_name='红冲')
self.iframe.to_transfer_out_iframe()
def all_red_flush(self):
"""整单红冲"""
self.click_button(button_name='整单红冲')
\ No newline at end of file
# -*- coding:utf-8 -*-
# 作者:齐振鋆
# 日期:2023/2/14
# 描述:
import logging
import allure
from unit.public.UI.BasePage import BasePage
log = logging.getLogger(__name__)
class CommonElement(BasePage):
@allure.step('关闭当前tap页面')
def close_tap(self, tap_name=None):
"""
关闭tap页,不传名称则关闭当前tap页
:param tap_name: tap名称
"""
log.info("Closing Tap")
self.out_frame()
tap_close_span = "//div[@id='awsui-tabs']//div[contains(@class, 'current')]/span[contains(@class, 'close')]" if tap_name is None else "//div[@id='awsui-tabs']//span[text()='{}']/following-sibling::span".format(
tap_name)
self.click(tap_close_span)
# -*- coding:utf-8 -*-
# 作者:齐振鋆
# 日期:2023/3/10
# 描述:
import logging
import pytest
from unit.public.UI.BasePage import BasePage
log = logging.getLogger(__name__)
class ErrorMessage(BasePage):
def check_message(self):
log.info('校验错误提示')
if self.wait_element("//div[contains(@id, 'message_')]//i[contains(@class, 'el-message-icon--error')]",
wait_time=3) is True:
error_message = self.get_ele_text("//div[contains(@id, 'message_')]//p/span")
self.fail_screenshot()
pytest.fail("监听到页面错误提示:{}".format(error_message))
def check_details_message(self):
log.info('校验子表')
if self.wait_element("//div[contains(@class, 'validate-msg-pop-body')]", wait_time=3) is True:
self.fail_screenshot()
pytest.fail("监听到子表错误提示")
# -*- coding:utf-8 -*-
# 作者:齐振鋆
# 日期:2022/11/10
# 描述:
import logging
from unit.public.UI.BasePage import BasePage
log = logging.getLogger(__name__)
class IframeElement(BasePage):
def to_main_iframe(self):
log.info("进入主iframe")
iframe = "//div[@class='awsui-tab-content-item awsui-tab-this']//iframe[@class='metro-main-frame']"
self.to_frame(iframe)
def to_edit_iframe(self):
log.info("进入编辑iframe")
iframe = "(//iframe[contains(@name, 'awsui-dialog-iframe')])[1]"
self.to_frame(iframe)
def to_bar_iframe(self, name='扫码'):
log.info("进入扫码iframe")
iframe = "//div[@aria-label='{}']//iframe".format(name)
self.to_frame(iframe)
def to_transfer_out_iframe(self):
log.info("进入调拨出库整单红冲iframe")
iframe = "//div[@aria-label='调拨出库单台账']//iframe"
self.to_frame(iframe)
\ No newline at end of file
# -*- coding:utf-8 -*-
# 作者:齐振鋆
# 日期:2022/9/23
import logging
import re
import allure
import os
import time
import pytesseract
from PIL import Image
from selenium.common.exceptions import TimeoutException, InvalidArgumentException
from unit.public.UI.BasePage import BasePage
from unit.public.DataDic import DataDic
from page.GuKeYiTiHua.Public.menu import MenuElement
log = logging.getLogger(__name__)
class LoginPage(BasePage):
mo = MenuElement()
@allure.step('登录')
def login(self):
log.info('登录')
project_conf = self.dd.get_value('project_conf')
user_info = project_conf['userinfo']
username_input = ('id', 'input1')
password_input = ('id', 'input2')
self.type(username_input, user_info['username'])
self.type(password_input, user_info['password'])
verificationCode = project_conf['verificationCode']
while verificationCode == 1:
log.info('输入验证码...')
self.input_vCode()
login_button = ('id', 'loginBtn')
self.click(login_button)
# time.sleep(1)
if self.login_check() is True:
break
self.enter(password_input) if verificationCode != 1 else 0
def input_vCode(self, vcode_xpath='//canvas'):
rate = self.dd.get_value('rate')
self.screenshot('vcode.png')
# 定位到图片元素
captcha_elm = self.get_element(vcode_xpath)
# 3、取验证码的矩形区域
point = captcha_elm.location # 字典形式 水平位置和垂直位置,x和y值
size = captcha_elm.size # 字典形式,宽和高
x = int(point['x'])
y = int(point['y'])
width = int(x + size['width'])
height = int(y + size['height'])
screen_path = DataDic().get_value('screenshot_path')
filepath = os.path.join(screen_path, 'vcode.png')
image_code = Image.open(filepath)
little_img = image_code.crop((int(x * rate), int(y * rate), int(width * rate), int(height * rate))) # 截图
little_file_name = 'vcode{}.png'.format(int(time.time() * 1000))
little_path = os.path.join(screen_path, little_file_name)
little_img.save(little_path) # 截图名字
result = '8888'
vCode = '//canvas'
try:
result = re.match(r'[\da-zA-Z]{4}', pytesseract.image_to_string(little_path).replace(' ', '')).group()
except AttributeError:
self.click(vCode)
time.sleep(1)
self.input_vCode()
log.info('验证码:{}'.format(result))
os.remove(little_path)
fil = ['0', '1', 'o', 'i', 'O', 'I']
fil_res = any(word if word in result else False for word in fil)
if fil_res is True or len(result) > 4:
self.click(vCode)
time.sleep(1)
self.input_vCode()
else:
vCode_input = ('id', 'photoCode')
self.type(vCode_input, result)
def login_check(self):
try:
self.get_element("//span[text()='退出']", retry=False)
return True
except InvalidArgumentException:
return False
except TimeoutException:
return False
# -*- coding:utf-8 -*-
# 作者:齐振鋆
# 日期:2022/9/23
import logging
import allure
from unit.public.UI.BasePage import BasePage
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)
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)
# -*- coding:utf-8 -*-
# 作者:齐振鋆
# 日期:2023/2/14
# 描述:
import logging
from time import sleep
from unit.public.UI.BasePage import BasePage
log = logging.getLogger(__name__)
class ModalBoxElement(BasePage):
@staticmethod
def get_search_input(title=None, placeholder=None):
if title is not None:
search_input = "//div[contains(@aria-label, '{}')]//div[@class='dictionary-search']//input".format(title)
elif placeholder is not None:
search_input = "//input[@placeholder='{}']".format(placeholder)
else:
search_input = "//div[@aria-modal='true']/div[@tabindex='-1']//input[@type='text']"
return search_input
def search_and_choose_items(self, title=None, placeholder=None, text=None, sing_choose=True, all_choose=False):
search_input = self.get_search_input(title, placeholder)
items = []
if type(text) is str:
items.append(text)
elif type(text) is list:
items = text
else:
log.error('查找参数格式不正确!')
for item in items:
self.type(search_input, item)
self.enter(search_input)
sleep(0.5)
if all_choose is False:
self.click_cell(title, placeholder, item) if sing_choose is True else 0
sleep(1)
else:
all_checkbox = "//div[@aria-modal='true']/div[@tabindex='-1']//th[@colspan=1]//input[@aria-hidden='false']"
self.click(all_checkbox)
sleep(0.5)
confirm_button = "{}/ancestor::div[@class='el-overlay']//div[@class='pagination-footer']//span[text()='确定']/parent::button[@aria-disabled='false']".format(
search_input)
self.click(confirm_button) if sing_choose is True or all_choose is True else 0
def click_cell(self, title=None, placeholder=None, text=None):
search_input = self.get_search_input(title, placeholder)
cell = "{}/ancestor::div[@class='el-overlay']//div[contains(@class, 'tableNoDesign')]//tbody//tr[1]//div[text()='{}']".format(search_input, text)
check_box = "{}/ancestor::tr/td[1]//label".format(cell)
while "is-checked" not in self.get_attribute(check_box, 'class'):
self.click(cell)
sleep(1)
# -*- coding:utf-8 -*-
# 作者:齐振鋆
# 日期:2023/2/14
# 描述:
import logging
import pytest
from time import sleep
from page.GuKeYiTiHua.Public.errorMsg import ErrorMessage
from page.GuKeYiTiHua.Public.table import Table
from unit.public.UI.BasePage import BasePage
log = logging.getLogger(__name__)
class OrderDetailMain(BasePage):
em = ErrorMessage()
def choose_tap(self, tap_name):
"""
主单信息tap页
parameter: tap_name tap名称
"""
log.info('切换详情tap页到:{}'.format(tap_name))
self.click("//*[text()='{}']".format(tap_name))
def text_input_item(self, name, text, enter=False, get=False):
log.info('【{}】输入:{}'.format(name, text))
text_input = "//*[string()='{}']/following-sibling::div//input".format(name)
if get is True:
return text_input
else:
self.type(text_input, text)
self.enter(text_input) if enter is True else 0
self.em.check_message()
def text_area_item(self, name, text):
log.info('【{}】输入:{}'.format(name, text))
area = "//*[string()='{}']/following-sibling::div//textarea".format(name)
self.type(area, text)
def some_click_item(self, name, end_str="i[@class='awsui-iconfont']", get=False):
log.info('点击:【{}】相关图标'.format(name))
element = "//*[text()='{}']/following-sibling::div//{}".format(name, end_str)
return element if get is True else self.click(element)
def drop_choose_item(self, name, item):
log.info('【{}】下拉选择:{}'.format(name, item))
self.click("//*[string()='{}']/following-sibling::div//input".format(name))
drop_item = "//div[@data-popper-placement='bottom-start' and @aria-hidden='false']//*[text()='{}']".format(item)
self.click(drop_item)
def date_input_item(self, name, date_str=None):
date_input = "//*[string()='{}']/following-sibling::div//input".format(name)
date_str = self.tu.get_date_str(1) if date_str is None else date_str
log.info('【{}】输入:{}'.format(name, date_str))
self.type(date_input, date_str)
def get_element_text(self, name, get=False):
log.info('获取:【{}】'.format(name))
element = "//div[text()='{}']/following-sibling::div/span".format(name)
if get is True:
return element
else:
text = self.get_ele_text(element)
log.info('{}:【{}】'.format(name, text))
return text
def choose_transactor(self, transactor='管理员'):
log.info('选择办理人&提交')
self.click("//div[text()='办理人']/following-sibling::div//i[contains(@class, 'awsui-iconfont-add-ico')]")
self.double_click("//span[text()='{} ']".format(transactor))
class OrderDetailTable(BasePage):
table = Table()
def position_cell(self, column_name, row_tag):
colid = self.table.get_col_id(column_name)
# 定位表格
th_xpath = "//span[text()='{}']/ancestor::th".format(column_name)
table_div = "{}/ancestor::div[@class='form-row']".format(th_xpath)
# 定位行
tr_xpath = "{}//span[text()='{}']/ancestor::tr[contains(@class,'vxe-body--row')]".format(table_div, row_tag)
# 定位列
return "{}/td[@colid='{}']/div".format(tr_xpath, colid)
def get_cell_text(self, column_name, row_tag):
log.info('获取{}的{}'.format(row_tag, column_name))
# 获取列id
cell = self.position_cell(column_name, row_tag)
self.scroll_element(cell)
return self.get_ele_text(cell)
def input_text(self, column_name, row_tag, text):
log.info('【{}】的【{}】输入:【{}】'.format(row_tag, column_name, text))
# 定位单元格
td_xpath = self.position_cell(column_name, row_tag)
self.scroll_element(td_xpath)
# 点击单元格以加载输入框
self.click(td_xpath)
# 定位输入框
input_xpath = "{}//input".format(td_xpath)
# 输入内容
self.type(input_xpath, text)
# 移出光标
th_xpath = "//span[text()='{}']/ancestor::th".format(column_name)
self.click(th_xpath)
sleep(0.5)
def choose_item(self, column_name, row_tag, item):
log.info('【{}】的【{}】选择:【{}】'.format(row_tag, column_name, item))
# 定位单元格
td_xpath = self.position_cell(column_name, row_tag)
self.scroll_element(td_xpath)
# 点击单元格以加载输入框
self.click(td_xpath)
self.click("//div[@data-popper-placement='bottom-start' and @aria-hidden='false']//*[text()='{}']".format(item))
# 移出光标
th_xpath = "//span[text()='{}']/ancestor::th".format(column_name)
self.click(th_xpath)
sleep(0.5)
# 移出光标
th_xpath = "//span[text()='{}']/ancestor::th".format(column_name)
self.click(th_xpath)
sleep(0.5)
def get_details(self, columns):
columns = [columns] if type(columns) == str else columns if type(columns) == list else pytest.fail(
"获取单据明细详情参数类型错误")
detail_list = []
col_list = []
for column in columns:
colid = self.table.get_col_id(column)
col_list.append(colid)
lines = len(self.get_elements("//tr[@class='vxe-body--row']"))
log.info('当前单据有:{}行商品明细'.format(lines))
for index in range(lines):
item = []
for col_id in col_list:
ele = "(//td[@colid='{}' and contains(@class, 'col--left')])[{}]//*[contains(@class, 'label')]".format(col_id, index + 1)
log.info('{}:{}'.format('元素:', ele))
txt = self.get_ele_text(ele)
log.info('{}:{}'.format('文本:', txt))
item.append(txt)
detail_list.append(item)
return detail_list
class ScanTable(BasePage):
"""扫码明细"""
def check_enter_result(self, text):
"""检查扫码结果"""
td = "//*[text()='扫码明细']/following-sibling::div//*[text()='{}']".format(text)
self.wait_element(td, wait_time=3)
# -*- coding:utf-8 -*-
# 作者:齐振鋆
# 日期:2023/2/17
# 描述:
from unit.public.UI.BasePage import BasePage
class Table(BasePage):
def get_col_id(self, field_name):
# 获取列id
th_xpath = "//span[text()='{}']/ancestor::th[not(contains(@class, 'hidden'))]".format(field_name)
return self.get_attribute(th_xpath, 'colid')
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