From 99e28f8458531c6ce86a3e716cfc6f709cbd35b1 Mon Sep 17 00:00:00 2001 From: Super <1171089625@qq.com> Date: Tue, 24 Oct 2023 15:09:45 +0800 Subject: [PATCH] commit --- public/__init__.py | 0 public/action.py | 107 ++++++++++++ public/mail1.py | 45 +++++ public/tools.py | 214 ++++++++++++++++++++++++ testcase/test_scene1/__init__.py | 0 testcase/test_scene1/scene1_mainflow.py | 101 +++++++++++ 6 files changed, 467 insertions(+) create mode 100644 public/__init__.py create mode 100644 public/action.py create mode 100644 public/mail1.py create mode 100644 public/tools.py create mode 100644 testcase/test_scene1/__init__.py create mode 100644 testcase/test_scene1/scene1_mainflow.py diff --git a/public/__init__.py b/public/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/public/action.py b/public/action.py new file mode 100644 index 0000000..faf8f74 --- /dev/null +++ b/public/action.py @@ -0,0 +1,107 @@ + +from selenium import webdriver +from selenium.webdriver import ChromeOptions + +from public.tools import wait + + +def settle_accounts_point(chrome,product_id,old_type="中心库入库结算",new_type="",flag=1): + if (flag==1): + wait() + chrome.find_element_by_xpath('//span[text()="%s"]'%old_type).click() + wait() + chrome.find_element_by_xpath('//span[text()="批量导入"]').click() + wait(2) + chrome.find_element_by_xpath('//input[@id="basic_goodsName" and @placeholder="编号/名称/简拼"]').send_keys(product_id) + wait() + chrome.find_element_by_xpath('(//span[text()="查 询"])[2]').click() + wait() + # 勾选产品前面的复选框 + try: + chrome.find_element_by_xpath('//td[@title="%s"]/preceding-sibling::td/label/span/input' % product_id).click() + wait() + chrome.find_element_by_xpath('(//span[text()="确 定"])[1]').click() + except: + print('没查询出产品') + chrome.find_element_by_xpath('(//span[text()="取 消"])[1]').click() + wait() + elif (flag==2): + wait() + chrome.find_element_by_xpath('//span[text()="%s"]' % old_type).click() + wait() + chrome.find_element_by_id('form_item_goodsName').send_keys(product_id) + wait() + chrome.find_element_by_xpath('(//span[text()="查 询"])').click() + try: + chrome.find_element_by_xpath('//input[@type="checkbox"]').click() + except: + return + wait() + chrome.find_element_by_xpath('//span[contains(text(),"批量转")]').click() + wait() + # chrome.find_element_by_xpath('//label[text()="调整后规则"]/parent::div/following-sibling::div').click() + chrome.find_element_by_xpath('(//span[@class="ant-select-selection-item"])[2]').click() + wait() + chrome.find_element_by_xpath('//div[text()="中心库出库结算"]').click() + wait() + chrome.find_element_by_xpath('// span[text() = "确 定"]').click() + + +def nGuiBrowserObject(): + opt = ChromeOptions() # 创建 Chrome 参数对象 + opt.headless = False # 把 Chrome 设置成无界面模式,windows/Linux 皆可 + # opt.headless = True # 无界面 + opt.add_argument('--start-maximized') + opt.add_argument('--window-size=1920x887') + chrome = webdriver.Chrome(options=opt,executable_path="c:/python34/chromedriver.exe") # 创建无界面对象 + return chrome +#打开网页 +def openBrowser(url): + # chrome = webdriver.Chrome() #因为firefox是在此处定义的 + chrome=nGuiBrowserObject() + chrome.implicitly_wait(10) #隐式等待 10秒 + chrome.get(url) + return chrome #所以函数必须返回firefox,后面的脚本才能使用 +#dbshop前台登录 +def logIn(chrome,username,password): + chrome.find_element_by_xpath('//input[@placeholder="请输入用户名"]').clear() + chrome.find_element_by_xpath('//input[@placeholder="请输入用户名"]').send_keys(username) + # chrome.find_element_by_xpath('//input[@placeholder="请输入密码"]').send_keys(password) + chrome.find_element_by_xpath('//span[text()="登 录"]').click() +#dbshop前台修改密码 +def changePassword(firefox,password,newPassword): + firefox.find_element_by_link_text("用户中心").click() + firefox.find_element_by_link_text("账户信息").click() + firefox.find_element_by_link_text("密码修改").click() + firefox.find_element_by_id("old_user_password").send_keys(password) + firefox.find_element_by_id("user_password").send_keys(newPassword) + firefox.find_element_by_id("user_password_con").send_keys(newPassword) + firefox.find_element_by_xpath('//button[@type="submit"]').click() +#dbshop前台退出 +def logOut(firefox): + firefox.find_element_by_link_text("退出").click() +#dbshop后台登录 +def logInAdmin(firefox): + firefox.find_element_by_id("user_name").send_keys("admin") + firefox.find_element_by_id("user_passwd").send_keys("123456") + firefox.find_element_by_xpath('//button[@class="btn"]').click() +#dbshop进入后台二级菜单 +def enterMenu3(chrome,menu1,menu2,menu3): + wait() + chrome.find_element_by_xpath(menu1).click() + wait() + chrome.find_element_by_xpath(menu2).click() + wait() + chrome.find_element_by_xpath(menu3).click() + wait() +# #dbshop进入后台三级菜单 +# def enterMenu3(firefox,menu1,menu2,menu3): +# firefox.find_element_by_link_text(menu1).click() +# from selenium.webdriver.common.action_chains import ActionChains # 导入ActionChains类 +# mouse = ActionChains(firefox) # 以浏览器为参数,实例化一个对象mouse,用于模拟鼠标操作浏览器 +# element = firefox.find_element_by_link_text(menu2) # 先定位到要操作的对象element +# mouse.move_to_element(element).perform() # 鼠标移动到元素element上,perform()是立即的意思 +# firefox.find_element_by_link_text(menu3).click() +#dbshop项目页面切换 +def switch_page(a,firefox): + firefox.switch_to.window(firefox.window_handles[a-1]) diff --git a/public/mail1.py b/public/mail1.py new file mode 100644 index 0000000..8610854 --- /dev/null +++ b/public/mail1.py @@ -0,0 +1,45 @@ +from smtplib import SMTP_SSL +from email.header import Header +from email.mime.text import MIMEText +from email.mime.multipart import MIMEMultipart +from email.mime.application import MIMEApplication +from email.mime.image import MIMEImage + +send_usr = '18627022503@163.com' # 发件人 +send_pwd = 'EBJFCICTFEONFQEO' # 授权码,邮箱设置 +reverse = '18627022503@163.com' # 接收者 +content = '2022

python官网链接如下:

' \ + '

python

' +#content 内容设置 +html_img = '

{content}

' # html格式添加图片 +email_server = 'smtp.163.com' +email_title = '脚本执行成功了' # 邮件主题 + +def send_email1(image_path,email_title): + msg = MIMEMultipart() # 构建主体 + msg['Subject'] = Header(email_title,'utf-8') # 邮件主题 + msg['From'] = send_usr # 发件人 + msg['To'] = Header('xhs','utf-8') # 收件人--这里是昵称 + # msg.attach(MIMEText(content,'html','utf-8')) # 构建邮件正文,不能多次构造 + attchment = MIMEApplication(open(r'D:/test.xlsx','rb').read()) # 文件 + attchment.add_header('Content-Disposition','attachment',filename='test.png') + msg.attach(attchment) # 添加附件到邮件 + # f = open("D:\\PycharmProjects\\cmic_python_JobLog\\xhsmail\\2023-04-30_090212.png", 'rb') #打开图片 + f = open(image_path, 'rb') #打开图片 + msgimage = MIMEImage(f.read()) + f.close() + msgimage.add_header('Content-ID', '') # 设置图片 + msg.attach(msgimage) + msg.attach(MIMEText(html_img,'html','utf-8')) # 添加到邮件正文 + try: + smtp = SMTP_SSL(email_server) #指定邮箱服务器 + smtp.ehlo(email_server) # 部分邮箱需要 + smtp.login(send_usr,send_pwd) # 登录邮箱 + smtp.sendmail(send_usr,reverse,msg.as_string()) # 分别是发件人、收件人、格式 + smtp.quit() # 结束服务 + print('邮件发送完成--') + except: + print('发送失败') + +# if __name__ == '__main__': +# send_email1() diff --git a/public/tools.py b/public/tools.py new file mode 100644 index 0000000..4e28a74 --- /dev/null +++ b/public/tools.py @@ -0,0 +1,214 @@ +import subprocess +from datetime import timedelta, date + + +def IsFileContentRight(url): + f = open(url, "r", encoding="utf-8") # 从文件中读取内容 + str1=f.read() + import re + if (re.search(",",str1)!=None or re.search(":",str1)!=None): + return False + else: + f.close() + f = open(url, "r", encoding="utf-8") # 从文件中读取内容 + mylist1 = f.readlines() + + x = 0 + j = 0 + count=0 + for i in mylist1: + if (re.match("子任务数:", i) != None): + print("找到了") + j = i[5:6] + print('子任务数', j) + break + for i in mylist1: + if (re.match("任务", i) != None): + print('找到了%s个任务' % x) + x = x + 1 + print("真实子任务个数", x) + for i in mylist1: + if (re.match("实际工时", i) != None): + count=i.count(",") + count = int(count) + 1 + # break + if (j == str(x)==str(count)): + return True + else: + return False + + +def End_Chrome_Progress(): + subprocess.call("TASKKILL /f /IM CHROME.EXE") + subprocess.call("TASKKILL /f /IM CHROMEDRIVER.EXE") + + +# 读取文件所有内容 +def readFile_all(url): + f = open(url, "r", encoding="utf-8") # 从文件中读取内容 + t = f.read() + f.close() + return t + + +# 读取文件内容的函数,需要1个参数文件地址 +def readFile(f): + # f = open(url, "r") # 从文件中读取内容 + t = f.readline() + # f.close() + return t + + +# 覆盖写入 +def writeFile(url, text): + f = open(url, "w", encoding="utf-8") + f.write(text) + f.close() + + +# 追加写入 +def writeFile_append(url, text): + f = open(url, "a", encoding="utf-8") + f.write(get_time_hms()+":::"+text+'\n') + f.close() + + +# 读取文件内容的函数,对内容进行处理,去掉冒号前面的内容 +def readFileContent(url): + f = open(url, "r", encoding="UTF-8") # 从文件中读取内容 + t = f.readlines() + path1 = get_pro_path() + writeFile(path1 + '/add/Everydaylog.txt', "") # 先清空所有内容 + writeFile(path1 + '/update/update_Everyday_log.txt', "") # 先清空所有内容 + import re + for i in t: + if i == '\n': + break + mylist = re.split(":", i) + # print(mylist) + if mylist[0] == "实际工时": + mylist[1] = mylist[1].replace('\n', "") + writeFile_append(path1 + '/add/Everydaylog.txt', mylist[1]) + writeFile_append(path1 + '/update/update_Everyday_log.txt', mylist[1]) + f.close() + return t + + +def get_time(type=1): + import time + if (type==1): + t = time.strftime("%Y-%m-%d", time.localtime()) + else: + t = time.strftime("%Y%m", time.localtime()) + # t = time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime()) + return t + + +def get_time_add(days_aa): + import time + # t = time.strftime("%Y-%m-%d", datetime.datetime.now()) + tomorrow = (date.today() + timedelta(days=days_aa)).strftime("%Y-%m-%d") + return tomorrow + + +def get_time_hms(): + import time + # t = time.strftime("%Y-%m-%d", time.localtime()) + timedelta(days=1) + t = time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime()) + return t + + +def get_localhost_ip(): + import socket + ip = socket.gethostbyname(socket.gethostname()) + ip = ip[0:5] + print("http://" + ip) + return "http://" + ip + + +# 获取当前项目的根目录的路径 +def get_pro_path(): + import os + # print('根据当前文件获取当前文件所在目录的路径', os.path.dirname(__file__)) + curPath = os.path.abspath(os.path.dirname(__file__)) # 获取当前文件的所在目录的绝对路径 + # print(curPath) # C:\Users\xhs\Desktop\dbshop项目相关文档2\dbshop1\main + # #将当前文件的所在目录的绝对路径进行分离,分离成C:\Users\xhs\Desktop\dbshop项目相关文档2\dbshop1 和main,存到元组中 + print(os.path.split(curPath)) + rootPath = os.path.split(curPath)[0] # [0]表示元组中的为一个元素 + # print('当前项目的根目录', rootPath) + return rootPath + + +# 截图 +def getErrorPhoto(chrome,type=1): + #1正常截图 2错误截图 + import time + if type==1: + imgName = time.strftime("%Y%m%d_%H%M%S", time.localtime()) + ".png" + pro_path = get_pro_path() # 获取项目的根目录的路径 + image_path = pro_path + "//logs//" + imgName + chrome.get_screenshot_as_file(image_path) + return imgName, image_path + else: + imgName = time.strftime("%Y%m%d_%H%M%S", time.localtime()) + ".png" + pro_path = get_pro_path() # 获取项目的根目录的路径 + image_path = pro_path + "//logs_error//" + imgName + chrome.get_screenshot_as_file(image_path) + return imgName, image_path + + +# +def is_file_exist(filename): + try: + f = open(filename, 'r', encoding='utf-8') + except: + return False + else: + return True +#获取时间的分 +def get_time_m(): + import time + from datetime import datetime + nows = int(time.time()) + # timestamp = 1591239600 + + dt = datetime.fromtimestamp(nows) + # print(dt.minute, dt.second) + return dt.minute + # if dt.minute == 0 and dt.second == 0: + # print('s ') + # elif dt.minute == 50 and dt.second == 0: + # print('s ') +#判断时间区间,制定提交时间 +def get_submit_time(m): + if m>=0 and m<=10: + return 20 + elif m>=11 and m<=20: + return 30 + elif m>=21 and m<=30: + return 40 + elif m>=31 and m<=40: + return 50 + elif m>=41 and m<=50: + return 59 + elif m>=51 and m<=59: + return 10 + else: + return m+10 +#判断时间区间,制定提交时间 +#判断时间区间,制定提交时间 +def get_submit_time1(m): + if m >= 0 and m <= 30: + return 40 + elif m >30 and m <= 59: + return 10 + else: + return m + 20 + + +if __name__ == '__main__': + # End_Chrome_Progress() + # get_localhost_ip() + # readFileContent(r'..\add\main_Everydaylog.txt') + print(IsFileContentRight(r'..\add\main_Everydaylog.txt')) \ No newline at end of file diff --git a/testcase/test_scene1/__init__.py b/testcase/test_scene1/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/testcase/test_scene1/scene1_mainflow.py b/testcase/test_scene1/scene1_mainflow.py new file mode 100644 index 0000000..d17c5da --- /dev/null +++ b/testcase/test_scene1/scene1_mainflow.py @@ -0,0 +1,101 @@ +import datetime +import threading +import time +import traceback + +from airtest.core.api import * +from selenium import webdriver +from selenium.webdriver import DesiredCapabilities +from selenium.webdriver.common.keys import Keys +from airtest_selenium.proxy import * +from selenium.webdriver import Chrome, ChromeOptions +from airtest.core.api import * +from airtest_selenium.proxy import * + +from public.mail1 import send_email1 +from public.tools import * + +opt = ChromeOptions() # 创建 Chrome 参数对象 +opt.headless = False # 把 Chrome 设置成无界面模式,windows/Linux 皆可 +opt.add_argument('--start-maximized') +opt.add_argument('--window-size=1280x1024') +chrome = webdriver.Chrome(chrome_options=opt) + +SIT_URL = 'http://scdev.cmic.com.cn:8088/beta/'#SIT环境地址 +#通行证 +usr1,pwd1 = 'bj_01','Gyxc1234' +usr2,pwd2 = 'bj_02','Gyxc1234' +usr3,pwd3 = 'bj_03','Gyxc1234' +usr4,pwd4 = 'bj_04','Gyxc1234' +usr5,pwd5 = 'bj_05','Gyxc1234' +warehousename = '北京强生非WMS仓'#仓库名称 + + +class LoginSys(): + def loginsys(self,url,usr,pwd): + chrome.get(url) + sleep(2) + chrome.find_element_by_id('input1').clear() + chrome.find_element_by_id('input1').send_keys(usr) + chrome.find_element_by_id('input2').clear() + chrome.find_element_by_id('input2').send_keys(pwd) + chrome.find_element_by_id('input2').send_keys(Keys.ENTER) + while True: + try: + if(chrome.find_element_by_xpath('//span[text()="退出"]').is_displayed()==True): + break + except: + continue + +class PurchaseOrder(): + def data_add(self): + order_link = chrome.find_element_by_xpath('//span[text()="普通采购订单"]') + chrome.execute_script("arguments[0].click();", order_link) + chrome.switch_to.frame(chrome.find_element_by_xpath('(//iframe[@class="metro-main-frame"])[2]')) + sleep(2) + chrome.find_element_by_xpath('//span[text()="新建"]').click() + sleep(4) + chrome.switch_to.frame(chrome.find_element_by_xpath('//iframe[contains(@name,"awsui-dialog-iframe")]')) + sleep(2) + + # 获取订单号 + orderno = chrome.find_element_by_xpath('//div[text() = "订单号 "]/following-sibling::div/span').text + print(orderno) + + #填写仓库信息 + chrome.find_element_by_xpath('//div[text()="仓库名称 "]/following-sibling::div/div/div/div/div/div/div/div/span/span/i').click() + sleep(1) + chrome.find_element_by_xpath('//input[@placeholder="模糊检索:仓库名称,仓库编码"]').send_keys(warehousename) + chrome.find_element_by_xpath('//input[@placeholder="模糊检索:仓库名称,仓库编码"]').send_keys(Keys.ENTER) + sleep(1) + btn_div= chrome.find_element_by_xpath('//span/input[@type="radio" and @value="022bc5d182335c5146b3817a500c2cbc7"]') + chrome.execute_script("arguments[0].click();", btn_div) + sleep(1) + chrome.find_element_by_xpath('(//button[@class="el-button el-button--primary el-button--default"])[2]').click() + sleep(1) + + #填写合同信息 + chrome.find_element_by_xpath('//div[text()="合同信息"]').click() + chrome.find_element_by_xpath( + '//div[text()="合同号 "]/following-sibling::div/div/div/div/div/div/div/div/span/span/i').click() + chrome.find_element_by_xpath( + '//input[@placeholder="模糊检索:合同号,合同协议号,对方编码,项目名称,项目编码,业态编码,参考部门,参考部门编码,参考业务员,参考业务员编码,产品线名称,产品线编码,合同类型,合同属性"]').send_keys( + '38443') + chrome.find_element_by_xpath( + '//input[@placeholder="模糊检索:合同号,合同协议号,对方编码,项目名称,项目编码,业态编码,参考部门,参考部门编码,参考业务员,参考业务员编码,产品线名称,产品线编码,合同类型,合同属性"]').send_keys( + Keys.ENTER) + chrome.find_element_by_xpath( + '//div[@class="multiple-header string_col" and text()="38443"]/ancestor-or-self::td/preceding-sibling::td/div/label/span/span').click() + chrome.find_element_by_xpath('(//button[@class="el-button el-button--primary el-button--default"])[3]').click() + sleep(2) + + + + + + +if __name__ == '__main__': + step1 = LoginSys() + step2 = PurchaseOrder() + step1.loginsys(SIT_URL,usr2,pwd2) + step2.data_add() \ No newline at end of file -- GitLab