diff --git a/public/__init__.py b/public/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/public/action.py b/public/action.py
new file mode 100644
index 0000000000000000000000000000000000000000..faf8f74727716ade6a0722cba9a2af2e2c4b72c1
--- /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 0000000000000000000000000000000000000000..8610854c4850bc1866b947ca745a3b4a80760e0d
--- /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 0000000000000000000000000000000000000000..4e28a748137bd346feb4b1cc6d27b423513e47b6
--- /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 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/testcase/test_scene1/scene1_mainflow.py b/testcase/test_scene1/scene1_mainflow.py
new file mode 100644
index 0000000000000000000000000000000000000000..d17c5dad7b4b8ad869c3b4c30eeb71a6eaeb106c
--- /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