Commit b296d423 authored by 17322369953's avatar 17322369953
Browse files

框架,登录案例推送

parent efe92e0d
url: http://scdev.cmic.com.cn:8088/beta/
account: bj_qgl
password: Gyxc12345
\ No newline at end of file
from test_login.page_login import PageLogin
from selenium.webdriver.remote.webdriver import By
class PagePurchaseOP(PageLogin):
# 采购管理元素
_purchase_management_locator = (By.XPATH, '//div[@class="menuNavItem" and @sysname="采购管理"]')
# 采购元素
_purchase_locator = (By.XPATH, '//div[@class="sec-menu" and @navname="采购"]')
# 采退元素
_return_locator = (By.XPATH, '//div[@class="sec-menu" and @navname="采退"]')
# 采购订单op
_purchase_op_locator = (By.XPATH, '//div[@class="third-menu" and @navname="采购订单(OP)"]')
# 采购iframe
_iframe_purchase_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.XPATH, '/html/body/div[6]/div/div/div/div[1]/div[2]/div[1]/div/div/div/div[1]/div[3]/div/div[1]/div/table')
_company_table_locator = (By.CLASS_NAME, "el-table__body")
# 公司确定按钮
_company_table_ensure_locator = (By.XPATH, '//span[@class="ensureBtn"]/button/span[text() = "确定"]')
# 仓库信息
_ware_info_locator = (By.ID, 'tab-a58f571e-7488-4c22-bec0-67428972871d')
# 主体信息
_main_info_locator = (By.ID, 'tab-7667cf55-c391-4f2c-a5ba-c0f6d27b6d3a')
# 请求查询仓库元素
_ware_request_locator = (By.XPATH, '//input[starts-with(@id,"el-id-") and contains(@id,"-107")]/../span/span/i')
# 仓库输入元素
_ware_input_locator = (By.XPATH, '//input[@placeholder = "模糊检索:仓库名称,仓库编码"]')
# 仓库搜索元素
_ware_search_locator = (By.XPATH, '//input[@placeholder = "模糊检索:仓库名称,仓库编码"]/../span/span/i')
# 仓库表-----这个只能找绝对路径了,开发太狠了
# _ware_table_locator = (
# By.XPATH, '/html/body/div[8]/div/div/div/div[1]/div[2]/div[1]/div/div/div/div[1]/div[3]/div/div[1]/div/table')
# 仓库表,通过dialog定位
# _ware_table_locator = (By.XPATH, '//div[@role = "dialog" and @aria-label = "选择仓库"]/*/table[@class = "el-table__body"]')
_ware_dialog_locator = (
By.XPATH, '//div[starts-with(@id,"el-id-") and contains(@id,"-26") 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_request_locator = (By.XPATH, '//input[starts-with(@id,"el-id-") and contains(@id,"-108")]/../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,"-31") 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_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_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_locator = (By.XPATH, '//span[text()="商品录入"]')
# 商品dialog
_merchandise_dialog_locator = (
By.XPATH, '//div[starts-with(@id,"el-id-") and contains(@id,"-124") 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()="保存"]')
# 订单号
_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_purchase_management(self):
return self.get_element_wait_presence(self._purchase_management_locator)
'''获取采购元素'''
def get_purchase(self):
return self.get_element_wait_presence(self._purchase_locator)
'''获取采退元素'''
def get_return(self):
return self.get_element_wait_presence(self._return_locator)
'''获取采购订单op元素'''
def get_purchase_op(self):
return self.get_element_wait_presence(self._purchase_op_locator)
'''获取采购iframe元素'''
def get_iframe_purchase(self):
return self.get_element_wait_presence(self._iframe_purchase_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)
'''获取请求查询仓库元素'''
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)
'''获取仓库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)
'''获取供应商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)
'''获取协议请求元素'''
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)
'''获取业务员请求元素'''
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)
'''商品录入按钮'''
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)
# author:qinguanglei
# ddate:2023/11/14 16:47
# 购买多个序列号商品
import os
import time
from pip._internal.commands import inspect
from selenium import webdriver
from selenium.webdriver import Keys
from selenium.webdriver.common.by import By
from guke.common.logger import log
from guke.common.read_yaml import get_value_by_filed_from_yaml
def test_buy_nonseq_commodities():
option = webdriver.ChromeOptions()
# option.add_experimental_option("detach", True) # 设置不要自动关闭浏览器
# 获取驱动器
driver = webdriver.Chrome(options=option)
# 最大化页面
driver.maximize_window()
driver.get("http://scdev.cmic.com.cn:8088/beta/")
driver.implicitly_wait(10)
# 获取公共信息,注意公共信息的内容在案例的同级目录下
# 获取本案例的绝对路径,绝对路径的目录就是该案例的同级目录
# 需要知道哪个文件名
direction = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'data.yaml')
# 取文件中的user栏位
account = get_value_by_filed_from_yaml(direction, 'account')
# 取文件中的password栏位
password = get_value_by_filed_from_yaml(direction, 'password')
log.info('获取的密码为%s', password)
root_dir = os.path.abspath(os.sep)
print(root_dir)
# BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# user =
driver.find_element(By.ID, 'input1').clear()
driver.find_element(By.ID, 'input1').send_keys(account)
driver.find_element(By.ID, 'input2').clear()
driver.find_element(By.ID, 'input2').send_keys(password)
driver.find_element(By.ID, 'input2').send_keys(Keys.ENTER)
time.sleep(1)
# author:qinguanglei
# ddate:2023/11/14 16:47
# 购买一个非序列号商品
\ No newline at end of file
# author:qinguanglei
# ddate:2023/11/14 16:47
# 购买1个序列号商品
\ No newline at end of file
# author:qinguanglei
# ddate:2023/11/14 16:47
# 购买多个序列号商品
\ No newline at end of file
"""
日志生成步骤:
1,设置存放日志的目录,不存在则创建。
......@@ -9,14 +8,13 @@
6,确保每日生成不同的日志文件,且能够区分生成时间,可用logging.handlers.TimeRotatingFileHandler进行处理,使用之前先进行导入
7,将日志对象添加到logger里
8,进行调用即可get_logger(name="test")
9,日期文件全部进去根目录的autotest_sc_log目录下,将日志文件与项目分离,后续可以使用filebet进行日志采集,进入日志云查询日志
"""
import logging
import os
import time
from logging.handlers import TimedRotatingFileHandler
from common.read_config import ReadConfig
class Log(object):
def __init__(self):
......@@ -30,9 +28,11 @@ class Log(object):
log_formatter = logging.Formatter(formatter)
# 设置存放日志的目录,不存在则创建。
# 获取日志文件的目录
# log_dir = os.path.join(ReadConfig().get('LOGFILE', 'LOGFILE_DIR'), 'report')
log_dir = ReadConfig().get('LOG-FILE', 'LOGFILE_DIR')
# 日志文件将放入根目录下,后续更新日志不影响各个项目。
# 日志目录名叫autotest_sc_log
root_dir = os.path.abspath(os.sep)
# 日志目录
log_dir = os.path.join(root_dir, 'autotest_sc_log')
# 若该目录不存在则创建该目录
if not os.path.exists(log_dir):
os.mkdir(log_dir)
......
# author:qinguanglei
# ddate:2023/11/14 16:14
# 该功能为读取yaml数据功能
import yaml
import os
def read_yaml(yaml_path):
'''读取yaml文件内容
参数path: 相对路径,起始路径:项目的根目录
realPath: 文件的真实路径,绝对路径地址 '''
if not os.path.isfile(yaml_path):
raise FileNotFoundError("文件路径不存在,请检查路径是否正确:%s" % yaml_path)
# open方法打开直接读出来
f = open(yaml_path, 'r', encoding='utf-8')
cfg = f.read() # 读取出来是yaml文件格式
d = yaml.load(cfg, Loader=yaml.FullLoader) # 因此我们用load方法转字典
print("读取的测试文件数据:%s" % d)
return d
def get_value_by_filed_from_yaml(yaml_path, field):
dictionary = read_yaml(yaml_path)
return dictionary[field]
from pytesseract import image_to_string
from PIL import Image, ImageEnhance
from common.read_config import ReadConfig
from common.logger import log
from guke.common.logger import log
def gen_text_from_picture():
......
This source diff could not be displayed because it is too large. You can view the blob instead.
# This is a sample Python script.
import os
import pytest
# Press Shift+F10 to execute it or replace it with your code.
# Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings.
def create_report_dir():
# 创建测试报告目录,此时目录结构不要随便更改,函数也不要随便移动,因为直接与路径挂钩
# 直接拼接目录
abs_path = os.path.abspath(__file__)
# 往上一级到项目目录
project_dir = os.path.dirname(abs_path)
# 开始拼接报告目录
log_dir = os.path.join(project_dir, 'report')
# 若该目录不存在则创建该目录
if not os.path.exists(log_dir):
os.mkdir(log_dir)
return log_dir
def print_hi(name):
# Use a breakpoint in the code line below to debug your script.
print(f'Hi, {name}') # Press Ctrl+F8 to toggle the breakpoint.
# Press the green button in the gutter to run the script.
if __name__ == '__main__':
print_hi('PyCharm')
# pytest.main(
# ['-vs', 'D:/pythonProject/atuobase/test_login/test_login_success.py', '--reruns', '3', '--reruns-delay', '2', '--alluredir',
# os.path.join(os.sep, 'autotest_sc_report'),
# '--clean-alluredir'])
# 创建报告目录
report_dir = create_report_dir()
pytest.main(
['-vs', 'D:/pythonProject/atuobase/test_login/test_login_success.py', '--reruns', '3', '--reruns-delay', '2', '--alluredir',
report_dir, '--clean-alluredir'])
# 开始执行用例
#pytest.main(
# ['-vs', 'D:/pythonProject/atuobase/test_login', '--reruns', '3', '--reruns-delay', '2', '--alluredir',
# report_dir, '--clean-alluredir'])
# Mail().send()
os.system('allure serve %s' % report_dir)
# 可以在终端执行命令 pytest D:\pythonProject\atuobase\test_login\test_login_success.py
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
import os
class BasePage(object):
def __init__(self, driver):
# 获取驱动
self.driver = driver
# 线程等待时间,秒
self.time_seconds = 1
def open_page(self, url):
"""打开页面"""
# 获取页面链接
self.driver.get(url)
# 设置隐式等待时间
self.driver.implicitly_wait(10)
# 窗口最大化
self.driver.maximize_window()
'''单击一个元素'''
def single_click(self, page_element):
page_element.click()
def single_click_then_wait(self, page_element, seconds):
page_element.click()
self.wait_seconds(seconds)
'''获取一个元素上的文本信息'''
def get_text(self, page_element):
text = page_element.get_attribute('textContent')
return text
'''填入文本'''
def input_text(self, page_element, text):
page_element.clear()
page_element.send_keys(text)
"""在一定时间内定位到某个元素,且这个元素已经能呈现出来"""
def get_element_wait_presence(self, locator):
self.wait_seconds(self.time_seconds)
element = WebDriverWait(self.driver, 10, 0.1).until(EC.presence_of_element_located(locator))
return element
def refresh_page(self):
"""刷新页面"""
self.driver.refresh()
def move_to_element(self, page_element):
"""移动鼠标仅限于鼠标触发型元素,需要等待元素程序才移动"""
self.wait_seconds(2 * self.time_seconds)
"""鼠标移到page_element上"""
action_chains = ActionChains(self.driver)
action_chains.move_to_element(page_element).perform()
"""切换到iframe上"""
def switch_to_iframe(self, page_element_iframe):
self.wait_seconds(self.time_seconds)
self.driver.switch_to.frame(page_element_iframe)
"""获取一个表的行信息"""
def get_all_rows_from_tale(self, table_element):
self.wait_seconds(self.time_seconds)
rows = table_element.find_elements(By.TAG_NAME, "tr")
return rows
"""获取一个表,指定行的列信息"""
def get_all_columns_from_row(self, row_element):
columns = row_element.find_elements(By.TAG_NAME, "td")
return columns
'''给定一个表中的某行的某列,要输入信息,需要取出该栏位中的input元素-后续看要不要将该方法移出基础库,移到对应的功能库'''
def get_input_from_column(self, column):
element = column.find_element(By.TAG_NAME, 'input')
return element
def wait_seconds(self, seconds):
"""睡眠时间-秒"""
sleep(seconds)
def get_screenshot(self, filename="截图"):
""""截图"""
# 截图根目录
screenshot_dir = './screenshot'
if not os.path.exists(screenshot_dir):
# 目录不存在则创建目录
os.mkdir(screenshot_dir)
# 当前日期
now_date = datetime.now().strftime('%Y%m%d')
# 设置文件目录下按照日期新建的子文件夹
screenshot_date_dir = os.path.join(screenshot_dir, str(now_date))
if not os.path.exists(screenshot_date_dir):
# 不存在则创建
os.mkdir(screenshot_date_dir)
# 时间戳到毫秒级
now_time_ms = datetime.now().strftime('%H%M%S%f')
# 拼接截图的图片名与类型,时间戳 + 文件名 + .png
filename = now_time_ms + filename + ".png"
# 图片目录确定
filepath = os.path.join(screenshot_date_dir, filename)
# 截图保存到该目录
self.driver.get_screenshot_as_file(filepath)
'''展示窗口句柄信息,测试用,只下日志'''
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)
'''获取当前页面title'''
def get_window_title(self):
""""切换页面需要时间"""
self.wait_seconds(self.time_seconds)
return self.driver.title
"""关闭当前页面"""
def close_browser(self):
self.driver.close()
"""关闭所有页面"""
def quit_browser(self):
self.driver.quit()
# author:qinguanglei
# ddate:2023/11/10 16:07
from test_login.page_login import PageLogin
from selenium.webdriver.remote.webdriver import By
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.XPATH, '/html/body/div[6]/div/div/div/div[1]/div[2]/div[1]/div/div/div/div[1]/div[3]/div/div[1]/div/table')
_company_table_locator = (By.CLASS_NAME, "el-table__body")
# 公司确定按钮
_company_table_ensure_locator = (By.XPATH, '//span[@class="ensureBtn"]/button/span[text() = "确定"]')
# 仓库信息
_ware_info_locator = (By.ID, 'tab-a58f571e-7488-4c22-bec0-67428972871d')
# 主体信息
_main_info_locator = (By.ID, 'tab-7667cf55-c391-4f2c-a5ba-c0f6d27b6d3a')
# 请求查询仓库元素
_ware_request_locator = (By.XPATH, '//input[starts-with(@id,"el-id-") and contains(@id,"-107")]/../span/span/i')
# 仓库输入元素
_ware_input_locator = (By.XPATH, '//input[@placeholder = "模糊检索:仓库名称,仓库编码"]')
# 仓库搜索元素
_ware_search_locator = (By.XPATH, '//input[@placeholder = "模糊检索:仓库名称,仓库编码"]/../span/span/i')
# 仓库表-----这个只能找绝对路径了,开发太狠了
# _ware_table_locator = (
# By.XPATH, '/html/body/div[8]/div/div/div/div[1]/div[2]/div[1]/div/div/div/div[1]/div[3]/div/div[1]/div/table')
# 仓库表,通过dialog定位
# _ware_table_locator = (By.XPATH, '//div[@role = "dialog" and @aria-label = "选择仓库"]/*/table[@class = "el-table__body"]')
_ware_dialog_locator = (
By.XPATH, '//div[starts-with(@id,"el-id-") and contains(@id,"-26") 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_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_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_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_locator = (By.XPATH, '//span[text()="商品录入"]')
# 商品dialog
_merchandise_dialog_locator = (
By.XPATH, '//div[starts-with(@id,"el-id-") and contains(@id,"-124") 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()="保存"]')
# 订单号
_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)
'''获取请求查询仓库元素'''
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)
'''获取仓库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)
'''获取供应商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)
'''获取协议请求元素'''
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)
'''获取业务员请求元素'''
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)
'''商品录入按钮'''
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)
# author:qinguanglei
# ddate:2023/11/20 10:15
import traceback
import allure
from common import constant
from common.logger import log
from common.read_yaml import get_filed_from_yaml
from common.verifycode import VerifyCode
from test_buy.page_buy import PageBuy
module = 'test_buy'
class StepsBuy(object):
def __init__(self, driver):
self.page_buy = PageBuy(driver)
self.driver = driver
@allure.step("打开浏览器")
def open_browser(self):
try:
log.info('当前url: %s', get_filed_from_yaml(module, "data", "url"))
self.page_buy.open_page(get_filed_from_yaml(module, "data", "url"))
except Exception as e:
log.error(f'打开浏览器问题:{e.__doc__}{traceback.format_exc()}')
assert False
@allure.step("登录")
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)
log.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
log.warn('执行登录失败一次,次数多了将直接导致案例失败。')
else:
# 表示登录成功,跳出循环
log.info('登录成功,开始执行案例。')
break
if i <= 0:
log.error(f'验证码已经连续{max_retry}次识别失败,本案例执行时登录失败,请检查环境是否出现问题,特别是分辨率是否调整。')
assert False
log.info(f'登录成功。')
except Exception as e:
log.error(f'登录过程问题:{e.__doc__}{traceback.format_exc()}')
assert False
@allure.step("进入普通采购单界面")
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()
log.info(f'成功进去普通采购单页面。')
except Exception as e:
log.error(f'进入普通采购单界面问题:{e.__doc__}{traceback.format_exc()}')
assert False
@allure.step("打开新建普通采购单界面")
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)
log.info(f'成功打开新建普通采购单界面。')
except Exception as e:
log.error(f'进入新建普通采购单界面问题:{e.__doc__}{traceback.format_exc()}')
assert False
@allure.step("输入供应商")
def input_supplier(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):
# 获取当前供应商的列信息
columns = self.page_buy.get_all_columns_from_row(current_row)
# 遍历列内容,这里只是先打印出日志,便于查看问题
for j, curr_column in enumerate(columns):
log.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)
'''选中后退出,不再查询'''
break
log.info(f'供应商{supplier_content}输入成功。')
except Exception as e:
log.error(f'输入供应商问题:{e.__doc__}{traceback.format_exc()}')
assert False
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