From e3f3d11a1896fdca66668791a4a75f9040ac1afe 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/od/test1.py | 326 ++++++++++++++
...00\345\224\256\350\256\242\345\215\225.py" | 173 +++++++
.../main.py" | 51 +++
...345\244\232\346\230\216\347\273\206100.py" | 403 +++++++++++++++++
...345\244\232\346\230\216\347\273\206100.py" | 395 ++++++++++++++++
...244\232\346\230\216\347\273\206100_old.py" | 304 +++++++++++++
...345\244\232\346\230\216\347\273\206100.py" | 375 ++++++++++++++++
...345\244\232\346\230\216\347\273\206100.py" | 334 ++++++++++++++
...345\244\232\346\230\216\347\273\206100.py" | 391 ++++++++++++++++
...345\244\232\346\230\216\347\273\206100.py" | 310 +++++++++++++
...5_\345\244\232\346\230\216\347\273\206.py" | 271 +++++++++++
...345\244\232\346\230\216\347\273\206100.py" | 422 ++++++++++++++++++
...345\244\232\346\230\216\347\273\206300.py" | 387 ++++++++++++++++
...um\344\270\215\346\224\257\346\214\201.py" | 328 ++++++++++++++
...\345\244\232\346\230\216\347\273\20650.py" | 389 ++++++++++++++++
...\345\215\225\346\230\216\347\273\2068.xls" | Bin 0 -> 278016 bytes
...56\345\200\237\345\207\272\345\215\225.py" | 306 +++++++++++++
...56\347\224\263\350\257\267\345\215\225.py" | 352 +++++++++++++++
...71\347\225\214\346\265\213\350\257\225.py" | 47 ++
...0\345\207\272\345\272\223\345\215\2251.py" | 276 ++++++++++++
...0\345\224\256\350\256\242\345\215\2251.py" | 268 +++++++++++
...57\345\200\237\345\207\272\345\215\225.py" | 316 +++++++++++++
...57\345\200\237\345\207\272\345\215\225.py" | 316 +++++++++++++
...57\350\257\267\351\242\206\345\215\225.py" | 348 +++++++++++++++
...01\350\264\247\351\205\215\350\264\247.py" | 359 +++++++++++++++
...50\345\207\272\345\272\223\345\215\225.py" | 286 ++++++++++++
...00\345\224\256\350\256\242\345\215\225.py" | 281 ++++++++++++
testcase/test_scene1/__init__.py | 0
testcase/test_scene1/scene1_mainflow.py | 101 +++++
33 files changed, 8481 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/od/test1.py
create mode 100644 "testcase/od/uat_\351\224\200\345\224\256\350\256\242\345\215\225.py"
create mode 100644 "testcase/od/\345\244\232\346\230\216\347\273\206/main.py"
create mode 100644 "testcase/od/\345\244\232\346\230\216\347\273\206/\345\257\204\345\224\256\345\200\237\345\207\272\345\215\225\345\244\232\346\230\216\347\273\206100.py"
create mode 100644 "testcase/od/\345\244\232\346\230\216\347\273\206/\345\257\204\345\224\256\347\224\263\350\257\267_\351\205\215\350\264\247_\345\244\232\346\230\216\347\273\206100.py"
create mode 100644 "testcase/od/\345\244\232\346\230\216\347\273\206/\345\257\204\345\224\256\351\205\215\350\264\247\345\215\225\345\244\232\346\230\216\347\273\206100_old.py"
create mode 100644 "testcase/od/\345\244\232\346\230\216\347\273\206/\346\211\213\346\234\257\345\200\237\345\207\272\345\215\225\345\244\232\346\230\216\347\273\206100.py"
create mode 100644 "testcase/od/\345\244\232\346\230\216\347\273\206/\346\211\213\346\234\257\350\257\267\351\242\206\345\215\225\345\244\232\346\230\216\347\273\206100.py"
create mode 100644 "testcase/od/\345\244\232\346\230\216\347\273\206/\347\273\217\351\224\200\345\224\256\350\246\201\350\264\247\351\205\215\350\264\247\345\244\232\346\230\216\347\273\206100.py"
create mode 100644 "testcase/od/\345\244\232\346\230\216\347\273\206/\350\260\203\346\213\250\345\207\272\345\272\223\345\215\225\345\244\232\346\230\216\347\273\206100.py"
create mode 100644 "testcase/od/\345\244\232\346\230\216\347\273\206/\351\224\200\345\224\256\350\256\242\345\215\225_\345\244\232\346\230\216\347\273\206.py"
create mode 100644 "testcase/od/\345\244\232\346\230\216\347\273\206/\351\224\200\345\224\256\350\256\242\345\215\225_\345\244\232\346\230\216\347\273\206100.py"
create mode 100644 "testcase/od/\345\244\232\346\230\216\347\273\206/\351\224\200\345\224\256\350\256\242\345\215\225_\345\244\232\346\230\216\347\273\206300.py"
create mode 100644 "testcase/od/\345\244\232\346\230\216\347\273\206/\351\224\200\345\224\256\350\256\242\345\215\225_\345\244\232\346\230\216\347\273\206300_\345\257\274\345\205\245_selenium\344\270\215\346\224\257\346\214\201.py"
create mode 100644 "testcase/od/\345\244\232\346\230\216\347\273\206/\351\224\200\345\224\256\350\256\242\345\215\225_\345\244\232\346\230\216\347\273\20650.py"
create mode 100644 "testcase/od/\345\244\232\346\230\216\347\273\206/\351\224\200\345\224\256\350\256\242\345\215\225\346\230\216\347\273\2068.xls"
create mode 100644 "testcase/od/\345\257\204\345\224\256\345\200\237\345\207\272\345\215\225.py"
create mode 100644 "testcase/od/\345\257\204\345\224\256\347\224\263\350\257\267\345\215\225.py"
create mode 100644 "testcase/od/\345\272\223\345\255\230\351\242\204\345\215\240\350\276\271\347\225\214\346\265\213\350\257\225/\345\272\223\345\255\230\351\242\204\345\215\240\350\276\271\347\225\214\346\265\213\350\257\225.py"
create mode 100644 "testcase/od/\345\272\223\345\255\230\351\242\204\345\215\240\350\276\271\347\225\214\346\265\213\350\257\225/\350\260\203\346\213\250\345\207\272\345\272\223\345\215\2251.py"
create mode 100644 "testcase/od/\345\272\223\345\255\230\351\242\204\345\215\240\350\276\271\347\225\214\346\265\213\350\257\225/\351\224\200\345\224\256\350\256\242\345\215\2251.py"
create mode 100644 "testcase/od/\346\211\213\346\234\257\345\200\237\345\207\272\345\215\225.py"
create mode 100644 "testcase/od/\346\211\213\346\234\257\345\200\237\345\207\272\345\215\225\345\271\266\345\217\221/\346\211\213\346\234\257\345\200\237\345\207\272\345\215\225.py"
create mode 100644 "testcase/od/\346\211\213\346\234\257\350\257\267\351\242\206\345\215\225.py"
create mode 100644 "testcase/od/\347\273\217\351\224\200\345\224\256\350\246\201\350\264\247\351\205\215\350\264\247.py"
create mode 100644 "testcase/od/\350\260\203\346\213\250\345\207\272\345\272\223\345\215\225.py"
create mode 100644 "testcase/od/\351\224\200\345\224\256\350\256\242\345\215\225.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/od/test1.py b/testcase/od/test1.py
new file mode 100644
index 0000000..855004d
--- /dev/null
+++ b/testcase/od/test1.py
@@ -0,0 +1,326 @@
+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 mail1 import send_email1
+from public.tools import *
+
+
+
+
+# chrome = webdriver.Chrome(chrome_options=opt)
+
+def job():
+ print("这是一个需要执行的任务。。。。。")
+ create_salesorder()
+ print("当前线程的个数:", threading.active_count())
+ time.sleep(1)
+ print("当前线程的信息:", threading.current_thread())
+
+
+def create_salesorder(type=1):
+ try:
+ import time
+ pro_path = get_pro_path()
+ start = time.clock()
+ # caps = DesiredCapabilities().CHROME
+ # caps["pageLoadStrategy"] = "normal" # complete
+ # caps["pageLoadStrategy"] = "eager" # interactive
+ # caps["pageLoadStrategy"] = "none"
+ # chrome = webdriver.Chrome(desired_capabilities=caps)
+ opt = ChromeOptions() # 创建 Chrome 参数对象
+ # opt.headless = True # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ opt.headless = False # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ opt.add_argument('--start-maximized')
+ opt.add_argument('--window-size=1280x1024')
+ # chrome = Chrome(options=opt) # 创建无界面对象
+ # chrome = WebChrome(chrome_options=opt)
+ chrome = WebChrome(chrome_options=opt)
+ # chrome=webdriver.Chrome()
+ chrome.implicitly_wait(20)
+ chrome.get("http://10.17.65.200:8088/portal/")
+ # chrome.get("http://10.17.65.207:8088/uat/r/w")
+ sleep(2)
+ chrome.implicitly_wait(30)
+ chrome.maximize_window()
+ chrome.find_element_by_id('input1').clear()
+ chrome.find_element_by_id('input1').send_keys('admin')
+ chrome.find_element_by_id('input2').clear()
+ chrome.find_element_by_id('input2').send_keys('Gyxc1234')
+ 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
+ # 切换所属公司
+ chrome.find_element_by_class_name('changeCom').click()
+ sleep(1)
+ chrome.find_element_by_xpath('//span[text()="国药集团北京医疗器械有限公司"]/following-sibling::button').click()
+ sleep(1)
+ chrome.find_element_by_xpath('// button[text() = "确定"]').click()
+ sleep(1)
+ # chrome.find_element_by_xpath('//div[text()="销售管理"]').click()
+ # actions = ActionChains(chrome)
+ # actions.move_to_element(chrome.find_element_by_xpath('//div[text()="销售业务"]')).perform()
+ # chrome.find_element_by_xpath('//span[text()="销售订单"]').click()
+ 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(2)
+ # chrome.switch_to.frame(chrome.find_element_by_xpath('//iframe[contains(@name,"awsui-dialog-iframe")]'))
+ # #获取订单号
+ #
+ # orderno=chrome.find_element_by_xpath('//div[text() = "请领单号 "]/following-sibling::div/span').text
+ # print(orderno)
+ # # chrome.switch_to.default_content()
+ # sleep(2)
+ # # while True:
+ # # try:
+ # # if chrome.find_element_by_xpath('//div[text()="订单公司名称 "]').is_displayed():
+ # # print(chrome.find_element_by_xpath('//div[text()="订单公司名称 "]').text)
+ # # break
+ # # except:
+ # # continue
+ # # print(chrome.find_element_by_xpath('//div[text()="订单公司名称 "]').text)
+ # sleep(2)
+ # # 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('国药集团北京')
+ # # chrome.find_element_by_xpath('//input[@placeholder="模糊检索:公司名称,公司编码"]').send_keys(Keys.ENTER)
+ # # chrome.find_element_by_xpath('//button[@class="el-button el-button--primary el-button--mini"]').click()
+ # # chrome.find_element_by_xpath('(//span[@class="el-radio__inner"])[1]').click()
+ # # chrome.find_element_by_xpath('//span[@class="ensureBtn"]/button').click()
+ # # chrome.find_element_by_xpath('//button[@class="el-button el-button--primary el-button--mini"]').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('chenshuheng')
+ # chrome.find_element_by_xpath('//input[@placeholder="模糊检索:员工编码,员工名称,部门编码,部门名称"]').send_keys(
+ # Keys.ENTER)
+ # chrome.find_element_by_xpath(
+ # '(//div[text()="chenshuheng"])[3]/ancestor-or-self::td/preceding-sibling::td/div/label/span/span').click()
+ # chrome.find_element_by_xpath('(//span[@class="ensureBtn"]/button[1])[1]').click()
+ #
+ # #手术类型
+ # chrome.find_element_by_xpath('(//input[@placeholder="请选择" and @type="text"])').click()
+ # sleep(1)
+ # chrome.find_element_by_xpath('//li[text()="初次手术"]').click()
+ # sleep(1)
+ # #手术种类
+ # chrome.find_element_by_xpath('(//input[@placeholder="请选择" and @type="text"])[2]').click()
+ # sleep(1)
+ # chrome.find_element_by_xpath('//li[text()="髋关节"]').click()
+ # sleep(1)
+ # chrome.find_element_by_xpath('//label[text()="手术日期 "]/following-sibling::div/div').click()
+ # sleep(1)
+ # chrome.find_element_by_xpath('//div[ @class ="el-date-table-cell"] // span[text()="31"]').click()
+ #
+ # #客户信息页签
+ # 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('北京大学第三医院')
+ # chrome.find_element_by_xpath('//input[@placeholder="模糊检索:客户编码,客户名称"]').send_keys(Keys.ENTER)
+ # # chrome.find_element_by_xpath('//span/input[@type="radio" and @value="03105272b49986351ef7eb2930b5454de"]').click()
+ # btn_div= chrome.find_element_by_xpath('//span/input[@type="radio" and @value="02f94bb93be972567166f428524aa3b43"]')
+ # chrome.execute_script("arguments[0].click();", btn_div)
+ # chrome.find_element_by_xpath('(//button[@class="el-button el-button--primary el-button--default"])[3]').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('北京大学第三医院')
+ # chrome.find_element_by_xpath('//input[@placeholder="模糊检索:客户编码,客商名称"]').send_keys(Keys.ENTER)
+ # # chrome.find_element_by_xpath('//span/input[@type="radio" and @value="03105272b49986351ef7eb2930b5454de"]').click()
+ # btn_div = chrome.find_element_by_xpath(
+ # '//span/input[@type="radio" and @value="0c4d395678c596b20aa6c2a2fef3483d4"]')
+ # chrome.execute_script("arguments[0].click();", btn_div)
+ # chrome.find_element_by_xpath('(//button[@class="el-button el-button--primary el-button--default"])[4]').click()
+ #
+ # # 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"])[4]').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('杨春刚')
+ # # chrome.find_element_by_xpath('//input[@placeholder="模糊检索:业务员名称,业务员编码,业务部门名称,业务部门编码,部门类型编码"]').send_keys(Keys.ENTER)
+ # # chrome.find_element_by_xpath('(//div[text()="杨春刚"])[3]/ancestor-or-self::td/preceding-sibling::td/div/label/span/span').click()
+ # # chrome.find_element_by_xpath('(//span[@class="ensureBtn"]/button[1])[4]').click()
+ # # #其他信息页签
+ # # chrome.find_element_by_xpath('//div[text()="其他信息"]').click()
+ # # chrome.find_element_by_xpath('//div[@cid="AWSUI.SwitchButton"]//div/div/div/div/span[1]').click()
+ # # 子表信息录入
+ # chrome.find_element_by_xpath('//div[text()="主体信息"]').click()
+ # chrome.find_element_by_xpath('//span[text()="添加商品"]').click()
+ # chrome.find_element_by_xpath(
+ # '//input[@placeholder="模糊检索:商品编码,商品名称"]').send_keys(
+ # '10214724')
+ # chrome.find_element_by_xpath(
+ # '//input[@placeholder="模糊检索:商品编码,商品名称"]').send_keys(
+ # Keys.ENTER)
+ # sleep(1)
+ # chrome.find_element_by_xpath('(//span[@class="el-checkbox__inner"])[4]').click()
+ # chrome.find_element_by_xpath('(//div[@class="el-dialog__body"]/div[2]/span/button[1]/span)[4]').click()
+ # sleep(3)
+ # # 滚动条右拉
+ # # chrome.execute_script("document.getElementsByClassName('vxe-table--footer-wrapper body--wrapper')[0].scrollLeft = 2000");
+ #
+ # element=chrome.find_element_by_xpath('//td[@colid="col_75"]')
+ # element.click()
+ # sleep(2)
+ # # element.send_keys("1")
+ # # chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='1'")
+ # chrome.find_element_by_class_name('awsui-input-number-right').send_keys('1')
+ # sleep(2)
+ # chrome.find_element_by_xpath('//td[@colid="col_76"]').click()
+ # #滚动条右拉
+ # # document.getElementsByClassName('vxe-table--footer-wrapper body--wrapper')[0].scrollLeft = 5000
+ # # chrome.execute_script("document.getElementsByClassName('vxe-table--footer-wrapper body--wrapper')[0].scrollLeft = 2000");
+ # # element = chrome.find_element_by_xpath('//td[@colid="col_197"]')
+ # # element.click()
+ # # sleep(6)
+ # # chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='8'")
+ # # sleep(2)
+ # # element = chrome.find_element_by_xpath('//td[@colid="col_198"]')
+ # # element.click()
+ # # sleep(6)
+ # # chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='8'")
+ # # sleep(2)
+ # # lock = threading.Lock()
+ # # lock.acquire()
+ # #方案一============================开始
+ # # if user_count<=5:
+ # if type==1:
+ # import datetime
+ # now = datetime.datetime.now()
+ # one_minutes_later = now + datetime.timedelta(minutes=1)
+ # now = now.strftime('%Y-%m-%d %H:%M')
+ # one_minutes_later = one_minutes_later.strftime('%Y-%m-%d %H:%M')
+ # # print('bbbbbbbb'+one_minutes_later)
+ # while True:
+ # now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M')
+ # # print('变化的时间' + now)
+ # if now == one_minutes_later:
+ # print('时间到了')
+ # chrome.find_element_by_xpath('//span[text()="提交"]').click()
+ # break
+ # # 方案一============================结束
+ # #方案二===============开始
+ # if type==2:
+ # m=get_time_m() #当前时间的分钟
+ # m1=get_submit_time(m)#计划提交时间的分钟
+ # while True:
+ # m2=get_time_m() #循环获取当前的分
+ # # sleep(60)
+ # if (m2==m1):
+ # chrome.find_element_by_xpath('//span[text()="提交"]').click()
+ # break
+ # #方案二===============结束
+ # # lock.release()
+ # sleep(2)
+ # # chrome.find_element_by_xpath('//button[@class="el-button el-button--primary el-button--mini"]').click()
+ # # chrome.switch_to.default_content()
+ # # chrome.switch_to.frame(chrome.find_element_by_xpath('(//iframe[@class="metro-main-frame"])[2]'))
+ # # sleep(20)
+ # while True:
+ # try:
+ # if chrome.find_element_by_xpath('//span[text()="%s"]'%orderno).is_displayed()==True:
+ # print('//span[text()="%s"]'%orderno)
+ # break
+ # except:
+ # continue
+ #进入手术配货单
+ chrome.switch_to.default_content()
+ chrome.find_element_by_xpath('//span[@class="awsui-tabs-icon close"]').click()
+ sleep(1)
+ 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('//label[text()="请领单号"]/parent::div/div/div/div/input').send_keys('QLD23082800017B')
+ sleep(1)
+ chrome.find_element_by_xpath('//label[text()="请领单号"]/parent::div/div/div/div/input').send_keys(Keys.ENTER)
+ sleep(1)
+ sleep(1)
+ text1=chrome.find_element_by_xpath('(//span[text()="PHD23082800007B"])[2]').text
+ print(text1)
+ element = chrome.find_element_by_xpath('(//span[@class="vxe-checkbox--icon vxe-checkbox--unchecked-icon"])[2]')
+ chrome.execute_script("arguments[0].click();", element)
+ sleep(1)
+ chrome.find_element_by_xpath('//span[text()="批量提交"]').click()
+ sleep(1)
+ chrome.find_element_by_xpath('//button[@class="el-button el-button--primary el-button--mini"]/span[text()="确定"]').click()
+ print('手术请领单创建完成')
+ end = time.clock()
+ print(start, end)
+ print('CPU执行时间: ', end - start)
+ imgInfo = getErrorPhoto(chrome)
+ imgName = imgInfo[0]
+ image_path = imgInfo[1]
+ # info=orderno+'执行耗时'+str(end - start)
+ now = get_time()
+ # writeFile_append(pro_path + '/logs/catalina.out', info)
+ # send_email1(image_path, info)
+ except Exception as e:
+ print('出现异常')
+ # 将日志写入到文件中单独存储
+ pro_path = get_pro_path()
+ traceback.print_exc()
+ imgInfo = getErrorPhoto(chrome)
+ imgName = imgInfo[0]
+ image_path = imgInfo[1]
+ print(imgName, image_path)
+ print(repr(e))
+ info = repr(e)
+ now = get_time()
+ writeFile_append(pro_path + '/logs/logerror%s.txt' % now, info)
+ # send_email1(image_path, info)
+if __name__ == "__main__":
+ # 创建多线程时, 需要制定该线程执行的任务.name线程名字 target目标函数名
+ # t1 = threading.Thread(target=job,name="job1")
+ # t2 = threading.Thread(target=job,name="job2")
+ # t1.start()
+ # t2.start()
+ # opt = ChromeOptions() # 创建 Chrome 参数对象
+ # # opt.headless = True # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ # opt.headless = False # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ # opt.add_argument('--start-maximized')
+ # opt.add_argument('--window-size=1280x1024')
+ # # chrome = Chrome(options=opt) # 创建无界面对象
+ # chrome = WebChrome(chrome_options=opt) # airtest中的类
+
+ count=1
+ for i in range(count):
+ t = threading.Thread(target=job)
+ t.start()
+ t.join()
+
+def start1():
+ count = 5
+ for i in range(count):
+ t = threading.Thread(target=job)
+ t.start()
+ t.join()
+
+ # print(threading.active_count())
+ # print("程序执行结束.....")
+ # create_salesorder()
diff --git "a/testcase/od/uat_\351\224\200\345\224\256\350\256\242\345\215\225.py" "b/testcase/od/uat_\351\224\200\345\224\256\350\256\242\345\215\225.py"
new file mode 100644
index 0000000..147c65c
--- /dev/null
+++ "b/testcase/od/uat_\351\224\200\345\224\256\350\256\242\345\215\225.py"
@@ -0,0 +1,173 @@
+import threading
+import time
+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 *
+
+def job():
+ print("这是一个需要执行的任务。。。。。")
+ create_salesorder()
+ print("当前线程的个数:", threading.active_count())
+ time.sleep(1)
+ print("当前线程的信息:", threading.current_thread())
+
+
+def create_salesorder():
+ import time
+ start = time.clock()
+ # caps = DesiredCapabilities().CHROME
+ # caps["pageLoadStrategy"] = "normal" # complete
+ # caps["pageLoadStrategy"] = "eager" # interactive
+ # caps["pageLoadStrategy"] = "none"
+ # chrome = webdriver.Chrome(desired_capabilities=caps)
+ opt = ChromeOptions() # 创建 Chrome 参数对象
+ # opt.headless = True # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ opt.headless = False # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ opt.add_argument('--start-maximized')
+ opt.add_argument('--window-size=1280x1024')
+ # chrome = Chrome(options=opt) # 创建无界面对象
+ # chrome = WebChrome(chrome_options=opt)
+ chrome = WebChrome(chrome_options=opt)
+ # chrome=webdriver.Chrome()
+ chrome.implicitly_wait(20)
+ # chrome.get("http://10.17.65.200:8088/portal/")
+ chrome.get("http://10.17.65.207:8088/uat/r/w")
+ sleep(2)
+ chrome.implicitly_wait(30)
+ chrome.maximize_window()
+ chrome.find_element_by_id('input1').send_keys('admin')
+ chrome.find_element_by_id('input2').send_keys('Gyxc1234')
+ 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
+
+ chrome.find_element_by_xpath('//div[text()="销售管理"]').click()
+ actions = ActionChains(chrome)
+ actions.move_to_element(chrome.find_element_by_xpath('//div[text()="销售业务"]')).perform()
+ chrome.find_element_by_xpath('//span[text()="销售订单"]').click()
+ chrome.switch_to.frame(chrome.find_element_by_xpath('(//iframe[@class="metro-main-frame"])[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")]'))
+
+ # chrome.switch_to.default_content()
+ sleep(4)
+ # while True:
+ # try:
+ # if chrome.find_element_by_xpath('//div[text()="订单公司名称 "]').is_displayed():
+ # print(chrome.find_element_by_xpath('//div[text()="订单公司名称 "]').text)
+ # break
+ # except:
+ # continue
+ print(chrome.find_element_by_xpath('//div[text()="订单公司名称 "]').text)
+
+
+ sleep(2)
+ 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('国药集团北京')
+ chrome.find_element_by_xpath('//input[@placeholder="模糊检索:公司名称,公司编码"]').send_keys(Keys.ENTER)
+ chrome.find_element_by_xpath('(//span[@class="el-radio__inner"])[1]').click()
+
+ chrome.find_element_by_xpath('//span[@class="ensureBtn"]/button').click()
+ chrome.find_element_by_xpath('//button[@class="el-button el-button--primary el-button--mini"]').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="模糊检索:仓库编码,仓库名称,是否传WMS,所属公司名称"]').send_keys('北京强生非')
+ chrome.find_element_by_xpath('//input[@placeholder="模糊检索:仓库编码,仓库名称,是否传WMS,所属公司名称"]').send_keys(Keys.ENTER)
+ # chrome.find_element_by_xpath('//span/input[@type="radio" and @value="03105272b49986351ef7eb2930b5454de"]').click()
+ btn_div= chrome.find_element_by_xpath('//span/input[@type="radio" and @value="03105272b49986351ef7eb2930b5454de"]')
+ chrome.execute_script("arguments[0].click();", btn_div)
+ chrome.find_element_by_xpath('(//button[@class="el-button el-button--primary el-button--default"])[3]').click()
+ 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('40080')
+ chrome.find_element_by_xpath('//input[@placeholder="模糊检索:合同号,合同协议号,对方编码,项目名称,项目编码,业态编码,参考部门,参考部门编码,参考业务员,参考业务员编码,产品线名称,产品线编码,合同类型,合同属性"]').send_keys(Keys.ENTER)
+ chrome.find_element_by_xpath('//div[@class="multiple-header string_col" and text()="40080"]/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"])[4]').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('北京大学第三医院')
+ chrome.find_element_by_xpath('//input[@placeholder="模糊检索:客户编码,客户名称,收货地址号,收货地址信息,公司编码,货币码,税率/税区,客户分类,联系人,联系人电话"]').send_keys(Keys.ENTER)
+ chrome.find_element_by_xpath('(//div[text()="北京大学第三医院"])[3]/ancestor-or-self::td/preceding-sibling::td/div/label/span/span').click()
+ chrome.find_element_by_xpath('(//span[@class="ensureBtn"]/button[1])[4]').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('杨春刚')
+ chrome.find_element_by_xpath('//input[@placeholder="模糊检索:业务员名称,业务员编码,业务部门名称,业务部门编码,部门类型编码"]').send_keys(Keys.ENTER)
+ chrome.find_element_by_xpath(
+ '(//div[text()="杨春刚"])[3]/ancestor-or-self::td/preceding-sibling::td/div/label/span/span').click()
+ chrome.find_element_by_xpath('(//span[@class="ensureBtn"]/button)[13]').click()
+ #其他信息页签
+ chrome.find_element_by_xpath('//div[text()="其他信息"]').click()
+ chrome.find_element_by_xpath('//div[@cid="AWSUI.SwitchButton"]//div/div/div/div/span[1]').click()
+ # 子表信息录入
+ chrome.find_element_by_xpath('//div[text()="主体信息"]').click()
+ chrome.find_element_by_xpath('//span[text()="添加商品"]').click()
+ chrome.find_element_by_xpath(
+ '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,主计量单位,销售计量单位,厂家物料编码,存储条件说明,生产企业编码,供应商编码,行类型,商品性质,批发价,进口/国产/港澳台,件包数,产品备注,是否免备案,产品描述"]').send_keys(
+ '10006179')
+ chrome.find_element_by_xpath(
+ '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,主计量单位,销售计量单位,厂家物料编码,存储条件说明,生产企业编码,供应商编码,行类型,商品性质,批发价,进口/国产/港澳台,件包数,产品备注,是否免备案,产品描述"]').send_keys(
+ Keys.ENTER)
+ chrome.find_element_by_xpath('(//span[@class="el-checkbox__inner"])[4]').click()
+ chrome.find_element_by_xpath('(//div[@class="el-dialog__body"]/div[2]/span/button[1]/span)[6]').click()
+ sleep(10)
+ element=chrome.find_element_by_xpath('//td[@colid="col_177"]')
+ element.click()
+ sleep(6)
+ # element.send_keys("1")
+ chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='1'");
+ sleep(3)
+ #滚动条右拉
+ # document.getElementsByClassName('vxe-table--footer-wrapper body--wrapper')[0].scrollLeft = 5000
+ chrome.execute_script("document.getElementsByClassName('vxe-table--footer-wrapper body--wrapper')[0].scrollLeft = 2000");
+ element = chrome.find_element_by_xpath('//td[@colid="col_197"]')
+ element.click()
+ sleep(6)
+ chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='8'");
+ sleep(2)
+ element = chrome.find_element_by_xpath('//td[@colid="col_198"]')
+ element.click()
+ sleep(6)
+ chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='8'");
+ sleep(2)
+ chrome.find_element_by_xpath('//span[text()="提交"]').click()
+ sleep(2)
+ chrome.find_element_by_xpath('//button[@class="el-button el-button--primary el-button--mini awsui-button awsui-button--primary"]//span[text()="确定"]').click()
+ chrome.switch_to.default_content()
+ while True:
+ try:
+ if chrome.find_element_by_xpath('//span[text()="新建"]').is_displayed()==True:
+ break
+ except:
+ continue
+ print('销售订单创建完成')
+ end = time.clock()
+ print(start, end)
+ print('CPU执行时间: ', end - start)
+if __name__ == "__main__":
+ # 创建多线程时, 需要制定该线程执行的任务.name线程名字 target目标函数名
+ # t1 = threading.Thread(target=job,name="job1")
+ # t2 = threading.Thread(target=job,name="job2")
+ # t1.start()
+ # t2.start()
+ for i in range(1):
+ t = threading.Thread(target=job)
+ t.start()
+
+ # print(threading.active_count())
+ # print("程序执行结束.....")
+ # create_salesorder()
diff --git "a/testcase/od/\345\244\232\346\230\216\347\273\206/main.py" "b/testcase/od/\345\244\232\346\230\216\347\273\206/main.py"
new file mode 100644
index 0000000..5c8ee40
--- /dev/null
+++ "b/testcase/od/\345\244\232\346\230\216\347\273\206/main.py"
@@ -0,0 +1,51 @@
+import threading
+import time
+from airtest.core.api import *
+from selenium import webdriver
+from selenium.webdriver.common.keys import Keys
+from airtest_selenium.proxy import *
+def job3():
+ print("这是一个需要执行的任务。。。。。")
+ from testcase.od.多明细.销售订单_多明细100 import create_salesorder
+ create_salesorder(2)
+ print("当前线程的个数:", threading.active_count() )
+ time.sleep(1)
+ print("当前线程的信息:", threading.current_thread())
+def job1():
+ print("这是一个需要执行的任务。。。。。")
+ # from testcase.od.多明细.调拨出库单多明细100 import create_salesorder1
+ from testcase.od.多明细.手术请领单多明细100 import create_salesorder
+ create_salesorder(2)
+ print("当前线程的个数:", threading.active_count() )
+ time.sleep(1)
+ print("当前线程的信息:", threading.current_thread())
+if __name__ == "__main__":
+ # 创建多线程时, 需要制定该线程执行的任务.name线程名字 target目标函数名
+ # t1 = threading.Thread(target=create_salesorder,name="job1")
+ # t2 = threading.Thread(target=create_salesorder1,name="job2")
+ # t1.start()
+ # t2.start()
+ count = 25
+ # semaphore = threading.Semaphore(value=1)
+ # for i in range(count):
+ # if i<15:
+ # t = threading.Thread(target=job3)
+ # t.start()
+ # if i>=15:
+ # t = threading.Thread(target=job1)
+ # t.start()
+ # # t.join()
+ for i in range(count):
+ t = threading.Thread(target=job1)
+ t.start()
+ print(threading.active_count())
+ # sleep(30)
+ # sys.exit(0)
+
+
+ # print("程序执行结束.....")
+ # for i in range(10):
+ # from testcase.od.销售订单 import *
+ # start1()
+
+
diff --git "a/testcase/od/\345\244\232\346\230\216\347\273\206/\345\257\204\345\224\256\345\200\237\345\207\272\345\215\225\345\244\232\346\230\216\347\273\206100.py" "b/testcase/od/\345\244\232\346\230\216\347\273\206/\345\257\204\345\224\256\345\200\237\345\207\272\345\215\225\345\244\232\346\230\216\347\273\206100.py"
new file mode 100644
index 0000000..fdb3f88
--- /dev/null
+++ "b/testcase/od/\345\244\232\346\230\216\347\273\206/\345\257\204\345\224\256\345\200\237\345\207\272\345\215\225\345\244\232\346\230\216\347\273\206100.py"
@@ -0,0 +1,403 @@
+#!/usr/bin/env python
+# coding=utf-8
+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 mail1 import send_email1
+from public.tools import *
+
+
+
+
+# chrome = webdriver.Chrome(chrome_options=opt)
+
+def job():
+ print("这是一个需要执行的任务。。。。。")
+ create_salesorder()
+ print("当前线程的个数:", threading.active_count())
+ time.sleep(1)
+ print("当前线程的信息:", threading.current_thread())
+def add_goods(goodsname,chrome):
+ chrome.find_element_by_xpath(
+ '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,厂家物料编码,件包数"]').send_keys(
+ goodsname)
+ chrome.find_element_by_xpath(
+ '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,厂家物料编码,件包数"]').send_keys(
+ Keys.ENTER)
+ #获取页数
+ # pagecount=chrome.find_element_by_xpath('(// li[ @class ="number"])[16]').text
+ pagecount=10
+ for i in range(int(pagecount)):
+ sleep(1)
+ chrome.find_element_by_xpath(
+ '//th[@class="el-table_18_column_157 multiple-column el-table-column--selection is-leaf headerCellClassName el-table__cell"]/div/label/span/span').click()
+ #翻页
+ chrome.find_element_by_xpath('(//button[@class="btn-next is-last"])[6]').click()
+ sleep(2)
+
+
+def create_salesorder(type=1):
+ try:
+ import time
+ pro_path = get_pro_path()
+ start = time.clock()
+ # caps = DesiredCapabilities().CHROME
+ # caps["pageLoadStrategy"] = "normal" # complete
+ # caps["pageLoadStrategy"] = "eager" # interactive
+ # caps["pageLoadStrategy"] = "none"
+ # chrome = webdriver.Chrome(desired_capabilities=caps)
+ opt = ChromeOptions() # 创建 Chrome 参数对象
+ opt.headless = True # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ # opt.headless = False # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ opt.add_argument('--start-maximized')
+ opt.add_argument('--window-size=1280x1024')
+ # chrome = Chrome(options=opt) # 创建无界面对象
+ # chrome = WebChrome(chrome_options=opt)
+ chrome = WebChrome(chrome_options=opt)
+ # chrome=webdriver.Chrome()
+ chrome.implicitly_wait(20)
+ chrome.get("http://10.17.65.200:8088/portal/")
+ # chrome.get("http://10.17.65.207:8088/uat/r/w")
+ sleep(2)
+ chrome.implicitly_wait(30)
+ chrome.maximize_window()
+ chrome.find_element_by_id('input1').clear()
+ chrome.find_element_by_id('input1').send_keys('admin')
+ chrome.find_element_by_id('input2').clear()
+ chrome.find_element_by_id('input2').send_keys('Gyxc1234')
+ 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
+ # 切换所属公司
+ chrome.find_element_by_class_name('changeCom').click()
+ sleep(1)
+ chrome.find_element_by_xpath('//span[text()="国药集团北京医疗器械有限公司"]/following-sibling::button').click()
+ sleep(1)
+ chrome.find_element_by_xpath('// button[text() = "确定"]').click()
+ sleep(1)
+ # chrome.find_element_by_xpath('//div[text()="销售管理"]').click()
+ # actions = ActionChains(chrome)
+ # actions.move_to_element(chrome.find_element_by_xpath('//div[text()="销售业务"]')).perform()
+ # chrome.find_element_by_xpath('//span[text()="销售订单"]').click()
+ 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(4)
+ 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")]'))
+ #获取订单号
+
+ orderno=chrome.find_element_by_xpath('//div[text() = "订单号 "]/following-sibling::div/span').text
+ print(orderno)
+ # chrome.switch_to.default_content()
+ sleep(4)
+ # while True:
+ # try:
+ # if chrome.find_element_by_xpath('//div[text()="订单公司名称 "]').is_displayed():
+ # print(chrome.find_element_by_xpath('//div[text()="订单公司名称 "]').text)
+ # break
+ # except:
+ # continue
+ # print(chrome.find_element_by_xpath('//div[text()="订单公司名称 "]').text)
+
+
+ # sleep(2)
+ # 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('国药集团北京')
+ # chrome.find_element_by_xpath('//input[@placeholder="模糊检索:公司名称,公司编码"]').send_keys(Keys.ENTER)
+ # chrome.find_element_by_xpath('(//span[@class="el-radio__inner"])[2]').click()
+ # chrome.find_element_by_xpath('//span[@class="ensureBtn"]/button').click()
+ # chrome.find_element_by_xpath('//button[@class="el-button el-button--primary el-button--mini"]').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('杨春刚')
+ chrome.find_element_by_xpath('//input[@placeholder="模糊检索:员工编码,员工名称"]').send_keys(
+ Keys.ENTER)
+ chrome.find_element_by_xpath(
+ '(//div[text()="杨春刚"])[3]/ancestor-or-self::td/preceding-sibling::td/div/label/span/span').click()
+ chrome.find_element_by_xpath('(//span[@class="ensureBtn"]/button[1])[1]').click()
+
+ #客户信息页签
+ 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('1451')
+ chrome.find_element_by_xpath('//input[@placeholder="模糊检索:客户编码,客户名称,收货地址号,收货地址信息,地址名称"]').send_keys(Keys.ENTER)
+ # chrome.find_element_by_xpath('//span/input[@type="radio" and @value="03105272b49986351ef7eb2930b5454de"]').click()
+ btn_div= chrome.find_element_by_xpath('//span/input[@type="radio" and @value="0b570c63f68dfcc5a40d6a06f6aef07e4"]')
+ chrome.execute_script("arguments[0].click();", btn_div)
+ chrome.find_element_by_xpath('(//button[@class="el-button el-button--primary el-button--default"])[3]').click()
+ #仓库信息页签
+ 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('103356')
+ chrome.find_element_by_xpath('//input[@placeholder="模糊检索:仓库编码,仓库名称"]').send_keys(Keys.ENTER)
+ chrome.find_element_by_xpath('//div[@class="multiple-header string_col" and text()="103356"]/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"])[4]').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="模糊检索:仓库编码,仓库名称"])[2]').send_keys('103503')
+ chrome.find_element_by_xpath('(//input[@placeholder="模糊检索:仓库编码,仓库名称"])[2]').send_keys(Keys.ENTER)
+ chrome.find_element_by_xpath(
+ '//div[@class="multiple-header string_col" and text()="103503"]/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"])[5]').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('杨春刚')
+ # chrome.find_element_by_xpath('//input[@placeholder="模糊检索:业务员名称,业务员编码,业务部门名称,业务部门编码,部门类型编码"]').send_keys(Keys.ENTER)
+ # chrome.find_element_by_xpath('(//div[text()="杨春刚"])[3]/ancestor-or-self::td/preceding-sibling::td/div/label/span/span').click()
+ # chrome.find_element_by_xpath('(//span[@class="ensureBtn"]/button[1])[4]').click()
+ # #其他信息页签
+ # chrome.find_element_by_xpath('//div[text()="其他信息"]').click()
+ # chrome.find_element_by_xpath('//div[@cid="AWSUI.SwitchButton"]//div/div/div/div/span[1]').click()
+ # 子表信息录入
+ chrome.find_element_by_xpath('//div[text()="主体信息"]').click()
+ # chrome.find_element_by_xpath('//span[text()="添加商品"]').click()
+ # 点击添加商品弹出添加商品子窗口
+ for i in range(1):
+ chrome.find_element_by_xpath('//span[text()="添加商品"]').click()
+ add_goods('PTCA', chrome)
+ chrome.find_element_by_xpath('(//div[@class="el-dialog__body"]/div[2]/span/button[1]/span)[5]').click()
+ sleep(10)
+ while True:
+ try:
+ chrome.find_element_by_xpath('//div[@class="el-loading-spinner"]').is_displayed()
+ continue
+ except:
+ break
+ # 滚动条右拉
+ chrome.execute_script(
+ "document.getElementsByClassName('vxe-table--footer-wrapper body--wrapper')[0].scrollLeft = 1200");
+ # element = chrome.find_element_by_xpath('//td[@colid="col_159"]')
+ # element.click()
+ # sleep(3)
+ # element.send_keys("1")
+ # chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='1'")
+ # chrome.find_element_by_xpath(
+ # '//div[@class="el-input el-input--fullScreenSize el-input--prefix el-input--suffix dataDialog awsui-input dataDialog"]/div/input').send_keys(
+ # '23072800OP0237')
+ # sleep(1)
+ # chrome.find_element_by_xpath('//td[@colid="col_160"]').click()
+ sleep(1)
+ # for i in range(1,101):
+ # element = chrome.find_element_by_xpath('(//td[@colid="col_159"])[%s]'%i)
+ # element.click()
+ # sleep(2)
+ # chrome.find_element_by_xpath(
+ # '(//div[@class="el-input el-input--fullScreenSize el-input--prefix el-input--suffix dataDialog awsui-input dataDialog"]/div/span/span)[2]').click()
+ # # chrome.find_element_by_xpath('//div[@class="el-input el-input--fullScreenSize el-input--prefix el-input--suffix dataDialog awsui-input dataDialog"]/div/input').send_keys('23072800OP0237')
+ # chrome.find_element_by_xpath('(//div[text()="合格品"])[3]').click()
+ # sleep(1)
+ # chrome.find_element_by_xpath(
+ # '(//button[@class="el-button el-button--primary el-button--default"])[8]').click()
+ # sleep(1)
+ # chrome.find_element_by_xpath('//td[@colid="col_160"]').click()
+ # sleep(1)
+
+ for i in range(1, 101):
+ element = chrome.find_element_by_xpath('(//td[@colid="col_165"])[%s]' % i)
+ # if i==88:
+ # print('这里出问题了')
+ # chrome.execute_script(
+ # "document.getElementsByClassName('vxe-table--body-wrapper body--wrapper')[0].scrollTop = %s*10;" % i)
+ # try:
+ element.click()
+ # except:
+ # element=chrome.find_element_by_class_name('vxe-table--footer-wrapper body--wrapper')
+ # chrome.execute_script("arguments[0].click();", element)
+ sleep(2)
+ # element.send_keys("1")
+ # chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='1'")
+ chrome.find_element_by_class_name('awsui-input-number-right').send_keys('1')
+ sleep(2)
+ chrome.find_element_by_xpath('(//td[@colid="col_166"])[%s]' % i)
+ chrome.execute_script(
+ "document.getElementsByClassName('vxe-table--body-wrapper body--wrapper')[0].scrollTop = %s*50;" % i)
+ if i==100:
+ chrome.find_element_by_xpath('(//td[@class="vxe-body--column col_166 col--left col--ellipsis"])[100]').click()
+ sleep(2)
+ # chrome.execute_script(
+ # "document.getElementsByClassName('vxe-table--body-wrapper body--wrapper')[0].scrollTop = 0;")
+ # chrome.execute_script("document.getElementsByClassName('vxe-table--footer-wrapper body--wrapper')[0].scrollLeft = 0");
+
+ chrome.execute_script("document.getElementsByClassName('body')[0].scrollTop=100")
+ # 点击自动配货按钮
+ chrome.find_element_by_xpath('//button[text()="自动配货"]').click()
+ sleep(2)
+ chrome.find_element_by_xpath('//span[text()="分配批次"]').click()
+ sleep(30)
+ # chrome.find_element_by_xpath(
+ # '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,厂家物料编码,件包数"]').send_keys(
+ # '10006179')
+ # chrome.find_element_by_xpath(
+ # '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,厂家物料编码,件包数"]').send_keys(
+ # Keys.ENTER)
+ # chrome.find_element_by_xpath('(//span[@class="el-checkbox__inner"])[4]').click()
+ # chrome.find_element_by_xpath('(//div[@class="el-dialog__body"]/div[2]/span/button[1]/span)[5]').click()
+ # sleep(3)
+ # 滚动条右拉
+ # chrome.execute_script("document.getElementsByClassName('vxe-table--footer-wrapper body--wrapper')[0].scrollLeft = 1000");
+ # element = chrome.find_element_by_xpath('//td[@colid="col_159"]')
+ # element.click()
+ # sleep(3)
+ # element.send_keys("1")
+ # chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='1'")
+ # chrome.find_element_by_xpath('//div[@class="el-input el-input--fullScreenSize el-input--prefix el-input--suffix dataDialog awsui-input dataDialog"]/div/input').send_keys('23072800OP0237')
+ # sleep(1)
+ # chrome.find_element_by_xpath('//td[@colid="col_160"]').click()
+ # sleep(1)
+ # chrome.execute_script("document.getElementsByClassName('vxe-table--footer-wrapper body--wrapper')[0].scrollLeft = 1500");
+ # sleep(1)
+ # element=chrome.find_element_by_xpath('//td[@colid="col_165"]')
+ # element.click()
+ # sleep(3)
+ # element.send_keys("1")
+ # chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='1'")
+ # chrome.find_element_by_class_name('awsui-input-number-right').send_keys('1')
+ # sleep(1)
+ # chrome.find_element_by_xpath('//td[@colid="col_166"]').click()
+ # sleep(1)
+ #滚动条右拉
+ # document.getElementsByClassName('vxe-table--footer-wrapper body--wrapper')[0].scrollLeft = 5000
+ # chrome.execute_script("document.getElementsByClassName('vxe-table--footer-wrapper body--wrapper')[0].scrollLeft = 2000");
+ # element = chrome.find_element_by_xpath('//td[@colid="col_197"]')
+ # element.click()
+ # sleep(6)
+ # chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='8'")
+ # sleep(2)
+ # element = chrome.find_element_by_xpath('//td[@colid="col_198"]')
+ # element.click()
+ # sleep(6)
+ # chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='8'")
+ # sleep(2)
+ # lock = threading.Lock()
+ # lock.acquire()
+ #方案一============================开始
+ if type==1:
+ import datetime
+ now = datetime.datetime.now()
+ one_minutes_later = now + datetime.timedelta(minutes=1)
+ now = now.strftime('%Y-%m-%d %H:%M')
+ one_minutes_later = one_minutes_later.strftime('%Y-%m-%d %H:%M')
+ # print('bbbbbbbb'+one_minutes_later)
+ while True:
+ now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M')
+ # print('变化的时间' + now)
+ if now == one_minutes_later:
+ print('时间到了')
+ start = time.clock()
+ chrome.find_element_by_xpath('//span[text()="提交"]').click()
+ sleep(2)
+ chrome.find_element_by_xpath('//button[@class="el-button el-button--primary el-button--mini"]').click()
+ break
+ # 方案一============================结束
+ #方案二===============开始
+ if type==2:
+ m=get_time_m() #当前时间的分钟
+ m1=get_submit_time(m)#计划提交时间的分钟
+ while True:
+ m2=get_time_m() #循环获取当前的分
+ sleep(10)
+ if (m2==m1):
+ start = time.clock()
+ chrome.find_element_by_xpath('//span[text()="提交"]').click()
+ sleep(2)
+ chrome.find_element_by_xpath('//button[@class="el-button el-button--primary el-button--mini"]').click()
+ break
+ #方案二===============结束
+ # lock.release()
+ while True:
+ try:
+ if chrome.find_element_by_xpath('//p[text()="共享任务创建成功"]').is_displayed() == True:
+ # print('订单完成了')
+ break
+ except:
+ continue
+ sleep(2)
+ # chrome.find_element_by_xpath('//button[@class="el-button el-button--primary el-button--mini"]').click()
+ chrome.switch_to.default_content()
+ chrome.switch_to.frame(chrome.find_element_by_xpath('(//iframe[@class="metro-main-frame"])[2]'))
+ # sleep(20)
+ while True:
+ try:
+ if chrome.find_element_by_xpath('//span[text()="%s"]'%orderno).is_displayed()==True:
+ print('//span[text()="%s"]'%orderno)
+ break
+ except:
+ continue
+ print('寄售借出单创建完成')
+ end = time.clock()
+ print(start, end)
+ print('CPU执行时间: ', end - start)
+ imgInfo = getErrorPhoto(chrome)
+ imgName = imgInfo[0]
+ image_path = imgInfo[1]
+ info=orderno+'执行耗时'+str(end - start)
+ now = get_time()
+ writeFile_append(pro_path + '/logs/catalina.out', info)
+ send_email1(image_path, info)
+ except Exception as e:
+ print('出现异常')
+ # 将日志写入到文件中单独存储
+ pro_path = get_pro_path()
+ traceback.print_exc()
+ imgInfo = getErrorPhoto(chrome)
+ imgName = imgInfo[0]
+ image_path = imgInfo[1]
+ print(imgName, image_path)
+ print(repr(e))
+ info = repr(e)
+ now = get_time()
+ writeFile_append(pro_path + '/logs/logerror%s.txt' % now, info)
+ # send_email1(image_path, info)
+if __name__ == "__main__":
+ # 创建多线程时, 需要制定该线程执行的任务.name线程名字 target目标函数名
+ # t1 = threading.Thread(target=job,name="job1")
+ # t2 = threading.Thread(target=job,name="job2")
+ # t1.start()
+ # t2.start()
+ # opt = ChromeOptions() # 创建 Chrome 参数对象
+ # # opt.headless = True # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ # opt.headless = False # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ # opt.add_argument('--start-maximized')
+ # opt.add_argument('--window-size=1280x1024')
+ # # chrome = Chrome(options=opt) # 创建无界面对象
+ # chrome = WebChrome(chrome_options=opt) # airtest中的类
+
+ count=1
+ for i in range(count):
+ t = threading.Thread(target=job)
+ t.start()
+ # t.join()
+
+def start1():
+ count = 5
+ for i in range(count):
+ t = threading.Thread(target=job)
+ t.start()
+ t.join()
+
+ # print(threading.active_count())
+ # print("程序执行结束.....")
+ # create_salesorder()
diff --git "a/testcase/od/\345\244\232\346\230\216\347\273\206/\345\257\204\345\224\256\347\224\263\350\257\267_\351\205\215\350\264\247_\345\244\232\346\230\216\347\273\206100.py" "b/testcase/od/\345\244\232\346\230\216\347\273\206/\345\257\204\345\224\256\347\224\263\350\257\267_\351\205\215\350\264\247_\345\244\232\346\230\216\347\273\206100.py"
new file mode 100644
index 0000000..528feea
--- /dev/null
+++ "b/testcase/od/\345\244\232\346\230\216\347\273\206/\345\257\204\345\224\256\347\224\263\350\257\267_\351\205\215\350\264\247_\345\244\232\346\230\216\347\273\206100.py"
@@ -0,0 +1,395 @@
+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 selenium.webdriver.support.wait import WebDriverWait
+
+from mail1 import send_email1
+from public.tools import *
+
+
+
+
+# chrome = webdriver.Chrome(chrome_options=opt)
+
+def job():
+ print("这是一个需要执行的任务。。。。。")
+ create_salesorder()
+ print("当前线程的个数:", threading.active_count())
+ time.sleep(1)
+ print("当前线程的信息:", threading.current_thread())
+def add_goods(goodsname,chrome):
+ chrome.find_element_by_xpath(
+ '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号"]').send_keys(
+ goodsname)
+ sleep(2)
+ chrome.find_element_by_xpath(
+ '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号"]').send_keys(
+ Keys.ENTER)
+ sleep(2)
+ #获取页数
+ # pagecount=chrome.find_element_by_xpath('(// li[ @class ="number"])[16]').text
+ pagecount=10
+ for i in range(int(pagecount)):
+ # chrome.find_element_by_xpath('//span[text()="添加商品"]').click()
+ # chrome.find_element_by_xpath(
+ # '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,主计量单位,销售计量单位,厂家物料编码,存储条件说明,生产企业编码,供应商编码,行类型,商品性质,批发价,进口/国产/港澳台,件包数,产品备注,是否免备案,产品描述"]').send_keys(
+ # goodsname)
+ # chrome.find_element_by_xpath(
+ # '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,主计量单位,销售计量单位,厂家物料编码,存储条件说明,生产企业编码,供应商编码,行类型,商品性质,批发价,进口/国产/港澳台,件包数,产品备注,是否免备案,产品描述"]').send_keys(
+ # Keys.ENTER)
+ sleep(1)
+ chrome.find_element_by_xpath(
+ '//th[@class="el-table_12_column_139 multiple-column el-table-column--selection is-leaf headerCellClassName el-table__cell"]/div/label/span/span').click()
+ sleep(2)
+ #翻页
+ chrome.find_element_by_xpath('(//button[@class="btn-next is-last"])[4]').click()
+
+ #点击确定
+ # chrome.find_element_by_xpath('(//div[@class="el-dialog__body"]/div[2]/span/button[1]/span)[5]').click()
+ sleep(1)
+
+def create_salesorder(type=1):
+ try:
+ import time
+ pro_path = get_pro_path()
+ start = time.clock()
+ # caps = DesiredCapabilities().CHROME
+ # caps["pageLoadStrategy"] = "normal" # complete
+ # caps["pageLoadStrategy"] = "eager" # interactive
+ # caps["pageLoadStrategy"] = "none"
+ # chrome = webdriver.Chrome(desired_capabilities=caps)
+ opt = ChromeOptions() # 创建 Chrome 参数对象
+ # opt.headless = True # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ opt.headless = False # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ opt.add_argument('--start-maximized')
+ opt.add_argument('--window-size=1280x1024')
+ # chrome = Chrome(options=opt) # 创建无界面对象
+ # chrome = WebChrome(chrome_options=opt)
+ chrome = WebChrome(chrome_options=opt)
+ # chrome=webdriver.Chrome()
+ # chrome.implicitly_wait(20)
+ chrome.get("http://10.17.65.200:8088/portal/")
+ # chrome.get("http://10.17.65.207:8088/uat/r/w")
+ sleep(2)
+ chrome.implicitly_wait(30)
+ chrome.maximize_window()
+ chrome.find_element_by_id('input1').clear()
+ chrome.find_element_by_id('input1').send_keys('admin')
+ chrome.find_element_by_id('input2').clear()
+ chrome.find_element_by_id('input2').send_keys('Gyxc1234')
+ 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
+ # 切换所属公司
+ chrome.find_element_by_class_name('changeCom').click()
+ sleep(1)
+ chrome.find_element_by_xpath('//span[text()="国药集团北京医疗器械有限公司"]/following-sibling::button').click()
+ sleep(1)
+ chrome.find_element_by_xpath('// button[text() = "确定"]').click()
+ sleep(1)
+ # chrome.find_element_by_xpath('//div[text()="销售管理"]').click()
+ # actions = ActionChains(chrome)
+ # actions.move_to_element(chrome.find_element_by_xpath('//div[text()="销售业务"]')).perform()
+ # chrome.find_element_by_xpath('//span[text()="销售订单"]').click()
+ 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(2)
+ chrome.switch_to.frame(chrome.find_element_by_xpath('//iframe[contains(@name,"awsui-dialog-iframe")]'))
+ #获取订单号
+
+ orderno=chrome.find_element_by_xpath('//div[text() = "寄售申请单号 "]/following-sibling::div/span').text
+ print(orderno)
+ # chrome.switch_to.default_content()
+ sleep(2)
+ # while True:
+ # try:
+ # if chrome.find_element_by_xpath('//div[text()="订单公司名称 "]').is_displayed():
+ # print(chrome.find_element_by_xpath('//div[text()="订单公司名称 "]').text)
+ # break
+ # except:
+ # continue
+ # print(chrome.find_element_by_xpath('//div[text()="订单公司名称 "]').text)
+
+
+ # sleep(2)
+ # 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('国药集团北京')
+ # chrome.find_element_by_xpath('//input[@placeholder="模糊检索:公司名称,公司编码"]').send_keys(Keys.ENTER)
+ # chrome.find_element_by_xpath('(//span[@class="el-radio__inner"])[2]').click()
+ # chrome.find_element_by_xpath('//span[@class="ensureBtn"]/button').click()
+ # chrome.find_element_by_xpath('//button[@class="el-button el-button--primary el-button--mini"]').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('杨春刚')
+ chrome.find_element_by_xpath('//input[@placeholder="模糊检索:员工编码,员工名称"]').send_keys(
+ Keys.ENTER)
+ chrome.find_element_by_xpath(
+ '(//div[text()="杨春刚"])[3]/ancestor-or-self::td/preceding-sibling::td/div/label/span/span').click()
+ chrome.find_element_by_xpath('(//span[@class="ensureBtn"]/button[1])[1]').click()
+
+ #客户信息页签
+ 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('1451')
+ chrome.find_element_by_xpath('//input[@placeholder="模糊检索:客户编码,客户名称,收货地址号,收货地址信息,地址名称"]').send_keys(Keys.ENTER)
+ # chrome.find_element_by_xpath('//span/input[@type="radio" and @value="03105272b49986351ef7eb2930b5454de"]').click()
+ btn_div= chrome.find_element_by_xpath('//span/input[@type="radio" and @value="0b570c63f68dfcc5a40d6a06f6aef07e4"]')
+ chrome.execute_script("arguments[0].click();", btn_div)
+ chrome.find_element_by_xpath('(//button[@class="el-button el-button--primary el-button--default"])[3]').click()
+ sleep(2)
+ # #仓库信息页签
+ # 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('103356')
+ # chrome.find_element_by_xpath('//input[@placeholder="模糊检索:仓库编码,仓库名称"]').send_keys(Keys.ENTER)
+ # chrome.find_element_by_xpath('//div[@class="multiple-header string_col" and text()="103356"]/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"])[4]').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="模糊检索:仓库编码,仓库名称"])[2]').send_keys('103503')
+ # chrome.find_element_by_xpath('(//input[@placeholder="模糊检索:仓库编码,仓库名称"])[2]').send_keys(Keys.ENTER)
+ # chrome.find_element_by_xpath(
+ # '//div[@class="multiple-header string_col" and text()="103503"]/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"])[5]').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('杨春刚')
+ # chrome.find_element_by_xpath('//input[@placeholder="模糊检索:业务员名称,业务员编码,业务部门名称,业务部门编码,部门类型编码"]').send_keys(Keys.ENTER)
+ # chrome.find_element_by_xpath('(//div[text()="杨春刚"])[3]/ancestor-or-self::td/preceding-sibling::td/div/label/span/span').click()
+ # chrome.find_element_by_xpath('(//span[@class="ensureBtn"]/button[1])[4]').click()
+ # #其他信息页签
+ # chrome.find_element_by_xpath('//div[text()="其他信息"]').click()
+ # chrome.find_element_by_xpath('//div[@cid="AWSUI.SwitchButton"]//div/div/div/div/span[1]').click()
+ # 子表信息录入
+ chrome.find_element_by_xpath('//div[text()="主体信息"]').click()
+ for i in range(1):
+ chrome.find_element_by_xpath('//span[text()="添加商品"]').click()
+ add_goods('PTCA', chrome)
+ chrome.find_element_by_xpath(
+ '(//button[@class="el-button el-button--primary el-button--default"])[4]').click()
+ sleep(2)
+ while True:
+ try:
+ chrome.find_element_by_xpath('//div[@class="el-loading-spinner"]').is_displayed()
+ continue
+ except:
+ break
+ # chrome.find_element_by_xpath(
+ # '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号"]').send_keys(
+ # '10006179')
+ # chrome.find_element_by_xpath(
+ # '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号"]').send_keys(
+ # Keys.ENTER)
+ # chrome.find_element_by_xpath('(//span[@class="el-checkbox__inner"])[4]').click()
+ # chrome.find_element_by_xpath('(//div[@class="el-dialog__body"]/div[2]/span/button[1]/span)[3]').click()
+ # 滚动条右拉
+ chrome.execute_script("document.getElementsByClassName('vxe-table--footer-wrapper body--wrapper')[0].scrollLeft = 800");
+ sleep(3)
+ for i in range(1, 101):
+ element = chrome.find_element_by_xpath('(//td[@colid="col_113"])[%s]' % i)
+ sleep(2)
+ chrome.execute_script("arguments[0].click();", element)
+
+ # element=chrome.find_element_by_xpath('(//td[@colid="col_177"])[%s]'%i)
+ # element.click()
+ sleep(2)
+ # element.send_keys("1")
+ # chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='1'")
+ chrome.find_element_by_class_name('awsui-input-number-right').send_keys('1')
+ # chrome.find_element_by_xpath('//td[@colid="col_177"]/div/div').send_keys('1')
+ sleep(2)
+ # chrome.find_element_by_xpath('(//td[@colid="col_178"])[%s]'%i).click()
+ element = chrome.find_element_by_xpath('(//td[@colid="col_114"])[%s]' % i)
+ chrome.execute_script("arguments[0].click();", element)
+ sleep(2)
+
+ sleep(3)
+
+ chrome.find_element_by_xpath('//span[text()="提交"]').click()
+ sleep(3)
+ chrome.find_element_by_xpath('//button[@class="el-button el-button--primary el-button--mini"]').click()
+ sleep(2)
+ ele=chrome.find_element_by_xpath('//p[text()="流程结束"]')
+ wait=WebDriverWait(chrome, 3600)
+ wait.until(lambda x:ele.is_displayed())
+ # while True:
+ # try:
+ # if chrome.find_element_by_xpath('//p[text()="流程结束"]').is_displayed() == True:
+ # # print('流程结束')
+ # break
+ # # else:
+ # # print('共享任务创建成功的元素没有出现')
+ # except:
+ # continue
+ chrome.switch_to.default_content()
+ sleep(6)
+ chrome.find_element_by_xpath('//span[@class="awsui-tabs-icon close"]').click()
+ sleep(2)
+ order_link = chrome.find_element_by_xpath('//span[text()="寄售配货单"]')
+ sleep(2)
+ chrome.execute_script("arguments[0].click();", order_link)
+ sleep(2)
+ chrome.switch_to.frame(chrome.find_element_by_xpath('(//iframe[@class="metro-main-frame"])[2]'))
+ sleep(2)
+ # 输入配货单号
+ chrome.find_element_by_xpath('(//input[@class="el-input__inner"])[2]').send_keys(orderno)
+ sleep(2)
+ chrome.find_element_by_xpath('(//input[@class="el-input__inner"])[2]').send_keys(Keys.ENTER)
+ sleep(2)
+ chrome.find_element_by_xpath('//td[@class="vxe-body--column col_19 col--center col--last col--ellipsis dw-click-cell"]/div/span').click()
+ sleep(2)
+ chrome.switch_to.frame(chrome.find_element_by_xpath('//iframe[contains(@name,"awsui-dialog-iframe")]'))
+ sleep(2)
+ # 点击自动配货按钮
+ chrome.find_element_by_xpath('//button[text()="自动配货"]').click()
+ sleep(2)
+ chrome.find_element_by_xpath('//span[text()="分配批次"]').click()
+ sleep(2)
+ # chrome.execute_script(
+ # 'document.getElementsByClassName("body")[0].scrollTop = "300";')
+ # # 滚动条右拉
+ # chrome.execute_script(
+ # "document.getElementsByClassName('vxe-table--footer-wrapper body--wrapper')[0].scrollLeft = 1200")
+ #
+ # element = chrome.find_element_by_xpath('(//td[@colid="col_124"])[1]')
+ # element.click()
+ # sleep(2)
+ # chrome.find_element_by_class_name('awsui-input-number-right').send_keys('1')
+ # sleep(2)
+ # chrome.find_element_by_xpath('//td[@colid="col_125"]').click()
+ # sleep(1)
+
+ #方案一============================开始
+ if type==1:
+ import datetime
+ now = datetime.datetime.now()
+ one_minutes_later = now + datetime.timedelta(minutes=1)
+ now = now.strftime('%Y-%m-%d %H:%M')
+ one_minutes_later = one_minutes_later.strftime('%Y-%m-%d %H:%M')
+ # print('bbbbbbbb'+one_minutes_later)
+ while True:
+ now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M')
+ # print('变化的时间' + now)
+ if now == one_minutes_later:
+ print('时间到了')
+ start = time.clock()
+ chrome.find_element_by_xpath('//span[text()="提交"]').click()
+ sleep(2)
+ chrome.find_element_by_xpath('//button[@class="el-button el-button--primary el-button--mini"]').click()
+ break
+ # 方案一============================结束
+ #方案二===============开始
+ if type==2:
+ m=get_time_m() #当前时间的分钟
+ m1=get_submit_time(m)#计划提交时间的分钟
+ while True:
+ m2=get_time_m() #循环获取当前的分
+ sleep(10)
+ if (m2==m1):
+ print('时间到了')
+ chrome.find_element_by_xpath('//span[text()="提交"]').click()
+ sleep(2)
+ start = time.clock()
+ chrome.find_element_by_xpath('//button[@class="el-button el-button--primary el-button--mini"]').click()
+ break
+ #方案二===============结束
+ while True:
+ try:
+ if chrome.find_element_by_xpath('//p[text()="流程结束"]').is_displayed()==True:
+ # print('流程结束')
+ break
+ # else:
+ # print('共享任务创建成功的元素没有出现')
+ except:
+ continue
+ # lock.release()
+ # sleep(2)
+ # chrome.find_element_by_xpath('//button[@class="el-button el-button--primary el-button--mini"]').click()
+ chrome.switch_to.default_content()
+ chrome.switch_to.frame(chrome.find_element_by_xpath('(//iframe[@class="metro-main-frame"])[2]'))
+ # sleep(20)
+ while True:
+ try:
+ if chrome.find_element_by_xpath('(//span[text()="%s"])[1]'%orderno).is_displayed()==True:
+ print('//span[text()="%s"]'%orderno)
+ break
+ except:
+ continue
+ print('寄售申请单创建完成')
+ end = time.clock()
+ print(start, end)
+ print('CPU执行时间: ', end - start)
+ imgInfo = getErrorPhoto(chrome)
+ imgName = imgInfo[0]
+ image_path = imgInfo[1]
+ info=orderno+'执行耗时'+str(end - start)
+ now = get_time()
+ writeFile_append(pro_path + '/logs/catalina.out', info)
+ send_email1(image_path, info)
+ except Exception as e:
+ print('出现异常')
+ # 将日志写入到文件中单独存储
+ pro_path = get_pro_path()
+ traceback.print_exc()
+ imgInfo = getErrorPhoto(chrome)
+ imgName = imgInfo[0]
+ image_path = imgInfo[1]
+ print(imgName, image_path)
+ print(repr(e))
+ info = repr(e)
+ now = get_time()
+ writeFile_append(pro_path + '/logs/logerror%s.txt' % now, info)
+ # send_email1(image_path, info)
+if __name__ == "__main__":
+ # 创建多线程时, 需要制定该线程执行的任务.name线程名字 target目标函数名
+ # t1 = threading.Thread(target=job,name="job1")
+ # t2 = threading.Thread(target=job,name="job2")
+ # t1.start()
+ # t2.start()
+ # opt = ChromeOptions() # 创建 Chrome 参数对象
+ # # opt.headless = True # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ # opt.headless = False # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ # opt.add_argument('--start-maximized')
+ # opt.add_argument('--window-size=1280x1024')
+ # # chrome = Chrome(options=opt) # 创建无界面对象
+ # chrome = WebChrome(chrome_options=opt) # airtest中的类
+
+ count=1
+ for i in range(count):
+ t = threading.Thread(target=job)
+ t.start()
+ # t.join()
+
+def start1():
+ count = 5
+ for i in range(count):
+ t = threading.Thread(target=job)
+ t.start()
+ t.join()
+
+ # print(threading.active_count())
+ # print("程序执行结束.....")
+ # create_salesorder()
diff --git "a/testcase/od/\345\244\232\346\230\216\347\273\206/\345\257\204\345\224\256\351\205\215\350\264\247\345\215\225\345\244\232\346\230\216\347\273\206100_old.py" "b/testcase/od/\345\244\232\346\230\216\347\273\206/\345\257\204\345\224\256\351\205\215\350\264\247\345\215\225\345\244\232\346\230\216\347\273\206100_old.py"
new file mode 100644
index 0000000..0472897
--- /dev/null
+++ "b/testcase/od/\345\244\232\346\230\216\347\273\206/\345\257\204\345\224\256\351\205\215\350\264\247\345\215\225\345\244\232\346\230\216\347\273\206100_old.py"
@@ -0,0 +1,304 @@
+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 mail1 import send_email1
+from public.tools import *
+
+
+
+
+# chrome = webdriver.Chrome(chrome_options=opt)
+
+def job():
+ print("这是一个需要执行的任务。。。。。")
+ create_salesorder()
+ print("当前线程的个数:", threading.active_count())
+ time.sleep(1)
+ print("当前线程的信息:", threading.current_thread())
+def add_goods(goodsname,chrome):
+ chrome.find_element_by_xpath(
+ '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,厂家物料编码,件包数"]').send_keys(
+ goodsname)
+ chrome.find_element_by_xpath(
+ '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,厂家物料编码,件包数"]').send_keys(
+ Keys.ENTER)
+ #获取页数
+ # pagecount=chrome.find_element_by_xpath('(// li[ @class ="number"])[16]').text
+ pagecount=10
+ for i in range(int(pagecount)):
+ sleep(1)
+ chrome.find_element_by_xpath(
+ '//th[@class="el-table_18_column_157 multiple-column el-table-column--selection is-leaf headerCellClassName el-table__cell"]/div/label/span/span').click()
+ #翻页
+ chrome.find_element_by_xpath('(//button[@class="btn-next is-last"])[6]').click()
+ sleep(2)
+
+
+def create_salesorder(type=1):
+ try:
+ import time
+ pro_path = get_pro_path()
+ start = time.clock()
+ # caps = DesiredCapabilities().CHROME
+ # caps["pageLoadStrategy"] = "normal" # complete
+ # caps["pageLoadStrategy"] = "eager" # interactive
+ # caps["pageLoadStrategy"] = "none"
+ # chrome = webdriver.Chrome(desired_capabilities=caps)
+ opt = ChromeOptions() # 创建 Chrome 参数对象
+ # opt.headless = True # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ opt.headless = False # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ opt.add_argument('--start-maximized')
+ opt.add_argument('--window-size=1280x1024')
+ # chrome = Chrome(options=opt) # 创建无界面对象
+ # chrome = WebChrome(chrome_options=opt)
+ chrome = WebChrome(chrome_options=opt)
+ # chrome=webdriver.Chrome()
+ chrome.implicitly_wait(20)
+ chrome.get("http://10.17.65.200:8088/portal/")
+ # chrome.get("http://10.17.65.207:8088/uat/r/w")
+ sleep(2)
+ chrome.implicitly_wait(30)
+ chrome.maximize_window()
+ chrome.find_element_by_id('input1').clear()
+ chrome.find_element_by_id('input1').send_keys('admin')
+ chrome.find_element_by_id('input2').clear()
+ chrome.find_element_by_id('input2').send_keys('Gyxc1234')
+ 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
+ # 切换所属公司
+ chrome.find_element_by_class_name('changeCom').click()
+ sleep(1)
+ chrome.find_element_by_xpath('//span[text()="国药集团北京医疗器械有限公司"]/following-sibling::button').click()
+ sleep(1)
+ chrome.find_element_by_xpath('// button[text() = "确定"]').click()
+ sleep(1)
+ # chrome.find_element_by_xpath('//div[text()="销售管理"]').click()
+ # actions = ActionChains(chrome)
+ # actions.move_to_element(chrome.find_element_by_xpath('//div[text()="销售业务"]')).perform()
+ # chrome.find_element_by_xpath('//span[text()="销售订单"]').click()
+ 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('(//input[@class="el-input__inner"])[2]').send_keys('PHD23082800006A')
+ sleep(2)
+ chrome.find_element_by_xpath('(//input[@class="el-input__inner"])[2]').send_keys(Keys.ENTER)
+ sleep(2)
+
+ # chrome.find_element_by_xpath('//td[@class="vxe-body--column col_19 col--center col--last col--ellipsis dw-click-cell"]/div/span').click()
+ # chrome.find_element_by_xpath('//span[text()="PHD23082800006A"]').click()
+ chrome.find_element_by_xpath('//td[@class="vxe-body--column col_19 col--center col--last col--ellipsis dw-click-cell"]/div/span').click()
+
+ # chrome.switch_to.default_content()
+ sleep(4)
+ # while True:
+ # try:
+ # if chrome.find_element_by_xpath('//div[text()="订单公司名称 "]').is_displayed():
+ # print(chrome.find_element_by_xpath('//div[text()="订单公司名称 "]').text)
+ # break
+ # except:
+ # continue
+ # print(chrome.find_element_by_xpath('//div[text()="订单公司名称 "]').text)
+
+
+ # sleep(2)
+ # 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('国药集团北京')
+ # chrome.find_element_by_xpath('//input[@placeholder="模糊检索:公司名称,公司编码"]').send_keys(Keys.ENTER)
+ # chrome.find_element_by_xpath('(//span[@class="el-radio__inner"])[2]').click()
+ # chrome.find_element_by_xpath('//span[@class="ensureBtn"]/button').click()
+ # chrome.find_element_by_xpath('//button[@class="el-button el-button--primary el-button--mini"]').click()
+ # chrome.switch_to.frame(chrome.find_element_by_xpath('(//iframe[@class="metro-main-frame"])[2]'))
+ chrome.switch_to.frame(chrome.find_element_by_xpath('//iframe[contains(@name,"awsui-dialog-iframe")]'))
+ #点击自动配货按钮
+ chrome.find_element_by_xpath('//button[text()="自动配货"]').click()
+ sleep(2)
+ chrome.find_element_by_xpath('//span[text()="分配批次"]').click()
+ sleep(2)
+ chrome.execute_script(
+ 'document.getElementsByClassName("body")[0].scrollTop = "300";')
+ # 滚动条右拉
+ chrome.execute_script(
+ "document.getElementsByClassName('vxe-table--footer-wrapper body--wrapper')[0].scrollLeft = 1200");
+
+ for i in range(1,101):
+ element = chrome.find_element_by_xpath('(//td[@colid="col_124"])[%s]'%i)
+ element.click()
+ sleep(2)
+ chrome.find_element_by_class_name('awsui-input-number-right').send_keys('1')
+ sleep(2)
+ chrome.find_element_by_xpath('//td[@colid="col_125"]').click()
+ sleep(1)
+
+
+
+
+ # element = chrome.find_element_by_xpath('//td[@colid="col_159"]')
+ # element.click()
+ # sleep(3)
+ # element.send_keys("1")
+ # chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='1'")
+ # chrome.find_element_by_xpath(
+ # '//div[@class="el-input el-input--fullScreenSize el-input--prefix el-input--suffix dataDialog awsui-input dataDialog"]/div/input').send_keys(
+ # '23072800OP0237')
+ # sleep(1)
+ # chrome.find_element_by_xpath('//td[@colid="col_160"]').click()
+
+ # chrome.find_element_by_xpath(
+ # '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,厂家物料编码,件包数"]').send_keys(
+ # '10006179')
+ # chrome.find_element_by_xpath(
+ # '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,厂家物料编码,件包数"]').send_keys(
+ # Keys.ENTER)
+ # chrome.find_element_by_xpath('(//span[@class="el-checkbox__inner"])[4]').click()
+ # chrome.find_element_by_xpath('(//div[@class="el-dialog__body"]/div[2]/span/button[1]/span)[5]').click()
+ # sleep(3)
+ # 滚动条右拉
+
+ # element.send_keys("1")
+ # chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='1'")
+ # chrome.find_element_by_class_name('awsui-input-number-right').send_keys('1')
+ # sleep(1)
+ # chrome.find_element_by_xpath('//td[@colid="col_166"]').click()
+ # sleep(1)
+ #滚动条右拉
+ # document.getElementsByClassName('vxe-table--footer-wrapper body--wrapper')[0].scrollLeft = 5000
+ # chrome.execute_script("document.getElementsByClassName('vxe-table--footer-wrapper body--wrapper')[0].scrollLeft = 2000");
+ # element = chrome.find_element_by_xpath('//td[@colid="col_197"]')
+ # element.click()
+ # sleep(6)
+ # chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='8'")
+ # sleep(2)
+ # element = chrome.find_element_by_xpath('//td[@colid="col_198"]')
+ # element.click()
+ # sleep(6)
+ # chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='8'")
+ # sleep(2)
+ # lock = threading.Lock()
+ # lock.acquire()
+ #方案一============================开始
+ if type==1:
+ import datetime
+ now = datetime.datetime.now()
+ one_minutes_later = now + datetime.timedelta(minutes=1)
+ now = now.strftime('%Y-%m-%d %H:%M')
+ one_minutes_later = one_minutes_later.strftime('%Y-%m-%d %H:%M')
+ # print('bbbbbbbb'+one_minutes_later)
+ while True:
+ now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M')
+ # print('变化的时间' + now)
+ if now == one_minutes_later:
+ print('时间到了')
+ start = time.clock()
+ chrome.find_element_by_xpath('//span[text()="提交"]').click()
+ # sleep(3)
+ # chrome.find_element_by_xpath('//button[@class="el-button el-button--primary el-button--mini"]').click()
+ break
+ # 方案一============================结束
+ #方案二===============开始
+ if type==2:
+ m=get_time_m() #当前时间的分钟
+ m1=get_submit_time(m)#计划提交时间的分钟
+ while True:
+ m2=get_time_m() #循环获取当前的分
+ sleep(10)
+ if (m2==m1):
+ start = time.clock()
+ chrome.find_element_by_xpath('//span[text()="提交"]').click()
+ # sleep(3)
+ # chrome.find_element_by_xpath('//button[@class="el-button el-button--primary el-button--mini"]').click()
+ break
+ #方案二===============结束
+ # lock.release()
+ while True:
+ try:
+ if chrome.find_element_by_xpath('//p[text()="流程结束"]').is_displayed() == True:
+ # print('订单完成了')
+ break
+ except:
+ continue
+ sleep(2)
+ # chrome.find_element_by_xpath('//button[@class="el-button el-button--primary el-button--mini"]').click()
+ # chrome.switch_to.default_content()
+ # chrome.switch_to.frame(chrome.find_element_by_xpath('(//iframe[@class="metro-main-frame"])[2]'))
+ # sleep(20)
+ # while True:
+ # try:
+ # if chrome.find_element_by_xpath('//span[text()="%s"]'%orderno).is_displayed()==True:
+ # print('//span[text()="%s"]'%orderno)
+ # break
+ # except:
+ # continue
+ print('寄售配货单创建完成')
+ end = time.clock()
+ print(start, end)
+ print('CPU执行时间: ', end - start)
+ imgInfo = getErrorPhoto(chrome)
+ imgName = imgInfo[0]
+ image_path = imgInfo[1]
+ info='执行耗时'+str(end - start)
+ now = get_time()
+ writeFile_append(pro_path + '/logs/catalina.out', info)
+ send_email1(image_path, info)
+ except Exception as e:
+ print('出现异常')
+ # 将日志写入到文件中单独存储
+ pro_path = get_pro_path()
+ traceback.print_exc()
+ imgInfo = getErrorPhoto(chrome)
+ imgName = imgInfo[0]
+ image_path = imgInfo[1]
+ print(imgName, image_path)
+ print(repr(e))
+ info = repr(e)
+ now = get_time()
+ writeFile_append(pro_path + '/logs/logerror%s.txt' % now, info)
+ # send_email1(image_path, info)
+if __name__ == "__main__":
+ # 创建多线程时, 需要制定该线程执行的任务.name线程名字 target目标函数名
+ # t1 = threading.Thread(target=job,name="job1")
+ # t2 = threading.Thread(target=job,name="job2")
+ # t1.start()
+ # t2.start()
+ # opt = ChromeOptions() # 创建 Chrome 参数对象
+ # # opt.headless = True # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ # opt.headless = False # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ # opt.add_argument('--start-maximized')
+ # opt.add_argument('--window-size=1280x1024')
+ # # chrome = Chrome(options=opt) # 创建无界面对象
+ # chrome = WebChrome(chrome_options=opt) # airtest中的类
+
+ count=1
+ for i in range(count):
+ t = threading.Thread(target=job)
+ t.start()
+ # t.join()
+
+def start1():
+ count = 5
+ for i in range(count):
+ t = threading.Thread(target=job)
+ t.start()
+ t.join()
+
+ # print(threading.active_count())
+ # print("程序执行结束.....")
+ # create_salesorder()
diff --git "a/testcase/od/\345\244\232\346\230\216\347\273\206/\346\211\213\346\234\257\345\200\237\345\207\272\345\215\225\345\244\232\346\230\216\347\273\206100.py" "b/testcase/od/\345\244\232\346\230\216\347\273\206/\346\211\213\346\234\257\345\200\237\345\207\272\345\215\225\345\244\232\346\230\216\347\273\206100.py"
new file mode 100644
index 0000000..6474b6e
--- /dev/null
+++ "b/testcase/od/\345\244\232\346\230\216\347\273\206/\346\211\213\346\234\257\345\200\237\345\207\272\345\215\225\345\244\232\346\230\216\347\273\206100.py"
@@ -0,0 +1,375 @@
+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 mail1 import send_email1
+from public.tools import *
+
+
+
+
+# chrome = webdriver.Chrome(chrome_options=opt)
+
+def job():
+ print("这是一个需要执行的任务。。。。。")
+ create_salesorder()
+ print("当前线程的个数:", threading.active_count())
+ time.sleep(1)
+ print("当前线程的信息:", threading.current_thread())
+def add_goods(goodsname,chrome):
+ chrome.find_element_by_xpath(
+ '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,厂家物料编码,存储条件"]').send_keys(
+ goodsname)
+ chrome.find_element_by_xpath(
+ '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,厂家物料编码,存储条件"]').send_keys(
+ Keys.ENTER)
+ #获取页数
+ # pagecount=chrome.find_element_by_xpath('(// li[ @class ="number"])[16]').text
+ pagecount=10
+ for i in range(int(pagecount)):
+ # chrome.find_element_by_xpath('//span[text()="添加商品"]').click()
+ # chrome.find_element_by_xpath(
+ # '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,主计量单位,销售计量单位,厂家物料编码,存储条件说明,生产企业编码,供应商编码,行类型,商品性质,批发价,进口/国产/港澳台,件包数,产品备注,是否免备案,产品描述"]').send_keys(
+ # goodsname)
+ # chrome.find_element_by_xpath(
+ # '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,主计量单位,销售计量单位,厂家物料编码,存储条件说明,生产企业编码,供应商编码,行类型,商品性质,批发价,进口/国产/港澳台,件包数,产品备注,是否免备案,产品描述"]').send_keys(
+ # Keys.ENTER)
+ sleep(1)
+ chrome.find_element_by_xpath(
+ '//th[@class="el-table_15_column_131 multiple-column el-table-column--selection is-leaf headerCellClassName el-table__cell"]/div/label/span/span').click()
+ #翻页
+ chrome.find_element_by_xpath('(//button[@class="btn-next is-last"])[5]').click()
+
+ #点击确定
+ # chrome.find_element_by_xpath('(//div[@class="el-dialog__body"]/div[2]/span/button[1]/span)[5]').click()
+ sleep(1)
+
+def create_salesorder(type=1):
+ try:
+ import time
+ pro_path = get_pro_path()
+ start = time.clock()
+ # caps = DesiredCapabilities().CHROME
+ # caps["pageLoadStrategy"] = "normal" # complete
+ # caps["pageLoadStrategy"] = "eager" # interactive
+ # caps["pageLoadStrategy"] = "none"
+ # chrome = webdriver.Chrome(desired_capabilities=caps)
+ opt = ChromeOptions() # 创建 Chrome 参数对象
+ # opt.headless = True # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ opt.headless = False # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ opt.add_argument('--start-maximized')
+ opt.add_argument('--window-size=1280x1024')
+ # chrome = Chrome(options=opt) # 创建无界面对象
+ # chrome = WebChrome(chrome_options=opt)
+ chrome = WebChrome(chrome_options=opt)
+ # chrome=webdriver.Chrome()
+ chrome.implicitly_wait(20)
+ chrome.get("http://10.17.65.200:8088/portal/")
+ # chrome.get("http://10.17.65.207:8088/uat/r/w")
+ sleep(2)
+ chrome.implicitly_wait(30)
+ chrome.maximize_window()
+ chrome.find_element_by_id('input1').clear()
+ chrome.find_element_by_id('input1').send_keys('admin')
+ chrome.find_element_by_id('input2').clear()
+ chrome.find_element_by_id('input2').send_keys('Gyxc1234')
+ 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
+ # 切换所属公司
+ chrome.find_element_by_class_name('changeCom').click()
+ sleep(1)
+ chrome.find_element_by_xpath('//span[text()="国药集团北京医疗器械有限公司"]/following-sibling::button').click()
+ sleep(1)
+ chrome.find_element_by_xpath('// button[text() = "确定"]').click()
+ sleep(1)
+ # chrome.find_element_by_xpath('//div[text()="销售管理"]').click()
+ # actions = ActionChains(chrome)
+ # actions.move_to_element(chrome.find_element_by_xpath('//div[text()="销售业务"]')).perform()
+ # chrome.find_element_by_xpath('//span[text()="销售订单"]').click()
+ 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(2)
+ chrome.switch_to.frame(chrome.find_element_by_xpath('//iframe[contains(@name,"awsui-dialog-iframe")]'))
+ #获取订单号
+
+ orderno=chrome.find_element_by_xpath('//div[text() = "借出单号 "]/following-sibling::div/span').text
+ print(orderno)
+ # chrome.switch_to.default_content()
+ sleep(2)
+ # while True:
+ # try:
+ # if chrome.find_element_by_xpath('//div[text()="订单公司名称 "]').is_displayed():
+ # print(chrome.find_element_by_xpath('//div[text()="订单公司名称 "]').text)
+ # break
+ # except:
+ # continue
+ # print(chrome.find_element_by_xpath('//div[text()="订单公司名称 "]').text)
+ sleep(2)
+ # 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('国药集团北京')
+ # chrome.find_element_by_xpath('//input[@placeholder="模糊检索:公司名称,公司编码"]').send_keys(Keys.ENTER)
+ # chrome.find_element_by_xpath('//button[@class="el-button el-button--primary el-button--mini"]').click()
+ # chrome.find_element_by_xpath('(//span[@class="el-radio__inner"])[1]').click()
+ # chrome.find_element_by_xpath('//span[@class="ensureBtn"]/button').click()
+ # chrome.find_element_by_xpath('//button[@class="el-button el-button--primary el-button--mini"]').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('chenshuheng')
+ chrome.find_element_by_xpath('//input[@placeholder="模糊检索:员工编码,员工名称,部门编码,部门名称"]').send_keys(
+ Keys.ENTER)
+ chrome.find_element_by_xpath(
+ '(//div[text()="chenshuheng"])[3]/ancestor-or-self::td/preceding-sibling::td/div/label/span/span').click()
+ chrome.find_element_by_xpath('(//span[@class="ensureBtn"]/button[1])[1]').click()
+
+ #手术类型
+ chrome.find_element_by_xpath('(//input[@placeholder="请选择" and @type="text"])').click()
+ sleep(1)
+ chrome.find_element_by_xpath('//li[text()="初次手术"]').click()
+ sleep(1)
+ #手术种类
+ chrome.find_element_by_xpath('(//input[@placeholder="请选择" and @type="text"])[2]').click()
+ sleep(1)
+ chrome.find_element_by_xpath('//li[text()="髋关节"]').click()
+ sleep(1)
+ chrome.find_element_by_xpath('//label[text()="手术日期 "]/following-sibling::div/div').click()
+ sleep(1)
+ chrome.find_element_by_xpath('//div[ @class ="el-date-table-cell"] // span[text()="31"]').click()
+
+ #客户信息页签
+ 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('北京大学第三医院')
+ chrome.find_element_by_xpath('//input[@placeholder="模糊检索:客户编码,客户名称"]').send_keys(Keys.ENTER)
+ # chrome.find_element_by_xpath('//span/input[@type="radio" and @value="03105272b49986351ef7eb2930b5454de"]').click()
+ btn_div= chrome.find_element_by_xpath('//span/input[@type="radio" and @value="083165b4f865526823ef04a27fa9cd7c1"]')
+ chrome.execute_script("arguments[0].click();", btn_div)
+ chrome.find_element_by_xpath('(//button[@class="el-button el-button--primary el-button--default"])[3]').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('北京大学第三医院')
+ chrome.find_element_by_xpath('//input[@placeholder="模糊检索:客户编码,客商名称"]').send_keys(Keys.ENTER)
+ # chrome.find_element_by_xpath('//span/input[@type="radio" and @value="03105272b49986351ef7eb2930b5454de"]').click()
+ btn_div = chrome.find_element_by_xpath(
+ '//span/input[@type="radio" and @value="0c4d395678c596b20aa6c2a2fef3483d4"]')
+ chrome.execute_script("arguments[0].click();", btn_div)
+ chrome.find_element_by_xpath('(//button[@class="el-button el-button--primary el-button--default"])[3]').click()
+
+ # 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"])[4]').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('杨春刚')
+ # chrome.find_element_by_xpath('//input[@placeholder="模糊检索:业务员名称,业务员编码,业务部门名称,业务部门编码,部门类型编码"]').send_keys(Keys.ENTER)
+ # chrome.find_element_by_xpath('(//div[text()="杨春刚"])[3]/ancestor-or-self::td/preceding-sibling::td/div/label/span/span').click()
+ # chrome.find_element_by_xpath('(//span[@class="ensureBtn"]/button[1])[4]').click()
+ # #其他信息页签
+ # chrome.find_element_by_xpath('//div[text()="其他信息"]').click()
+ # chrome.find_element_by_xpath('//div[@cid="AWSUI.SwitchButton"]//div/div/div/div/span[1]').click()
+ # 子表信息录入
+ chrome.find_element_by_xpath('//div[text()="主体信息"]').click()
+ # chrome.find_element_by_xpath('//span[text()="添加商品"]').click()
+ # 点击添加商品弹出添加商品子窗口
+ for i in range(1):
+ chrome.find_element_by_xpath('//span[text()="添加商品"]').click()
+ add_goods('PTCA', chrome)
+ chrome.find_element_by_xpath('(//button[@class="el-button el-button--primary el-button--default"])[5]').click()
+ sleep(10)
+ for i in range(1, 101):
+ element = chrome.find_element_by_xpath('(//td[@colid="col_89"])[%s]' % i)
+ chrome.execute_script("arguments[0].click();", element)
+
+ # element=chrome.find_element_by_xpath('(//td[@colid="col_177"])[%s]'%i)
+ # element.click()
+ sleep(2)
+ # element.send_keys("1")
+ # chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='1'")
+ chrome.find_element_by_class_name('awsui-input-number-right').send_keys('1')
+ # chrome.find_element_by_xpath('//td[@colid="col_177"]/div/div').send_keys('1')
+ sleep(2)
+ # chrome.find_element_by_xpath('(//td[@colid="col_178"])[%s]'%i).click()
+ element = chrome.find_element_by_xpath('(//td[@colid="col_90"])[%s]' % i)
+ chrome.execute_script("arguments[0].click();", element)
+ sleep(2)
+
+
+ # chrome.find_element_by_xpath(
+ # '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,厂家物料编码,存储条件"]').send_keys(
+ # '10214724')
+ # chrome.find_element_by_xpath(
+ # '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,厂家物料编码,存储条件"]').send_keys(
+ # Keys.ENTER)
+ # sleep(1)
+ # chrome.find_element_by_xpath('(//span[@class="el-checkbox__inner"])[4]').click()
+ # chrome.find_element_by_xpath('(//div[@class="el-dialog__body"]/div[2]/span/button[1]/span)[4]').click()
+ # sleep(3)
+ # 滚动条右拉
+ # chrome.execute_script("document.getElementsByClassName('vxe-table--footer-wrapper body--wrapper')[0].scrollLeft = 2000");
+
+ # element=chrome.find_element_by_xpath('//td[@colid="col_89"]')
+ # element.click()
+ # sleep(2)
+ # # element.send_keys("1")
+ # # chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='1'")
+ # chrome.find_element_by_class_name('awsui-input-number-right').send_keys('1')
+ # sleep(2)
+ # chrome.find_element_by_xpath('//td[@colid="col_90"]').click()
+ #滚动条右拉
+ # document.getElementsByClassName('vxe-table--footer-wrapper body--wrapper')[0].scrollLeft = 5000
+ # chrome.execute_script("document.getElementsByClassName('vxe-table--footer-wrapper body--wrapper')[0].scrollLeft = 2000");
+ # element = chrome.find_element_by_xpath('//td[@colid="col_197"]')
+ # element.click()
+ # sleep(6)
+ # chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='8'")
+ # sleep(2)
+ # element = chrome.find_element_by_xpath('//td[@colid="col_198"]')
+ # element.click()
+ # sleep(6)
+ # chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='8'")
+ # sleep(2)
+ # lock = threading.Lock()
+ # lock.acquire()
+ #方案一============================开始
+ # if user_count<=5:
+ if type==1:
+ import datetime
+ now = datetime.datetime.now()
+ one_minutes_later = now + datetime.timedelta(minutes=1)
+ now = now.strftime('%Y-%m-%d %H:%M')
+ one_minutes_later = one_minutes_later.strftime('%Y-%m-%d %H:%M')
+ # print('bbbbbbbb'+one_minutes_later)
+ while True:
+ now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M')
+ # print('变化的时间' + now)
+ if now == one_minutes_later:
+ print('时间到了')
+ start = time.clock()
+ chrome.find_element_by_xpath('//span[text()="提交"]').click()
+ break
+ # 方案一============================结束
+ #方案二===============开始
+ if type==2:
+ m=get_time_m() #当前时间的分钟
+ m1=get_submit_time(m)#计划提交时间的分钟
+ while True:
+ m2=get_time_m() #循环获取当前的分
+ # sleep(60)
+ if (m2==m1):
+ start = time.clock()
+ chrome.find_element_by_xpath('//span[text()="提交"]').click()
+ break
+ #方案二===============结束
+ while True:
+ try:
+ if chrome.find_element_by_xpath('//p[text()="共享任务创建成功"]').is_displayed()==True:
+ # print('订单完成了')
+ break
+ # else:
+ # print('共享任务创建成功的元素没有出现')
+ except:
+ continue
+ # lock.release()
+ # while True:
+ # try:
+ # if chrome.find_element_by_xpath('//p[text()="共享任务创建成功"]').is_displayed() == True:
+ # # print('订单完成了')
+ # break
+ # except:
+ # continue
+ sleep(2)
+ # chrome.find_element_by_xpath('//button[@class="el-button el-button--primary el-button--mini"]').click()
+ chrome.switch_to.default_content()
+ chrome.switch_to.frame(chrome.find_element_by_xpath('(//iframe[@class="metro-main-frame"])[2]'))
+ # sleep(20)
+ while True:
+ try:
+ if chrome.find_element_by_xpath('(//span[text()="%s"])[2]'%orderno).is_displayed()==True:
+ print('//span[text()="%s"])[2]'%orderno)
+ break
+ except:
+ continue
+ print('手术借出单创建完成')
+ end = time.clock()
+ print(start, end)
+ print('CPU执行时间: ', end - start)
+ imgInfo = getErrorPhoto(chrome)
+ imgName = imgInfo[0]
+ image_path = imgInfo[1]
+ info=orderno+'执行耗时'+str(end - start)
+ now = get_time()
+ writeFile_append(pro_path + '/logs/catalina.out', info)
+ send_email1(image_path, info)
+ except Exception as e:
+ print('出现异常')
+ # 将日志写入到文件中单独存储
+ pro_path = get_pro_path()
+ traceback.print_exc()
+ imgInfo = getErrorPhoto(chrome)
+ imgName = imgInfo[0]
+ image_path = imgInfo[1]
+ print(imgName, image_path)
+ print(repr(e))
+ info = repr(e)
+ now = get_time()
+ writeFile_append(pro_path + '/logs/logerror%s.txt' % now, info)
+ # send_email1(image_path, info)
+if __name__ == "__main__":
+ # 创建多线程时, 需要制定该线程执行的任务.name线程名字 target目标函数名
+ # t1 = threading.Thread(target=job,name="job1")
+ # t2 = threading.Thread(target=job,name="job2")
+ # t1.start()
+ # t2.start()
+ # opt = ChromeOptions() # 创建 Chrome 参数对象
+ # # opt.headless = True # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ # opt.headless = False # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ # opt.add_argument('--start-maximized')
+ # opt.add_argument('--window-size=1280x1024')
+ # # chrome = Chrome(options=opt) # 创建无界面对象
+ # chrome = WebChrome(chrome_options=opt) # airtest中的类
+
+ count=1
+ for i in range(count):
+ t = threading.Thread(target=job)
+ t.start()
+ t.join()
+
+def start1():
+ count = 5
+ for i in range(count):
+ t = threading.Thread(target=job)
+ t.start()
+ t.join()
+
+ # print(threading.active_count())
+ # print("程序执行结束.....")
+ # create_salesorder()
diff --git "a/testcase/od/\345\244\232\346\230\216\347\273\206/\346\211\213\346\234\257\350\257\267\351\242\206\345\215\225\345\244\232\346\230\216\347\273\206100.py" "b/testcase/od/\345\244\232\346\230\216\347\273\206/\346\211\213\346\234\257\350\257\267\351\242\206\345\215\225\345\244\232\346\230\216\347\273\206100.py"
new file mode 100644
index 0000000..2a9aaa1
--- /dev/null
+++ "b/testcase/od/\345\244\232\346\230\216\347\273\206/\346\211\213\346\234\257\350\257\267\351\242\206\345\215\225\345\244\232\346\230\216\347\273\206100.py"
@@ -0,0 +1,334 @@
+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 mail1 import send_email1
+from public.tools import *
+
+
+
+
+# chrome = webdriver.Chrome(chrome_options=opt)
+
+def job():
+ print("这是一个需要执行的任务。。。。。")
+ create_salesorder()
+ print("当前线程的个数:", threading.active_count())
+ time.sleep(1)
+ print("当前线程的信息:", threading.current_thread())
+def add_goods(goodsname,chrome):
+ chrome.find_element_by_xpath(
+ '//input[@placeholder="模糊检索:商品编码,商品名称"]').send_keys(
+ goodsname)
+ sleep(2)
+ chrome.find_element_by_xpath(
+ '//input[@placeholder="模糊检索:商品编码,商品名称"]').send_keys(
+ Keys.ENTER)
+ sleep(2)
+ #获取页数
+ # pagecount=chrome.find_element_by_xpath('(// li[ @class ="number"])[16]').text
+ pagecount=10
+ for i in range(int(pagecount)):
+ # chrome.find_element_by_xpath('//span[text()="添加商品"]').click()
+ # chrome.find_element_by_xpath(
+ # '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,主计量单位,销售计量单位,厂家物料编码,存储条件说明,生产企业编码,供应商编码,行类型,商品性质,批发价,进口/国产/港澳台,件包数,产品备注,是否免备案,产品描述"]').send_keys(
+ # goodsname)
+ # chrome.find_element_by_xpath(
+ # '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,主计量单位,销售计量单位,厂家物料编码,存储条件说明,生产企业编码,供应商编码,行类型,商品性质,批发价,进口/国产/港澳台,件包数,产品备注,是否免备案,产品描述"]').send_keys(
+ # Keys.ENTER)
+ sleep(1)
+ chrome.find_element_by_xpath(
+ '//th[@class="el-table_15_column_145 multiple-column el-table-column--selection is-leaf headerCellClassName el-table__cell"]/div/label/span/span').click()
+ sleep(2)
+ #翻页
+ chrome.find_element_by_xpath('(//button[@class="btn-next is-last"])[5]').click()
+
+ #点击确定
+ # chrome.find_element_by_xpath('(//div[@class="el-dialog__body"]/div[2]/span/button[1]/span)[5]').click()
+ sleep(1)
+
+def create_salesorder(type=1):
+ import time
+ pro_path = get_pro_path()
+ start = time.clock()
+ # caps = DesiredCapabilities().CHROME
+ # caps["pageLoadStrategy"] = "normal" # complete
+ # caps["pageLoadStrategy"] = "eager" # interactive
+ # caps["pageLoadStrategy"] = "none"
+ # chrome = webdriver.Chrome(desired_capabilities=caps)
+ opt = ChromeOptions() # 创建 Chrome 参数对象
+ opt.headless = True # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ # opt.headless = False # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ opt.add_argument('--start-maximized')
+ opt.add_argument('--window-size=1280x1024')
+ # chrome = Chrome(options=opt) # 创建无界面对象
+ # chrome = WebChrome(chrome_options=opt)
+ # chrome = WebChrome(chrome_options=opt)
+ chrome = webdriver.Chrome(chrome_options=opt)
+ chrome.implicitly_wait(20)
+ try:
+ chrome.get("http://10.17.65.200:8088/portal/")
+ # chrome.get("http://10.17.65.207:8088/uat/r/w")
+ sleep(2)
+ chrome.implicitly_wait(30)
+ chrome.maximize_window()
+ chrome.find_element_by_id('input1').clear()
+ chrome.find_element_by_id('input1').send_keys('admin')
+ chrome.find_element_by_id('input2').clear()
+ chrome.find_element_by_id('input2').send_keys('Gyxc1234')
+ 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
+ # 切换所属公司
+ chrome.find_element_by_class_name('changeCom').click()
+ sleep(1)
+ chrome.find_element_by_xpath('//span[text()="国药集团北京医疗器械有限公司"]/following-sibling::button').click()
+ sleep(1)
+ chrome.find_element_by_xpath('// button[text() = "确定"]').click()
+ sleep(1)
+ 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(2)
+ chrome.switch_to.frame(chrome.find_element_by_xpath('//iframe[contains(@name,"awsui-dialog-iframe")]'))
+ #获取订单号
+
+ orderno=chrome.find_element_by_xpath('//div[text() = "请领单号 "]/following-sibling::div/span').text
+ print(orderno)
+ sleep(2)
+
+ # 业务员名称
+ chrome.find_element_by_xpath(
+ '//div[text()="业务员名称 "]/following-sibling::div/div/div/div/div/div/div/div/span/span/i').click()
+ sleep(2)
+ chrome.find_element_by_xpath('//input[@placeholder="模糊检索:员工编码,员工名称,部门编码,部门名称"]').send_keys('chenshuheng')
+ sleep(2)
+ chrome.find_element_by_xpath('//input[@placeholder="模糊检索:员工编码,员工名称,部门编码,部门名称"]').send_keys(
+ Keys.ENTER)
+ sleep(2)
+ chrome.find_element_by_xpath(
+ '(//div[text()="chenshuheng"])[3]/ancestor-or-self::td/preceding-sibling::td/div/label/span/span').click()
+ chrome.find_element_by_xpath('(//span[@class="ensureBtn"]/button[1])[1]').click()
+
+ #手术类型
+ chrome.find_element_by_xpath('(//input[@placeholder="请选择" and @type="text"])').click()
+ sleep(1)
+ chrome.find_element_by_xpath('//li[text()="初次手术"]').click()
+ sleep(1)
+ #手术种类
+ chrome.find_element_by_xpath('(//input[@placeholder="请选择" and @type="text"])[2]').click()
+ sleep(1)
+ chrome.find_element_by_xpath('//li[text()="髋关节"]').click()
+ sleep(1)
+ chrome.find_element_by_xpath('//label[text()="手术日期 "]/following-sibling::div/div').click()
+ sleep(1)
+ chrome.find_element_by_xpath('//div[ @class ="el-date-table-cell"] // span[text()="31"]').click()
+
+ #客户信息页签
+ 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('北京大学第三医院')
+ chrome.find_element_by_xpath('//input[@placeholder="模糊检索:客户编码,客户名称"]').send_keys(Keys.ENTER)
+ # chrome.find_element_by_xpath('//span/input[@type="radio" and @value="03105272b49986351ef7eb2930b5454de"]').click()
+ btn_div= chrome.find_element_by_xpath('//span/input[@type="radio" and @value="02f94bb93be972567166f428524aa3b43"]')
+ chrome.execute_script("arguments[0].click();", btn_div)
+ chrome.find_element_by_xpath('(//button[@class="el-button el-button--primary el-button--default"])[3]').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('北京大学第三医院')
+ chrome.find_element_by_xpath('//input[@placeholder="模糊检索:客户编码,客商名称"]').send_keys(Keys.ENTER)
+ # chrome.find_element_by_xpath('//span/input[@type="radio" and @value="03105272b49986351ef7eb2930b5454de"]').click()
+ btn_div = chrome.find_element_by_xpath(
+ '//span/input[@type="radio" and @value="0c4d395678c596b20aa6c2a2fef3483d4"]')
+ chrome.execute_script("arguments[0].click();", btn_div)
+ chrome.find_element_by_xpath('(//button[@class="el-button el-button--primary el-button--default"])[4]').click()
+
+ # 子表信息录入
+ chrome.find_element_by_xpath('//div[text()="主体信息"]').click()
+ for i in range(1):
+ chrome.find_element_by_xpath('//span[text()="添加商品"]').click()
+ add_goods('PTCA', chrome)
+ chrome.find_element_by_xpath(
+ '(//button[@class="el-button el-button--primary el-button--default"])[5]').click()
+ sleep(30)
+
+ for i in range(1, 101):
+ element = chrome.find_element_by_xpath('(//td[@colid="col_75"])[%s]' % i)
+ sleep(2)
+ chrome.execute_script("arguments[0].click();", element)
+
+ # element=chrome.find_element_by_xpath('(//td[@colid="col_177"])[%s]'%i)
+ # element.click()
+ sleep(2)
+ # element.send_keys("1")
+ # chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='1'")
+ chrome.find_element_by_class_name('awsui-input-number-right').send_keys('1')
+ # chrome.find_element_by_xpath('//td[@colid="col_177"]/div/div').send_keys('1')
+ sleep(2)
+ # chrome.find_element_by_xpath('(//td[@colid="col_178"])[%s]'%i).click()
+ element = chrome.find_element_by_xpath('(//td[@colid="col_76"])[%s]' % i)
+ chrome.execute_script("arguments[0].click();", element)
+ sleep(2)
+ sleep(2)
+ chrome.find_element_by_xpath('//span[text()="提交"]').click()
+ while True:
+ try:
+ if chrome.find_element_by_xpath('//p[text()="共享任务创建成功"]').is_displayed() == True:
+ # print('订单完成了')
+ break
+ except:
+ continue
+ # lock.release()
+ sleep(2)
+ # chrome.find_element_by_xpath('//button[@class="el-button el-button--primary el-button--mini"]').click()
+ # chrome.switch_to.default_content()
+ # chrome.switch_to.frame(chrome.find_element_by_xpath('(//iframe[@class="metro-main-frame"])[2]'))
+ # # sleep(20)
+ # while True:
+ # try:
+ # if chrome.find_element_by_xpath('//span[text()="%s"]'%orderno).is_displayed()==True:
+ # print('//span[text()="%s"]'%orderno)
+ # break
+ # except:
+ # continue
+ # 进入手术配货单
+ chrome.switch_to.default_content()
+ sleep(3)
+ chrome.find_element_by_xpath('//span[@class="awsui-tabs-icon close"]').click()
+ sleep(1)
+ 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('//label[text()="请领单号"]/parent::div/div/div/div/input').send_keys(orderno)
+ sleep(1)
+ chrome.find_element_by_xpath('//label[text()="请领单号"]/parent::div/div/div/div/input').send_keys(Keys.ENTER)
+ sleep(1)
+ # chrome.switch_to.frame(chrome.find_element_by_xpath('//iframe[contains(@name,"awsui-dialog-iframe")]'))
+ sleep(1)
+ # text1 = chrome.find_element_by_xpath('(//span[text()="QLD23082800037B"])[2]').text
+ # print(text1)
+ chrome.find_element_by_xpath(
+ '//span[text()="%s"]//parent::div/parent::td//preceding-sibling::td[1]/div/span' % orderno).click()
+ # element = chrome.find_element_by_xpath('(//span[@class="vxe-checkbox--icon vxe-checkbox--unchecked-icon"])[2]')
+ # chrome.execute_script("arguments[0].click();", element)
+ sleep(1)
+ chrome.switch_to.frame(chrome.find_element_by_xpath('//iframe[contains(@name,"awsui-dialog-iframe")]'))
+ sleep(1)
+ # 方案一============================开始
+ # if user_count<=5:
+ if type == 1:
+ import datetime
+ now = datetime.datetime.now()
+ one_minutes_later = now + datetime.timedelta(minutes=1)
+ now = now.strftime('%Y-%m-%d %H:%M')
+ one_minutes_later = one_minutes_later.strftime('%Y-%m-%d %H:%M')
+ # print('bbbbbbbb'+one_minutes_later)
+ while True:
+ now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M')
+ # print('变化的时间' + now)
+ if now == one_minutes_later:
+ print('时间到了')
+ start = time.clock()
+ chrome.find_element_by_xpath('//span[text()="提交"]').click()
+ break
+ # 方案一============================结束
+ # 方案二===============开始
+ if type == 2:
+ m = get_time_m() # 当前时间的分钟
+ m1 = get_submit_time1(m) # 计划提交时间的分钟
+ print(' # 计划提交时间的分钟',m1)
+ while True:
+ m2 = get_time_m() # 循环获取当前的分
+ # sleep(60)
+ if (m2 == m1):
+ print('时间到了')
+ start = time.clock()
+ chrome.find_element_by_xpath('//span[text()="提交"]').click()
+ break
+ # 方案二===============结束#
+
+ # chrome.find_element_by_xpath('//span[text()="提交"]').click()
+ while True:
+ try:
+ if chrome.find_element_by_xpath('//p[text()="流程结束"]').is_displayed() == True:
+ # print('订单完成了')
+ break
+ except:
+ continue
+ # chrome.find_element_by_xpath('//span[text()="批量提交"]').click()
+ sleep(1)
+ print('手术请领配货单创建完成')
+ end = time.clock()
+ print(start, end)
+ print('CPU执行时间: ', end - start)
+ imgInfo = getErrorPhoto(chrome)
+ imgName = imgInfo[0]
+ image_path = imgInfo[1]
+ info=orderno+'执行耗时'+str(end - start)
+ now = get_time()
+ writeFile_append(pro_path + '/logs/catalina.out', info)
+ send_email1(image_path, info)
+ except Exception as e:
+ print('出现异常')
+ # 将日志写入到文件中单独存储
+ pro_path = get_pro_path()
+ traceback.print_exc()
+ imgInfo = getErrorPhoto(chrome)
+ imgName = imgInfo[0]
+ image_path = imgInfo[1]
+ print(imgName, image_path)
+ print(repr(e))
+ info = repr(e)
+ now = get_time()
+ writeFile_append(pro_path + '/logs/logerror%s.txt' % now, info)
+ # send_email1(image_path, info)
+if __name__ == "__main__":
+ # 创建多线程时, 需要制定该线程执行的任务.name线程名字 target目标函数名
+ # t1 = threading.Thread(target=job,name="job1")
+ # t2 = threading.Thread(target=job,name="job2")
+ # t1.start()
+ # t2.start()
+ # opt = ChromeOptions() # 创建 Chrome 参数对象
+ # # opt.headless = True # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ # opt.headless = False # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ # opt.add_argument('--start-maximized')
+ # opt.add_argument('--window-size=1280x1024')
+ # # chrome = Chrome(options=opt) # 创建无界面对象
+ # chrome = WebChrome(chrome_options=opt) # airtest中的类
+
+ count=1
+ for i in range(count):
+ t = threading.Thread(target=job)
+ t.start()
+ t.join()
+
+def start1():
+ count = 5
+ for i in range(count):
+ t = threading.Thread(target=job)
+ t.start()
+ t.join()
+
+ # print(threading.active_count())
+ # print("程序执行结束.....")
+ # create_salesorder()
diff --git "a/testcase/od/\345\244\232\346\230\216\347\273\206/\347\273\217\351\224\200\345\224\256\350\246\201\350\264\247\351\205\215\350\264\247\345\244\232\346\230\216\347\273\206100.py" "b/testcase/od/\345\244\232\346\230\216\347\273\206/\347\273\217\351\224\200\345\224\256\350\246\201\350\264\247\351\205\215\350\264\247\345\244\232\346\230\216\347\273\206100.py"
new file mode 100644
index 0000000..53161c7
--- /dev/null
+++ "b/testcase/od/\345\244\232\346\230\216\347\273\206/\347\273\217\351\224\200\345\224\256\350\246\201\350\264\247\351\205\215\350\264\247\345\244\232\346\230\216\347\273\206100.py"
@@ -0,0 +1,391 @@
+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 selenium.webdriver.support.select import Select
+
+from mail1 import send_email1
+from public.tools import *
+
+
+
+
+# chrome = webdriver.Chrome(chrome_options=opt)
+
+def job():
+ print("这是一个需要执行的任务。。。。。")
+ create_salesorder()
+ print("当前线程的个数:", threading.active_count())
+ time.sleep(1)
+ print("当前线程的信息:", threading.current_thread())
+def add_goods(goodsname,chrome):
+ chrome.find_element_by_xpath(
+ '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,采购计量单位,销售计量单位,生产厂家编码"]').send_keys(
+ goodsname)
+ chrome.find_element_by_xpath(
+ '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,采购计量单位,销售计量单位,生产厂家编码"]').send_keys(
+ Keys.ENTER)
+ # 获取页数
+ # pagecount=chrome.find_element_by_xpath('(// li[ @class ="number"])[16]').text
+ pagecount = 10
+ for i in range(int(pagecount)):
+ sleep(1)
+ chrome.find_element_by_xpath(
+ '//th[@class="el-table_15_column_192 multiple-column el-table-column--selection is-leaf headerCellClassName el-table__cell"]/div/label/span/span').click()
+ # 翻页
+ chrome.find_element_by_xpath('(//button[@class="btn-next is-last"])[5]').click()
+
+
+sleep(1)
+
+
+#配货函数
+def match_goods(chrome,orderno,type):
+ chrome.switch_to.default_content()
+ sleep(1)
+ chrome.find_element_by_xpath('//span[@class="awsui-tabs-icon close"]').click()
+ sleep(1)
+ 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.switch_to.frame(chrome.find_element_by_xpath('//iframe[contains(@name,"awsui-dialog-iframe")]'))
+ sleep(2)
+ s = Select(chrome.find_element_by_id('purchasingCoOptSelect'))
+ s.select_by_index(0)
+ sleep(2)
+ # chrome.find_element_by_xpath('//li[text()="北京大学第三医院(3)"]').click()
+ # sleep(1)
+ chrome.find_element_by_xpath('//span[text()="%s"]'%orderno).click()
+ sleep(4)
+ # 点击自动填充按钮
+ chrome.find_element_by_xpath('//button[text()="自动填充"]').click()
+ # sleep(4)
+ while True:
+ try:
+ chrome.find_element_by_xpath('//button[text()="提交"]').click()
+ break
+ except:
+ continue
+ sleep(2)
+ # chrome.find_element_by_xpath('//a[text()="确认"]').click()
+ sleep(1)
+
+ # 方案一============================开始
+ if type == 1:
+ import datetime
+ now = datetime.datetime.now()
+ one_minutes_later = now + datetime.timedelta(minutes=1)
+ now = now.strftime('%Y-%m-%d %H:%M')
+ one_minutes_later = one_minutes_later.strftime('%Y-%m-%d %H:%M')
+ # print('bbbbbbbb'+one_minutes_later)
+ while True:
+ now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M')
+ # print('变化的时间' + now)
+ if now == one_minutes_later:
+ print('时间到了')
+ start = time.clock()
+ print('提交订单开始时间', start)
+ chrome.find_element_by_xpath('//a[text()="确认"]').click()
+ break
+ # 方案一============================结束
+ # 方案二===============开始
+ if type == 2:
+ m = get_time_m() # 当前时间的分钟
+ m1 = get_submit_time(m) # 计划提交时间的分钟
+ print('销售订单计划提交时间的分钟', m1)
+ while True:
+ m2 = get_time_m() # 循环获取当前的分
+ # sleep(30)
+ if (m2 == m1):
+ start = time.clock()
+ chrome.find_element_by_xpath('//a[text()="确认"]').click()
+ break
+ # 方案二===============结束
+ while True:
+ try:
+ if chrome.find_element_by_xpath('//div[text()="提交成功"]').is_displayed() == True:
+ # print('订单完成了')
+ break
+ # else:
+ # print('共享任务创建成功的元素没有出现')
+ except:
+ continue
+ end = time.clock()
+ print(start, end)
+ # print('CPU执行时间: ', end - start)
+ return str(end - start)
+
+def create_salesorder(type=1):
+ try:
+ import time
+ pro_path = get_pro_path()
+ start = time.clock()
+ print('开始时间',start)
+ # caps = DesiredCapabilities().CHROME
+ # caps["pageLoadStrategy"] = "normal" # complete
+ # caps["pageLoadStrategy"] = "eager" # interactive
+ # caps["pageLoadStrategy"] = "none"
+ # chrome = webdriver.Chrome(desired_capabilities=caps)
+ opt = ChromeOptions() # 创建 Chrome 参数对象
+ # opt.headless = True # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ opt.headless = False # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ opt.add_argument('--start-maximized')
+ opt.add_argument('--window-size=1280x1024')
+ # chrome = Chrome(options=opt) # 创建无界面对象
+ # chrome = WebChrome(chrome_options=opt)
+ chrome = WebChrome(chrome_options=opt)
+ # chrome=webdriver.Chrome()
+ chrome.implicitly_wait(20)
+ chrome.get("http://10.17.65.200:8088/portal/")
+ # chrome.get("http://10.17.65.207:8088/uat/r/w")
+ sleep(2)
+ chrome.implicitly_wait(30)
+ # chrome.maximize_window()
+ chrome.find_element_by_id('input1').clear()
+ chrome.find_element_by_id('input1').send_keys('admin')
+ chrome.find_element_by_id('input2').clear()
+ chrome.find_element_by_id('input2').send_keys('Gyxc1234')
+ 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
+ #切换所属公司
+ chrome.find_element_by_class_name('changeCom').click()
+ sleep(1)
+ chrome.find_element_by_xpath('//span[text()="国药集团北京医疗器械有限公司"]/following-sibling::button').click()
+ sleep(1)
+ chrome.find_element_by_xpath('// button[text() = "确定"]').click()
+ sleep(1)
+ 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(4)
+ 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")]'))
+ # 获取订单号
+
+ orderno = chrome.find_element_by_xpath('//div[text() = "要货申请单号 "]/following-sibling::div/span').text
+ print(orderno)
+ # chrome.switch_to.default_content()
+ sleep(4)
+ # while True:
+ # try:
+ # if chrome.find_element_by_xpath('//div[text()="订单公司名称 "]').is_displayed():
+ # print(chrome.find_element_by_xpath('//div[text()="订单公司名称 "]').text)
+ # break
+ # except:
+ # continue
+ print(chrome.find_element_by_xpath('//div[text()="要货申请单号 "]').text)
+
+
+ sleep(2)
+ #客户名称
+ 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('北京大学')
+ chrome.find_element_by_xpath('//input[@placeholder="模糊检索:客户编码,客户名称,收货地址,产品线名称,产品线编码"]').send_keys(Keys.ENTER)
+ chrome.find_element_by_xpath('(//span[@class="el-radio__inner"])[1]').click()
+
+ chrome.find_element_by_xpath('//span[@class="ensureBtn"]/button').click()
+
+ #详细信息
+ 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('//span/input[@type="radio" and @value="03105272b49986351ef7eb2930b5454de"]').click()
+ btn_div= chrome.find_element_by_xpath('//span/input[@type="radio" and @value="012001f8d35054875d6157d4715404319"]')
+ chrome.execute_script("arguments[0].click();", btn_div)
+ chrome.find_element_by_xpath('(//button[@class="el-button el-button--primary el-button--default"])[3]').click()
+ sleep(1)
+
+ #业务员名称
+ 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('chenshuheng')
+ chrome.find_element_by_xpath('//input[@placeholder="模糊检索:业务员名称,业务员编码,业务部门名称,部门编码,部门类型编码"]').send_keys(Keys.ENTER)
+ chrome.find_element_by_xpath('(//div[text()="chenshuheng"])[3]/ancestor-or-self::td/preceding-sibling::td/div/label/span/span').click()
+ chrome.find_element_by_xpath('(//span[@class="ensureBtn"]/button[1])[3]').click()
+ # #其他信息页签
+ # chrome.find_element_by_xpath('//div[text()="其他信息"]').click()
+ # chrome.find_element_by_xpath('//div[@cid="AWSUI.SwitchButton"]//div/div/div/div/span[1]').click()
+ # 子表信息录入
+ chrome.find_element_by_xpath('//div[text()="主体信息"]').click()
+ # 点击添加商品弹出添加商品子窗口
+ for i in range(1):
+ chrome.find_element_by_xpath('//span[text()="添加商品"]').click()
+ add_goods('PTCA', chrome)
+ chrome.find_element_by_xpath('(//div[@class="el-dialog__body"]/div[2]/span/button[1]/span)[4]').click()
+ sleep(20)
+ # chrome.find_element_by_xpath('//span[text()="添加商品"]').click()
+ # chrome.find_element_by_xpath(
+ # '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,采购计量单位,销售计量单位,生产厂家编码"]').send_keys(
+ # '10006179')
+ # chrome.find_element_by_xpath(
+ # '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,采购计量单位,销售计量单位,生产厂家编码"]').send_keys(
+ # Keys.ENTER)
+ # sleep(1)
+ # chrome.find_element_by_xpath('(//span[@class="el-checkbox__inner"])[4]').click()
+ # chrome.find_element_by_xpath('(//div[@class="el-dialog__body"]/div[2]/span/button[1]/span)[4]').click()
+ while True:
+ try:
+ chrome.find_element_by_xpath('//div[@class="el-loading-spinner"]').is_displayed()
+ continue
+ except:
+ break
+ for i in range(1, 101):
+ sleep(2)
+ element=chrome.find_element_by_xpath('(//td[@colid="col_93"])[%s]'%i)
+ element.click()
+ sleep(2)
+ # element.send_keys("1")
+ # chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='1'")
+ chrome.find_element_by_class_name('awsui-input-number-right').send_keys('1')
+ # chrome.find_element_by_xpath('//td[@colid="col_177"]/div/div').send_keys('1')
+ sleep(2)
+ chrome.find_element_by_xpath('(//td[@colid="col_94"])[%s]'%i).click()
+ sleep(2)
+ chrome.execute_script(
+ "document.getElementsByClassName('vxe-table--body-wrapper body--wrapper')[0].scrollTop = %s*50;" % i)
+ # #滚动条右拉
+ # # document.getElementsByClassName('vxe-table--footer-wrapper body--wrapper')[0].scrollLeft = 5000
+ # chrome.execute_script("document.getElementsByClassName('vxe-table--footer-wrapper body--wrapper')[0].scrollLeft = 2000");
+ # element = chrome.find_element_by_xpath('//td[@colid="col_197"]')
+ # element.click()
+ # sleep(2)
+ # chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='8'")
+ # sleep(2)
+ # element = chrome.find_element_by_xpath('//td[@colid="col_198"]')
+ # element.click()
+ # sleep(2)
+ # chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='8'")
+ # sleep(2)
+ # lock = threading.Lock()
+ # lock.acquire()
+ chrome.find_element_by_xpath('//span[text()="提交"]').click()
+
+ while True:
+ try:
+ if chrome.find_element_by_xpath('//p[text()="共享任务创建成功"]').is_displayed()==True:
+ # print('订单完成了')
+ break
+ # else:
+ # print('共享任务创建成功的元素没有出现')
+ except:
+ continue
+ # lock.release()
+ # sleep(2)
+ # chrome.find_element_by_xpath('//button[@class="el-button el-button--primary el-button--mini awsui-button awsui-button--primary"]//span[text()="确定"]').click()
+ # chrome.switch_to.default_content()
+ # chrome.switch_to.frame(chrome.find_element_by_xpath('(//iframe[@class="metro-main-frame"])[2]'))
+ # sleep(20)
+ # while True:
+ # try:
+ # if chrome.find_element_by_xpath('//span[text()="%s"]' % orderno).is_displayed() == True:
+ # print('//span[text()="%s"]' % orderno)
+ # break
+ # except:
+ # continue
+ while True:
+ try:
+ # if chrome.find_element_by_xpath('(//span[text()="%s"])[2]'%orderno).is_displayed()==True:
+ if chrome.find_element_by_xpath(
+ '//span[text() = "1"]/ancestor-or-self::td/following-sibling::td/div/span').is_displayed() == True:
+ # print('aaaaaaaaaaaaaaaaaaaaaaaa', chrome.find_element_by_xpath(
+ # '//span[text() = "1"]/ancestor-or-self::td/following-sibling::td/div/span').text)
+ break
+ except:
+ continue
+ print('经销售要货申请单创建完成')
+ # 审批
+ chrome.switch_to.default_content()
+ chrome.switch_to.frame(chrome.find_element_by_xpath('(//iframe[@class="metro-main-frame"])[2]'))
+ sleep(2)
+ chrome.find_element_by_xpath(
+ '//span[text() = "%s"]' % orderno).click()
+ chrome.switch_to.frame(chrome.find_element_by_xpath('//iframe[contains(@name,"awsui-dialog-iframe")]'))
+
+ chrome.find_element_by_xpath('//span[text()="审核通过"]').click()
+ sleep(1)
+ chrome.find_element_by_xpath('//textarea[@placeholder="意见留言"]').send_keys('3333')
+ sleep(1)
+ chrome.find_element_by_xpath('//span[text()="发送"]').click()
+ while True:
+ try:
+ if chrome.find_element_by_xpath('//p[text()="共享任务创建成功"]').is_displayed() == True:
+ # print('订单完成了')
+ break
+ # else:
+ # print('共享任务创建成功的元素没有出现')
+ except:
+ continue
+ time1=match_goods(chrome, orderno,type)
+ # end = time.clock()
+ # print(start, end)
+ print('CPU执行时间: ', time1)
+ imgInfo = getErrorPhoto(chrome)
+ imgName = imgInfo[0]
+ image_path = imgInfo[1]
+ info=orderno+'执行耗时'+time1
+ now = get_time()
+ writeFile_append(pro_path + '/logs/catalina.out', info)
+ send_email1(image_path, info)
+ except Exception as e:
+ print('出现异常')
+ # 将日志写入到文件中单独存储
+ pro_path = get_pro_path()
+ traceback.print_exc()
+ imgInfo = getErrorPhoto(chrome)
+ imgName = imgInfo[0]
+ image_path = imgInfo[1]
+ print(imgName, image_path)
+ print(repr(e))
+ info = repr(e)
+ now = get_time()
+ writeFile_append(pro_path + '/logs/logerror%s.txt' % now, info)
+ # send_email1(image_path, info)
+if __name__ == "__main__":
+ # 创建多线程时, 需要制定该线程执行的任务.name线程名字 target目标函数名
+ # t1 = threading.Thread(target=job,name="job1")
+ # t2 = threading.Thread(target=job,name="job2")
+ # t1.start()
+ # t2.start()
+ # opt = ChromeOptions() # 创建 Chrome 参数对象
+ # # opt.headless = True # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ # opt.headless = False # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ # opt.add_argument('--start-maximized')
+ # opt.add_argument('--window-size=1280x1024')
+ # # chrome = Chrome(options=opt) # 创建无界面对象
+ # chrome = WebChrome(chrome_options=opt) # airtest中的类
+
+ count=1
+ for i in range(count):
+ t = threading.Thread(target=job)
+ t.start()
+ t.join()
+
+def start1():
+ count = 1
+ for i in range(count):
+ t = threading.Thread(target=job)
+ t.start()
+ t.join()
+
+ # print(threading.active_count())
+ # print("程序执行结束.....")
+ # create_salesorder()
diff --git "a/testcase/od/\345\244\232\346\230\216\347\273\206/\350\260\203\346\213\250\345\207\272\345\272\223\345\215\225\345\244\232\346\230\216\347\273\206100.py" "b/testcase/od/\345\244\232\346\230\216\347\273\206/\350\260\203\346\213\250\345\207\272\345\272\223\345\215\225\345\244\232\346\230\216\347\273\206100.py"
new file mode 100644
index 0000000..1bec6bb
--- /dev/null
+++ "b/testcase/od/\345\244\232\346\230\216\347\273\206/\350\260\203\346\213\250\345\207\272\345\272\223\345\215\225\345\244\232\346\230\216\347\273\206100.py"
@@ -0,0 +1,310 @@
+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 mail1 import send_email1
+from public.tools import *
+
+
+
+
+# chrome = webdriver.Chrome(chrome_options=opt)
+
+def job():
+ print("这是一个需要执行的任务。。。。。")
+ create_salesorder1(1)
+ print("当前线程的个数:", threading.active_count())
+ time.sleep(1)
+ print("当前线程的信息:", threading.current_thread())
+def add_goods(goodsname,chrome):
+ chrome.find_element_by_xpath(
+ '//input[@placeholder="模糊检索:商品编码,商品全称,规格型号,主计量单位,采购计量单位,厂家物料编码,存储条件,存储条件说明,生产企业编码,行类型,件包数,产品备注,产品描述,商品性质,是否免备案"]').send_keys(
+ goodsname)
+ chrome.find_element_by_xpath(
+ '//input[@placeholder="模糊检索:商品编码,商品全称,规格型号,主计量单位,采购计量单位,厂家物料编码,存储条件,存储条件说明,生产企业编码,行类型,件包数,产品备注,产品描述,商品性质,是否免备案"]').send_keys(
+ Keys.ENTER)
+ #获取页数
+ # pagecount=chrome.find_element_by_xpath('(// li[ @class ="number"])[16]').text
+ pagecount=10
+ for i in range(int(pagecount)):
+ sleep(1)
+ chrome.find_element_by_xpath(
+ '//th[@class="el-table_18_column_144 multiple-column el-table-column--selection is-leaf headerCellClassName el-table__cell"]/div/label/span/span').click()
+ #翻页
+ chrome.find_element_by_xpath('(//button[@class="btn-next is-last"])[6]').click()
+ sleep(2)
+
+
+def create_salesorder1(type=1):
+ import time
+ start = time.clock()
+ # caps = DesiredCapabilities().CHROME
+ # caps["pageLoadStrategy"] = "normal" # complete
+ # caps["pageLoadStrategy"] = "eager" # interactive
+ # caps["pageLoadStrategy"] = "none"
+ # chrome = webdriver.Chrome(desired_capabilities=caps)
+ opt = ChromeOptions() # 创建 Chrome 参数对象
+ # opt.headless = True # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ opt.headless = False # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ opt.add_argument('--start-maximized')
+ opt.add_argument('--window-size=1280x1024')
+ # chrome = Chrome(options=opt) # 创建无界面对象
+ # chrome = WebChrome(chrome_options=opt)
+ chrome = WebChrome(chrome_options=opt)
+ # chrome=webdriver.Chrome()
+ chrome.implicitly_wait(20)
+ chrome.get("http://10.17.65.200:8088/portal/")
+ # chrome.get("http://10.17.65.207:8088/uat/r/w")
+ sleep(2)
+ chrome.implicitly_wait(30)
+ # chrome.maximize_window()
+ chrome.find_element_by_id('input1').clear()
+ chrome.find_element_by_id('input1').send_keys('admin')
+ chrome.find_element_by_id('input2').clear()
+ chrome.find_element_by_id('input2').send_keys('Gyxc1234')
+ 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
+ # 切换所属公司
+ chrome.find_element_by_class_name('changeCom').click()
+ sleep(1)
+ chrome.find_element_by_xpath('//span[text()="国药集团北京医疗器械有限公司"]/following-sibling::button').click()
+ sleep(1)
+ chrome.find_element_by_xpath('// button[text() = "确定"]').click()
+ sleep(1)
+ allot_link = chrome.find_element_by_xpath('//span[text()="调拨出库单"]')
+ chrome.execute_script("arguments[0].click();", allot_link)
+ chrome.switch_to.frame(chrome.find_element_by_xpath('(//iframe[@class="metro-main-frame"])[2]'))
+ sleep(4)
+ 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")]'))
+ #获取调拨出库单号
+
+ orderno=chrome.find_element_by_xpath('//div[text() = "调拨出库订单号 "]/following-sibling::div/span').text
+ print(orderno)
+ # chrome.switch_to.default_content()
+ sleep(4)
+ # while True:
+ # try:
+ # if chrome.find_element_by_xpath('//div[text()="订单公司名称 "]').is_displayed():
+ # print(chrome.find_element_by_xpath('//div[text()="订单公司名称 "]').text)
+ # break
+ # except:
+ # continue
+ print(chrome.find_element_by_xpath('//div[text()="公司名称 "]').text)
+
+
+ sleep(2)
+ 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('国药集团北京')
+ chrome.find_element_by_xpath('//input[@placeholder="模糊检索:公司名称,公司编码"]').send_keys(Keys.ENTER)
+ sleep(2)
+ chrome.find_element_by_xpath('(//span[@class="el-radio__inner"])[1]').click()
+
+ chrome.find_element_by_xpath('//span[@class="ensureBtn"]/button').click()
+ chrome.find_element_by_xpath('//button[@class="el-button el-button--primary el-button--mini"]').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="模糊检索:仓库编码,仓库名称,是否传WMS,所属公司名称"]').send_keys('北京强生非')
+ # chrome.find_element_by_xpath('//input[@placeholder="模糊检索:仓库编码,仓库名称,是否传WMS,所属公司名称"]').send_keys(Keys.ENTER)
+ # # chrome.find_element_by_xpath('//span/input[@type="radio" and @value="03105272b49986351ef7eb2930b5454de"]').click()
+ # btn_div= chrome.find_element_by_xpath('//span/input[@type="radio" and @value="03105272b49986351ef7eb2930b5454de"]')
+ # chrome.execute_script("arguments[0].click();", btn_div)
+ # chrome.find_element_by_xpath('(//button[@class="el-button el-button--primary el-button--default"])[3]').click()
+ # 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"])[4]').click()
+ #业务员名称
+ sleep(1)
+ 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('杨春刚')
+ chrome.find_element_by_xpath('//input[@placeholder="模糊检索:业务员名称,业务员编码,部门名称,部门编码,部门类型"]').send_keys(Keys.ENTER)
+ chrome.find_element_by_xpath('(//div[text()="杨春刚"])[3]/ancestor-or-self::td/preceding-sibling::td/div/label/span/span').click()
+ chrome.find_element_by_xpath('(//span[@class="ensureBtn"]/button[1])[2]').click()
+ #仓库信息页签
+ 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="模糊检索:调拨出库仓库名称,调拨出库仓库编码,是否WMS仓"]').send_keys('北京强生非')
+ chrome.find_element_by_xpath('//input[@placeholder="模糊检索:调拨出库仓库名称,调拨出库仓库编码,是否WMS仓"]').send_keys(Keys.ENTER)
+ # chrome.find_element_by_xpath('//span/input[@type="radio" and @value="03105272b49986351ef7eb2930b5454de"]').click()
+ btn_div= chrome.find_element_by_xpath('//span/input[@type="radio" and @value="08374712eb9413253c6281062de2ab877"]')
+ chrome.execute_script("arguments[0].click();", btn_div)
+ chrome.find_element_by_xpath('(//span[@class="ensureBtn"])[3]/button').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="模糊检索:调拨入库仓库名称,调拨入库仓库编码,是否WMS"]').send_keys('北京公司-宁波仓')
+ chrome.find_element_by_xpath('//input[@placeholder="模糊检索:调拨入库仓库名称,调拨入库仓库编码,是否WMS"]').send_keys(Keys.ENTER)
+ # chrome.find_element_by_xpath('//span/input[@type="radio" and @value="03105272b49986351ef7eb2930b5454de"]').click()
+ btn_div = chrome.find_element_by_xpath('//span/input[@type="radio" and @value="0e455e227177d35f275908320e3e32fe9"]')
+ chrome.execute_script("arguments[0].click();", btn_div)
+ chrome.find_element_by_xpath('(//span[@class="ensureBtn"])[4]/button').click()
+
+ # 子表信息录入
+ chrome.find_element_by_xpath('//div[text()="主体信息"]').click()
+ # chrome.find_element_by_xpath('//span[text()="添加商品"]').click()
+ # 点击添加商品弹出添加商品子窗口
+ for i in range(1):
+ chrome.find_element_by_xpath('//span[text()="添加商品"]').click()
+ add_goods('PTCA',chrome)
+ chrome.find_element_by_xpath('(//div[@class="el-dialog__body"]/div[2]/span/button[1]/span)[5]').click()
+ sleep(10)
+
+ # chrome.find_element_by_xpath(
+ # '//input[@placeholder="模糊检索:商品编码,商品全称,规格型号,主计量单位,采购计量单位,厂家物料编码,存储条件,存储条件说明,生产企业编码,行类型,件包数,产品备注,产品描述,商品性质,是否免备案"]').send_keys(
+ # '10006179')
+ # chrome.find_element_by_xpath(
+ # '//input[@placeholder="模糊检索:商品编码,商品全称,规格型号,主计量单位,采购计量单位,厂家物料编码,存储条件,存储条件说明,生产企业编码,行类型,件包数,产品备注,产品描述,商品性质,是否免备案"]').send_keys(
+ # Keys.ENTER)
+ # sleep(1)
+ # chrome.find_element_by_xpath('(//span[@class="el-checkbox__inner"])[4]').click()
+ # chrome.find_element_by_xpath('(//div[@class="el-dialog__body"]/div[2]/span/button[1]/span)[5]').click()
+ sleep(6)
+ for i in range(1, 101):
+ element=chrome.find_element_by_xpath('(//td[@colid="col_108"])[%s]'%i)
+ element.click()
+ sleep(2)
+ # element.send_keys("1")
+ # chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='1'")
+ chrome.find_element_by_class_name('awsui-input-number-right').send_keys('1')
+ sleep(2)
+ #滚动条右拉
+ # document.getElementsByClassName('vxe-table--footer-wrapper body--wrapper')[0].scrollLeft = 5000
+ chrome.execute_script("document.getElementsByClassName('vxe-table--footer-wrapper body--wrapper')[0].scrollLeft = 2000");
+ # element = chrome.find_element_by_xpath('//td[@colid="col_197"]')
+ # element.click()
+ # sleep(6)
+ # chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='8'")
+ # sleep(2)
+ # element = chrome.find_element_by_xpath('//td[@colid="col_198"]')
+ # element.click()
+ # sleep(6)
+ # chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='8'")
+ # sleep(2)
+ # lock = threading.Lock()
+ # lock.acquire()
+ #方案一============================开始
+ if type==1:
+ import datetime
+ now = datetime.datetime.now()
+ one_minutes_later = now + datetime.timedelta(minutes=1)
+ now = now.strftime('%Y-%m-%d %H:%M')
+ one_minutes_later = one_minutes_later.strftime('%Y-%m-%d %H:%M')
+ # print('bbbbbbbb'+one_minutes_later)
+ while True:
+ now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M')
+ # print('变化的时间' + now)
+ if now == one_minutes_later:
+ print('时间到了')
+ start = time.clock()
+ chrome.find_element_by_xpath('//span[text()="提交"]').click()
+ break
+ # 方案一============================结束
+ #方案二===============开始
+ if type==2:
+ m=get_time_m() #当前时间的分钟
+ m1=get_submit_time(m)#计划提交时间的分钟
+ print('调拨计划提交时间',m1)
+ while True:
+ m2=get_time_m() #循环获取当前的分
+ # sleep(30)
+ if (m2==m1):
+ start = time.clock()
+ chrome.find_element_by_xpath('//span[text()="提交"]').click()
+ break
+ #方案二===============结束
+ while True:
+ try:
+ if chrome.find_element_by_xpath('//p[text()="共享任务创建成功"]').is_displayed() == True:
+ # print('订单完成了')
+ break
+ except:
+ continue
+ # lock.release()
+ # sleep(5)
+ # chrome.find_element_by_xpath('//button[@class="el-button el-button--primary el-button--mini awsui-button awsui-button--primary"]//span[text()="确定"]').click()
+ chrome.switch_to.default_content()
+ chrome.switch_to.frame(chrome.find_element_by_xpath('(//iframe[@class="metro-main-frame"])[2]'))
+ # sleep(20)
+ while True:
+ try:
+ if chrome.find_element_by_xpath('(//span[text()="%s"])[2]'%orderno).is_displayed()==True:
+ print('//span[text()="%s"]'%orderno)
+ break
+ except:
+ continue
+ print('调拨出库单创建完成')
+ end = time.clock()
+ print(start, end)
+ print('CPU执行时间: ', end - start)
+ time1=end - start
+ imgInfo = getErrorPhoto(chrome)
+ imgName = imgInfo[0]
+ image_path = imgInfo[1]
+ info=orderno+',耗时'+str(time1)
+ now = get_time()
+ pro_path = get_pro_path()
+ writeFile_append(pro_path + '/logs/catalina.out', info)
+ send_email1(image_path, info)
+if __name__ == "__main__":
+ # 创建多线程时, 需要制定该线程执行的任务.name线程名字 target目标函数名
+ # t1 = threading.Thread(target=job,name="job1")
+ # t2 = threading.Thread(target=job,name="job2")
+ # t1.start()
+ # t2.start()
+ # opt = ChromeOptions() # 创建 Chrome 参数对象
+ # # opt.headless = True # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ # opt.headless = False # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ # opt.add_argument('--start-maximized')
+ # opt.add_argument('--window-size=1280x1024')
+ # # chrome = Chrome(options=opt) # 创建无界面对象
+ # chrome = WebChrome(chrome_options=opt) # airtest中的类
+ pro_path = get_pro_path()
+
+ try:
+ for i in range(1):
+ t = threading.Thread(target=job)
+ t.start()
+ # t.join()
+ except Exception as e:
+ print('出现异常')
+ # 将日志写入到文件中单独存储
+ pro_path = get_pro_path()
+ traceback.print_exc()
+ # imgInfo = getErrorPhoto(chrome)
+ # imgName = imgInfo[0]
+ # image_path = imgInfo[1]
+ # print(imgName, image_path)
+ print(repr(e))
+ info = repr(e)
+ now = get_time()
+ writeFile_append(pro_path + '/logs/logerror%s.txt' % now, info)
+ # send_email1(image_path, info)
+
+
+ # print(threading.active_count())
+ # print("程序执行结束.....")
+ # create_salesorder()
diff --git "a/testcase/od/\345\244\232\346\230\216\347\273\206/\351\224\200\345\224\256\350\256\242\345\215\225_\345\244\232\346\230\216\347\273\206.py" "b/testcase/od/\345\244\232\346\230\216\347\273\206/\351\224\200\345\224\256\350\256\242\345\215\225_\345\244\232\346\230\216\347\273\206.py"
new file mode 100644
index 0000000..e0e52f2
--- /dev/null
+++ "b/testcase/od/\345\244\232\346\230\216\347\273\206/\351\224\200\345\224\256\350\256\242\345\215\225_\345\244\232\346\230\216\347\273\206.py"
@@ -0,0 +1,271 @@
+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 mail1 import send_email1
+from public.tools import *
+
+
+
+
+# chrome = webdriver.Chrome(chrome_options=opt)
+
+def job():
+ print("这是一个需要执行的任务。。。。。")
+ create_salesorder()
+ print("当前线程的个数:", threading.active_count())
+ time.sleep(1)
+ print("当前线程的信息:", threading.current_thread())
+
+
+def create_salesorder(type=1):
+ try:
+ import time
+ pro_path = get_pro_path()
+ start = time.clock()
+ # caps = DesiredCapabilities().CHROME
+ # caps["pageLoadStrategy"] = "normal" # complete
+ # caps["pageLoadStrategy"] = "eager" # interactive
+ # caps["pageLoadStrategy"] = "none"
+ # chrome = webdriver.Chrome(desired_capabilities=caps)
+ opt = ChromeOptions() # 创建 Chrome 参数对象
+ # opt.headless = True # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ opt.headless = False # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ opt.add_argument('--start-maximized')
+ opt.add_argument('--window-size=1280x1024')
+ # chrome = Chrome(options=opt) # 创建无界面对象
+ # chrome = WebChrome(chrome_options=opt)
+ chrome = WebChrome(chrome_options=opt)
+ # chrome=webdriver.Chrome()
+ chrome.implicitly_wait(20)
+ chrome.get("http://10.17.65.200:8088/portal/")
+ # chrome.get("http://10.17.65.207:8088/uat/r/w")
+ sleep(2)
+ chrome.implicitly_wait(30)
+ # chrome.maximize_window()
+ chrome.find_element_by_id('input1').clear()
+ chrome.find_element_by_id('input1').send_keys('admin')
+ chrome.find_element_by_id('input2').clear()
+ chrome.find_element_by_id('input2').send_keys('Gyxc1234')
+ 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
+ #切换所属公司
+ chrome.find_element_by_class_name('changeCom').click()
+ sleep(1)
+ chrome.find_element_by_xpath('//span[text()="国药集团北京医疗器械有限公司"]/following-sibling::button').click()
+ sleep(1)
+ chrome.find_element_by_xpath('// button[text() = "确定"]').click()
+ sleep(1)
+ # chrome.find_element_by_xpath('//div[text()="销售管理"]').click()
+ # actions = ActionChains(chrome)
+ # actions.move_to_element(chrome.find_element_by_xpath('//div[text()="销售业务"]')).perform()
+ # chrome.find_element_by_xpath('//span[text()="销售订单"]').click()
+ 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(4)
+ 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")]'))
+ #获取订单号
+
+ orderno=chrome.find_element_by_xpath('//div[text() = "销售订单号 "]/following-sibling::div/span').text
+ print(orderno)
+ # chrome.switch_to.default_content()
+ sleep(4)
+ # while True:
+ # try:
+ # if chrome.find_element_by_xpath('//div[text()="订单公司名称 "]').is_displayed():
+ # print(chrome.find_element_by_xpath('//div[text()="订单公司名称 "]').text)
+ # break
+ # except:
+ # continue
+ print(chrome.find_element_by_xpath('//div[text()="订单公司名称 "]').text)
+
+
+ sleep(2)
+ 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('国药集团北京')
+ chrome.find_element_by_xpath('//input[@placeholder="模糊检索:公司名称,公司编码"]').send_keys(Keys.ENTER)
+ chrome.find_element_by_xpath('(//span[@class="el-radio__inner"])[1]').click()
+
+ chrome.find_element_by_xpath('//span[@class="ensureBtn"]/button').click()
+ chrome.find_element_by_xpath('//button[@class="el-button el-button--primary el-button--mini"]').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="模糊检索:仓库编码,仓库名称,是否传WMS,所属公司名称"]').send_keys('北京强生非')
+ chrome.find_element_by_xpath('//input[@placeholder="模糊检索:仓库编码,仓库名称,是否传WMS,所属公司名称"]').send_keys(Keys.ENTER)
+ # chrome.find_element_by_xpath('//span/input[@type="radio" and @value="03105272b49986351ef7eb2930b5454de"]').click()
+ btn_div= chrome.find_element_by_xpath('//span/input[@type="radio" and @value="03105272b49986351ef7eb2930b5454de"]')
+ chrome.execute_script("arguments[0].click();", btn_div)
+ chrome.find_element_by_xpath('(//button[@class="el-button el-button--primary el-button--default"])[3]').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"])[4]').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('杨春刚')
+ chrome.find_element_by_xpath('//input[@placeholder="模糊检索:业务员名称,业务员编码,业务部门名称,业务部门编码,部门类型编码"]').send_keys(Keys.ENTER)
+ chrome.find_element_by_xpath('(//div[text()="杨春刚"])[3]/ancestor-or-self::td/preceding-sibling::td/div/label/span/span').click()
+ chrome.find_element_by_xpath('(//span[@class="ensureBtn"]/button[1])[4]').click()
+ #其他信息页签
+ chrome.find_element_by_xpath('//div[text()="其他信息"]').click()
+ chrome.find_element_by_xpath('//div[@cid="AWSUI.SwitchButton"]//div/div/div/div/span[1]').click()
+ # 子表信息录入
+ chrome.find_element_by_xpath('//div[text()="主体信息"]').click()
+ chrome.find_element_by_xpath('//span[text()="添加商品"]').click()
+ chrome.find_element_by_xpath(
+ '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,主计量单位,销售计量单位,厂家物料编码,存储条件说明,生产企业编码,供应商编码,行类型,商品性质,批发价,进口/国产/港澳台,件包数,产品备注,是否免备案,产品描述"]').send_keys(
+ 'PTCA')
+ chrome.find_element_by_xpath(
+ '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,主计量单位,销售计量单位,厂家物料编码,存储条件说明,生产企业编码,供应商编码,行类型,商品性质,批发价,进口/国产/港澳台,件包数,产品备注,是否免备案,产品描述"]').send_keys(
+ Keys.ENTER)
+ sleep(1)
+ chrome.find_element_by_xpath('//th[@class="el-table_18_column_229 multiple-column el-table-column--selection is-leaf headerCellClassName el-table__cell"]/div/label/span/span').click()
+ chrome.find_element_by_xpath('(//div[@class="el-dialog__body"]/div[2]/span/button[1]/span)[5]').click()
+ sleep(2)
+ for i in range(1,11):
+ element=chrome.find_element_by_xpath('(//td[@colid="col_177"])[%s]'%i)
+ element.click()
+ sleep(2)
+ # element.send_keys("1")
+ # chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='1'")
+ chrome.find_element_by_class_name('awsui-input-number-right').send_keys('1')
+ # chrome.find_element_by_xpath('//td[@colid="col_177"]/div/div').send_keys('1')
+ sleep(1)
+ chrome.find_element_by_xpath('(//td[@colid="col_178"])[%s]'%i).click()
+ sleep(2)
+
+ #滚动条右拉
+ # document.getElementsByClassName('vxe-table--footer-wrapper body--wrapper')[0].scrollLeft = 5000
+ chrome.execute_script("document.getElementsByClassName('vxe-table--footer-wrapper body--wrapper')[0].scrollLeft = 2000");
+ for i in range(1, 11):
+ element = chrome.find_element_by_xpath('(//td[@colid="col_197"])[%s]'%i)
+ element.click()
+ sleep(2)
+ chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='8'")
+ sleep(2)
+ element = chrome.find_element_by_xpath('(//td[@colid="col_198"])[%s]'%i)
+ element.click()
+ sleep(2)
+ chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='8'")
+ sleep(2)
+ # lock = threading.Lock()
+ # lock.acquire()
+ #方案一============================开始
+ if type==1:
+ import datetime
+ now = datetime.datetime.now()
+ one_minutes_later = now + datetime.timedelta(minutes=1)
+ now = now.strftime('%Y-%m-%d %H:%M')
+ one_minutes_later = one_minutes_later.strftime('%Y-%m-%d %H:%M')
+ # print('bbbbbbbb'+one_minutes_later)
+ while True:
+ now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M')
+ # print('变化的时间' + now)
+ if now == one_minutes_later:
+ print('时间到了')
+ chrome.find_element_by_xpath('//span[text()="提交"]').click()
+ break
+ # 方案一============================结束
+ #方案二===============开始
+ if type==2:
+ m=get_time_m() #当前时间的分钟
+ m1=get_submit_time(m)#计划提交时间的分钟
+ print('销售订单计划提交时间的分钟',m1)
+ while True:
+ m2=get_time_m() #循环获取当前的分
+ # sleep(30)
+ if (m2==m1):
+ chrome.find_element_by_xpath('//span[text()="提交"]').click()
+ break
+ #方案二===============结束
+ # lock.release()
+ sleep(2)
+ # chrome.find_element_by_xpath('//button[@class="el-button el-button--primary el-button--mini awsui-button awsui-button--primary"]//span[text()="确定"]').click()
+ # chrome.switch_to.default_content()
+ # chrome.switch_to.frame(chrome.find_element_by_xpath('(//iframe[@class="metro-main-frame"])[2]'))
+ # sleep(20)
+ while True:
+ try:
+ if chrome.find_element_by_xpath('//span[text()="%s"]'%orderno).is_displayed()==True:
+ print('//span[text()="%s"]'%orderno)
+ break
+ except:
+ continue
+ print('销售订单创建完成')
+ end = time.clock()
+ print(start, end)
+ print('CPU执行时间: ', end - start)
+ imgInfo = getErrorPhoto(chrome)
+ imgName = imgInfo[0]
+ image_path = imgInfo[1]
+ info=orderno+'执行耗时'+str(end - start)
+ now = get_time()
+ writeFile_append(pro_path + '/logs/catalina.out', info)
+ send_email1(image_path, info)
+ except Exception as e:
+ print('出现异常')
+ # 将日志写入到文件中单独存储
+ pro_path = get_pro_path()
+ traceback.print_exc()
+ imgInfo = getErrorPhoto(chrome)
+ imgName = imgInfo[0]
+ image_path = imgInfo[1]
+ print(imgName, image_path)
+ print(repr(e))
+ info = repr(e)
+ now = get_time()
+ writeFile_append(pro_path + '/logs/logerror%s.txt' % now, info)
+ # send_email1(image_path, info)
+if __name__ == "__main__":
+ # 创建多线程时, 需要制定该线程执行的任务.name线程名字 target目标函数名
+ # t1 = threading.Thread(target=job,name="job1")
+ # t2 = threading.Thread(target=job,name="job2")
+ # t1.start()
+ # t2.start()
+ # opt = ChromeOptions() # 创建 Chrome 参数对象
+ # # opt.headless = True # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ # opt.headless = False # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ # opt.add_argument('--start-maximized')
+ # opt.add_argument('--window-size=1280x1024')
+ # # chrome = Chrome(options=opt) # 创建无界面对象
+ # chrome = WebChrome(chrome_options=opt) # airtest中的类
+
+ count=1
+ for i in range(count):
+ t = threading.Thread(target=job)
+ t.start()
+ t.join()
+
+def start1():
+ count = 1
+ for i in range(count):
+ t = threading.Thread(target=job)
+ t.start()
+ t.join()
+
+ # print(threading.active_count())
+ # print("程序执行结束.....")
+ # create_salesorder()
diff --git "a/testcase/od/\345\244\232\346\230\216\347\273\206/\351\224\200\345\224\256\350\256\242\345\215\225_\345\244\232\346\230\216\347\273\206100.py" "b/testcase/od/\345\244\232\346\230\216\347\273\206/\351\224\200\345\224\256\350\256\242\345\215\225_\345\244\232\346\230\216\347\273\206100.py"
new file mode 100644
index 0000000..1596264
--- /dev/null
+++ "b/testcase/od/\345\244\232\346\230\216\347\273\206/\351\224\200\345\224\256\350\256\242\345\215\225_\345\244\232\346\230\216\347\273\206100.py"
@@ -0,0 +1,422 @@
+
+
+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 *
+
+
+
+
+# chrome = webdriver.Chrome(chrome_options=opt)
+
+def job(type=2):
+ print("这是一个需要执行的任务。。。。。")
+ create_salesorder(type)
+ print("当前线程的个数:", threading.active_count())
+ time.sleep(1)
+ print("当前线程的信息:", threading.current_thread())
+def add_goods(goodsname,chrome):
+ sleep(4)
+ chrome.find_element_by_xpath(
+ '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,主计量单位,销售计量单位,厂家物料编码,存储条件说明,生产企业编码,供应商编码,行类型,商品性质,批发价,进口/国产/港澳台,件包数,产品备注,是否免备案,产品描述"]').send_keys(
+ goodsname)
+ sleep(2)
+ chrome.find_element_by_xpath(
+ '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,主计量单位,销售计量单位,厂家物料编码,存储条件说明,生产企业编码,供应商编码,行类型,商品性质,批发价,进口/国产/港澳台,件包数,产品备注,是否免备案,产品描述"]').send_keys(
+ Keys.ENTER)
+ sleep(2)
+ #获取页数
+ # pagecount=chrome.find_element_by_xpath('(// li[ @class ="number"])[16]').text
+ pagecount=10
+ for i in range(int(pagecount)):
+ # chrome.find_element_by_xpath('//span[text()="添加商品"]').click()
+ # chrome.find_element_by_xpath(
+ # '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,主计量单位,销售计量单位,厂家物料编码,存储条件说明,生产企业编码,供应商编码,行类型,商品性质,批发价,进口/国产/港澳台,件包数,产品备注,是否免备案,产品描述"]').send_keys(
+ # goodsname)
+ # chrome.find_element_by_xpath(
+ # '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,主计量单位,销售计量单位,厂家物料编码,存储条件说明,生产企业编码,供应商编码,行类型,商品性质,批发价,进口/国产/港澳台,件包数,产品备注,是否免备案,产品描述"]').send_keys(
+ # Keys.ENTER)
+ sleep(1)
+ chrome.find_element_by_xpath(
+ '//th[@class="el-table_18_column_269 multiple-column el-table-column--selection is-leaf headerCellClassName el-table__cell"]/div/label/span/span').click()
+ #翻页
+ sleep(2)
+ chrome.find_element_by_xpath('(//button[@class="btn-next is-last"])[6]').click()
+
+ #点击确定
+ # chrome.find_element_by_xpath('(//div[@class="el-dialog__body"]/div[2]/span/button[1]/span)[5]').click()
+ sleep(2)
+def create_salesorder(type=1):
+ import time
+ pro_path = get_pro_path()
+ start = time.clock()
+ print('订单开始时间', start)
+ # caps = DesiredCapabilities().CHROME
+ # caps["pageLoadStrategy"] = "normal" # complete
+ # caps["pageLoadStrategy"] = "eager" # interactive
+ # caps["pageLoadStrategy"] = "none"
+ # chrome = webdriver.Chrome(desired_capabilities=caps)
+ opt = ChromeOptions() # 创建 Chrome 参数对象
+ # opt.headless = True # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ opt.headless = False # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ opt.add_argument('--start-maximized')
+ opt.add_argument('--window-size=1280x1024')
+ # chrome = Chrome(options=opt) # 创建无界面对象
+ # chrome = WebChrome(chrome_options=opt)
+ # chrome = WebChrome(chrome_options=opt)
+ chrome=webdriver.Chrome(chrome_options=opt)
+ try:
+
+ chrome.implicitly_wait(20)
+ chrome.get("http://10.17.65.200:8088/portal/")
+ # chrome.get("http://10.17.65.207:8088/uat/r/w")
+ sleep(2)
+ chrome.implicitly_wait(30)
+ # chrome.maximize_window()
+ chrome.find_element_by_id('input1').clear()
+ chrome.find_element_by_id('input1').send_keys('admin')
+ chrome.find_element_by_id('input2').clear()
+ chrome.find_element_by_id('input2').send_keys('Gyxc1234')
+ 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
+ #切换所属公司
+ chrome.find_element_by_class_name('changeCom').click()
+ sleep(1)
+ chrome.find_element_by_xpath('//span[text()="国药集团北京医疗器械有限公司"]/following-sibling::button').click()
+ sleep(1)
+ chrome.find_element_by_xpath('// button[text() = "确定"]').click()
+ sleep(1)
+ # chrome.find_element_by_xpath('//div[text()="销售管理"]').click()
+ # actions = ActionChains(chrome)
+ # actions.move_to_element(chrome.find_element_by_xpath('//div[text()="销售业务"]')).perform()
+ # chrome.find_element_by_xpath('//span[text()="销售订单"]').click()
+ 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(4)
+ 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")]'))
+ #获取订单号
+
+ orderno=chrome.find_element_by_xpath('//div[text() = "销售订单号 "]/following-sibling::div/span').text
+ print(orderno)
+ # chrome.switch_to.default_content()
+ sleep(4)
+ # while True:
+ # try:
+ # if chrome.find_element_by_xpath('//div[text()="订单公司名称 "]').is_displayed():
+ # print(chrome.find_element_by_xpath('//div[text()="订单公司名称 "]').text)
+ # break
+ # except:
+ # continue
+ print(chrome.find_element_by_xpath('//div[text()="订单公司名称 "]').text)
+
+
+ sleep(2)
+ # 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('国药集团北京')
+ # chrome.find_element_by_xpath('//input[@placeholder="模糊检索:公司名称,公司编码"]').send_keys(Keys.ENTER)
+ # chrome.find_element_by_xpath('(//span[@class="el-radio__inner"])[1]').click()
+
+ # chrome.find_element_by_xpath('//span[@class="ensureBtn"]/button').click()
+ # chrome.find_element_by_xpath('//button[@class="el-button el-button--primary el-button--mini"]').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="模糊检索:仓库编码,仓库名称,是否传WMS,所属公司名称"]').send_keys('北京强生非')
+ chrome.find_element_by_xpath('//input[@placeholder="模糊检索:仓库编码,仓库名称,是否传WMS,所属公司名称"]').send_keys(Keys.ENTER)
+ # chrome.find_element_by_xpath('//span/input[@type="radio" and @value="03105272b49986351ef7eb2930b5454de"]').click()
+ btn_div= chrome.find_element_by_xpath('//span/input[@type="radio" and @value="03105272b49986351ef7eb2930b5454de"]')
+ chrome.execute_script("arguments[0].click();", btn_div)
+ 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)
+ #客户名称
+ 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(
+ '1000486')
+ sleep(2)
+ chrome.find_element_by_xpath(
+ '//input[@placeholder="模糊检索:客户编码,客户名称,收货地址号,收货地址信息,公司编码,货币码,税率/税区,客户分类,联系人,联系人电话"]').send_keys(
+ Keys.ENTER)
+ sleep(2)
+ chrome.find_element_by_xpath(
+ '//div[@class="multiple-header number_col" and text()="1000486"]/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"])[4]').click()
+ sleep(2)
+ #业务员名称
+ chrome.find_element_by_xpath(
+ '//div[text()="业务员名称 "]/following-sibling::div/div/div/div/div/div/div/div/span/span/i').click()
+ sleep(2)
+ chrome.find_element_by_xpath('//input[@placeholder="模糊检索:业务员名称,业务员编码,业务部门名称,业务部门编码,部门类型编码"]').send_keys('杨春刚')
+ sleep(2)
+ chrome.find_element_by_xpath('//input[@placeholder="模糊检索:业务员名称,业务员编码,业务部门名称,业务部门编码,部门类型编码"]').send_keys(Keys.ENTER)
+ sleep(2)
+ chrome.find_element_by_xpath('(//div[text()="杨春刚"])[3]/ancestor-or-self::td/preceding-sibling::td/div/label/span/span').click()
+ sleep(2)
+ chrome.find_element_by_xpath('(//span[@class="ensureBtn"]/button[1])[4]').click()
+ #其他信息页签
+ chrome.find_element_by_xpath('//div[text()="其他信息"]').click()
+ sleep(2)
+ chrome.find_element_by_xpath('//div[@cid="AWSUI.SwitchButton"]//div/div/div/div/span[1]').click()
+ # 子表信息录入
+ chrome.find_element_by_xpath('//div[text()="主体信息"]').click()
+
+ # 点击添加商品弹出添加商品子窗口
+ for i in range(1):
+ chrome.find_element_by_xpath('//span[text()="添加商品"]').click()
+ add_goods('PTCA',chrome)
+ chrome.find_element_by_xpath('(//div[@class="el-dialog__body"]/div[2]/span/button[1]/span)[5]').click()
+ sleep(20)
+ # for i in range(1):
+ # chrome.find_element_by_xpath('//span[text()="添加商品"]').click()
+ # add_goods('PTCA', chrome)
+ # chrome.find_element_by_xpath('(//div[@class="el-dialog__body"]/div[2]/span/button[1]/span)[5]').click()
+ # sleep(10)
+
+ # chrome.find_element_by_xpath('//span[text()="添加商品"]').click()
+ # chrome.find_element_by_xpath(
+ # '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,主计量单位,销售计量单位,厂家物料编码,存储条件说明,生产企业编码,供应商编码,行类型,商品性质,批发价,进口/国产/港澳台,件包数,产品备注,是否免备案,产品描述"]').send_keys(
+ # 'PTCA')
+ # chrome.find_element_by_xpath(
+ # '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,主计量单位,销售计量单位,厂家物料编码,存储条件说明,生产企业编码,供应商编码,行类型,商品性质,批发价,进口/国产/港澳台,件包数,产品备注,是否免备案,产品描述"]').send_keys(
+ # Keys.ENTER)
+ # sleep(1)
+ # chrome.find_element_by_xpath('//th[@class="el-table_18_column_229 multiple-column el-table-column--selection is-leaf headerCellClassName el-table__cell"]/div/label/span/span').click()
+ # chrome.find_element_by_xpath('(//div[@class="el-dialog__body"]/div[2]/span/button[1]/span)[5]').click()
+ # sleep(2)
+ # sleep(6)
+ while True:
+ try:
+ chrome.find_element_by_xpath('//div[@class="el-loading-spinner"]').is_displayed()
+ continue
+ except:
+ break
+ for i in range(1,101):
+ sleep(2)
+ element = chrome.find_element_by_xpath('(//td[@colid="col_177"])[%s]'%i)
+ chrome.execute_script("arguments[0].click();", element)
+
+ # element=chrome.find_element_by_xpath('(//td[@colid="col_177"])[%s]'%i)
+ # element.click()
+ # element=chrome.find_element_by_xpath('//span[@class="form-grid-check-num" and text()="%s"]/ancestor::td/following-sibling::td[5]'%i)
+ # element.click()
+ sleep(2)
+ # element.send_keys("1")
+ # chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='1'")
+ chrome.find_element_by_class_name('awsui-input-number-right').send_keys('1')
+ # chrome.find_element_by_xpath('//td[@colid="col_177"]/div/div').send_keys('1')
+ sleep(2)
+ chrome.find_element_by_xpath('(//td[@colid="col_178"])[%s]'%i).click()
+ # element = chrome.find_element_by_xpath('(//td[@colid="col_178"])[%s]' % i)
+ # chrome.execute_script("arguments[0].click();", element)
+ # element = chrome.find_element_by_xpath(
+ # '//span[@class="form-grid-check-num" and text()="%s"]/ancestor::td/following-sibling::td[6]' % i)
+ # element.click()
+ sleep(2)
+ chrome.execute_script(
+ "document.getElementsByClassName('vxe-table--body-wrapper body--wrapper')[0].scrollTop = %s*30;" % i)
+ sleep(2)
+
+ # print('200条输入完毕')
+ # chrome.find_element_by_xpath('//button[@ class="vxe-pager--next-btn" and @title="下一页"]').click()
+ # # sleep(2)
+ # chrome.execute_script(
+ # "document.getElementsByClassName('vxe-table--body-wrapper body--wrapper')[0].scrollTop=0;")
+
+ #输入第二页数据
+ # for i in range(1,51):
+ #
+ # # element = chrome.find_element_by_xpath('(//td[@colid="col_177"])[%s]'%i)
+ # # chrome.execute_script("arguments[0].click();", element)
+ #
+ # # element=chrome.find_element_by_xpath('(//td[@colid="col_177"])[%s]'%i)
+ # # element.click()
+ # element=chrome.find_element_by_xpath('//span[@class="form-grid-check-num" and text()="%s"]/ancestor::td/following-sibling::td[5]'%i)
+ # element.click()
+ # sleep(2)
+ # # element.send_keys("1")
+ # # chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='1'")
+ # chrome.find_element_by_class_name('awsui-input-number-right').send_keys('1')
+ # # chrome.find_element_by_xpath('//td[@colid="col_177"]/div/div').send_keys('1')
+ # sleep(2)
+ # # chrome.find_element_by_xpath('(//td[@colid="col_178"])[%s]'%i).click()
+ # # element = chrome.find_element_by_xpath('(//td[@colid="col_178"])[%s]' % i)
+ # # chrome.execute_script("arguments[0].click();", element)
+ # element = chrome.find_element_by_xpath(
+ # '//span[@class="form-grid-check-num" and text()="%s"]/ancestor::td/following-sibling::td[6]' % i)
+ # element.click()
+ # sleep(2)
+ print('ok')
+
+ #滚动条右拉
+ # document.getElementsByClassName('vxe-table--footer-wrapper body--wrapper')[0].scrollLeft = 5000
+ # chrome.execute_script("document.getElementsByClassName('vxe-table--footer-wrapper body--wrapper')[0].scrollLeft = 2000;")
+ # sleep(1)
+ #右侧滚动条向上
+ # chrome.execute_script("document.getElementsByClassName('vxe-table--body-wrapper body--wrapper')[0].scrollTop=0;")
+ # for i in range(1,201):
+ # element = chrome.find_element_by_xpath('(//td[@colid="col_197"])[%s]'%i)
+ # element.click()
+ # sleep(2)
+ # chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='8'")
+ # sleep(2)
+ # element = chrome.find_element_by_xpath('(//td[@colid="col_198"])[%s]'%i)
+ # element.click()
+ # sleep(2)
+ # chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='8'")
+ # sleep(2)
+ # lock = threading.Lock()
+ # lock.acquire()
+ # start = time.clock()
+ #方案一============================开始
+ if type==1:
+ import datetime
+ now = datetime.datetime.now()
+ one_minutes_later = now + datetime.timedelta(minutes=1)
+ now = now.strftime('%Y-%m-%d %H:%M')
+ one_minutes_later = one_minutes_later.strftime('%Y-%m-%d %H:%M')
+ # print('bbbbbbbb'+one_minutes_later)
+ while True:
+ now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M')
+ # print('变化的时间' + now)
+ if now == one_minutes_later:
+ print('时间到了')
+ # global start
+ start = time.clock()
+ chrome.find_element_by_xpath('//span[text()="提交"]').click()
+ break
+ # 方案一============================结束
+ #方案二===============开始
+ if type==2:
+ m=get_time_m() #当前时间的分钟
+ m1=get_submit_time1(m)#计划提交时间的分钟
+ print('销售订单计划提交时间的分钟',m1)
+ while True:
+ m2=get_time_m() #循环获取当前的分
+ # sleep(30)
+ if (m2==m1):
+ # chrome.find_element_by_xpath('//span[text()="保存"]').click()
+ start = time.clock()
+ chrome.find_element_by_xpath('//span[text()="提交"]').click()
+ break
+ #方案二===============结束
+ chrome.implicitly_wait(0)
+ while True:
+ try:
+ if chrome.find_element_by_xpath('//button[@class="el-button el-button--primary el-button--mini awsui-button awsui-button--primary"]').is_displayed()==True:
+ chrome.find_element_by_xpath('//button[@class="el-button el-button--primary el-button--mini awsui-button awsui-button--primary"]').click()
+ break
+
+ except:
+ continue
+ while True:
+ try:
+ if chrome.find_element_by_xpath('//p[text()="办理成功"]').is_displayed()==True:
+ # print('订单完成了')
+ break
+ # else:
+ # print('共享任务创建成功的元素没有出现')
+ except:
+ continue
+ # lock.release()
+ # sleep(2)
+ # chrome.find_element_by_xpath('//button[@class="el-button el-button--primary el-button--mini awsui-button awsui-button--primary"]//span[text()="确定"]').click()
+ chrome.switch_to.default_content()
+ chrome.switch_to.frame(chrome.find_element_by_xpath('(//iframe[@class="metro-main-frame"])[2]'))
+ # sleep(60)
+ # while True:
+ # try:
+ # # if chrome.find_element_by_xpath('(//span[text()="%s"])[2]'%orderno).is_displayed()==True:
+ # if chrome.find_element_by_xpath(
+ # '//span[text() = "1"]/ancestor-or-self::td/following-sibling::td/div/span').is_displayed() == True:
+ # # print('aaaaaaaaaaaaaaaaaaaaaaaa', chrome.find_element_by_xpath(
+ # # '//span[text() = "1"]/ancestor-or-self::td/following-sibling::td/div/span').text)
+ # break
+ # except:
+ # continue
+ chrome.implicitly_wait(30)
+ print('销售订单创建完成')
+ end = time.clock()
+ print(start, end)
+ imgInfo = getErrorPhoto(chrome)
+ imgName = imgInfo[0]
+ image_path = imgInfo[1]
+ info=orderno+'执行耗时'+str(end - start)
+ now = get_time()
+ writeFile_append(pro_path + '/logs/catalina.out', info)
+ send_email1(image_path, info)
+ print('CPU执行时间: ', end - start)
+ except Exception as e:
+ print('出现异常')
+ # 将日志写入到文件中单独存储
+ pro_path = get_pro_path()
+ traceback.print_exc()
+ imgInfo = getErrorPhoto(chrome)
+ imgName = imgInfo[0]
+ image_path = imgInfo[1]
+ print(imgName, image_path)
+ print(repr(e))
+ info = repr(e)
+ now = get_time()
+ writeFile_append(pro_path + '/logs/logerror%s.txt' % now, info)
+ # send_email1(image_path, info)
+if __name__ == "__main__":
+ # 创建多线程时, 需要制定该线程执行的任务.name线程名字 target目标函数名
+ # t1 = threading.Thread(target=job,name="job1")
+ # t2 = threading.Thread(target=job,name="job2")
+ # t1.start()
+ # t2.start()
+ # opt = ChromeOptions() # 创建 Chrome 参数对象
+ # # opt.headless = True # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ # opt.headless = False # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ # opt.add_argument('--start-maximized')
+ # opt.add_argument('--window-size=1280x1024')
+ # # chrome = Chrome(options=opt) # 创建无界面对象
+ # chrome = WebChrome(chrome_options=opt) # airtest中的类
+
+ count=10
+ for i in range(count):
+ t = threading.Thread(target=job)
+ t.start()
+ t.join()
+
+def start1():
+ count = 1
+ for i in range(count):
+ t = threading.Thread(target=job)
+ t.start()
+ t.join()
+
+ # print(threading.active_count())
+ # print("程序执行结束.....")
+ # create_salesorder()
diff --git "a/testcase/od/\345\244\232\346\230\216\347\273\206/\351\224\200\345\224\256\350\256\242\345\215\225_\345\244\232\346\230\216\347\273\206300.py" "b/testcase/od/\345\244\232\346\230\216\347\273\206/\351\224\200\345\224\256\350\256\242\345\215\225_\345\244\232\346\230\216\347\273\206300.py"
new file mode 100644
index 0000000..8afe7a5
--- /dev/null
+++ "b/testcase/od/\345\244\232\346\230\216\347\273\206/\351\224\200\345\224\256\350\256\242\345\215\225_\345\244\232\346\230\216\347\273\206300.py"
@@ -0,0 +1,387 @@
+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 mail1 import send_email1
+from public.tools import *
+
+
+
+
+# chrome = webdriver.Chrome(chrome_options=opt)
+
+def job():
+ print("这是一个需要执行的任务。。。。。")
+ create_salesorder()
+ print("当前线程的个数:", threading.active_count())
+ time.sleep(1)
+ print("当前线程的信息:", threading.current_thread())
+def add_goods(goodsname,chrome):
+ chrome.find_element_by_xpath(
+ '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,主计量单位,销售计量单位,厂家物料编码,存储条件说明,生产企业编码,供应商编码,行类型,商品性质,批发价,进口/国产/港澳台,件包数,产品备注,是否免备案,产品描述"]').send_keys(
+ goodsname)
+ chrome.find_element_by_xpath(
+ '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,主计量单位,销售计量单位,厂家物料编码,存储条件说明,生产企业编码,供应商编码,行类型,商品性质,批发价,进口/国产/港澳台,件包数,产品备注,是否免备案,产品描述"]').send_keys(
+ Keys.ENTER)
+ #获取页数
+ # pagecount=chrome.find_element_by_xpath('(// li[ @class ="number"])[16]').text
+ pagecount=10
+ for i in range(int(pagecount)):
+ # chrome.find_element_by_xpath('//span[text()="添加商品"]').click()
+ # chrome.find_element_by_xpath(
+ # '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,主计量单位,销售计量单位,厂家物料编码,存储条件说明,生产企业编码,供应商编码,行类型,商品性质,批发价,进口/国产/港澳台,件包数,产品备注,是否免备案,产品描述"]').send_keys(
+ # goodsname)
+ # chrome.find_element_by_xpath(
+ # '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,主计量单位,销售计量单位,厂家物料编码,存储条件说明,生产企业编码,供应商编码,行类型,商品性质,批发价,进口/国产/港澳台,件包数,产品备注,是否免备案,产品描述"]').send_keys(
+ # Keys.ENTER)
+ sleep(1)
+ chrome.find_element_by_xpath(
+ '//th[@class="el-table_18_column_269 multiple-column el-table-column--selection is-leaf headerCellClassName el-table__cell"]/div/label/span/span').click()
+ #翻页
+ chrome.find_element_by_xpath('(//button[@class="btn-next is-last"])[6]').click()
+
+ #点击确定
+ # chrome.find_element_by_xpath('(//div[@class="el-dialog__body"]/div[2]/span/button[1]/span)[5]').click()
+ sleep(2)
+def create_salesorder(type=1):
+ try:
+ import time
+ pro_path = get_pro_path()
+ # start = time.clock()
+ # caps = DesiredCapabilities().CHROME
+ # caps["pageLoadStrategy"] = "normal" # complete
+ # caps["pageLoadStrategy"] = "eager" # interactive
+ # caps["pageLoadStrategy"] = "none"
+ # chrome = webdriver.Chrome(desired_capabilities=caps)
+ opt = ChromeOptions() # 创建 Chrome 参数对象
+ # opt.headless = True # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ opt.headless = False # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ opt.add_argument('--start-maximized')
+ opt.add_argument('--window-size=1280x1024')
+ # chrome = Chrome(options=opt) # 创建无界面对象
+ # chrome = WebChrome(chrome_options=opt)
+ chrome = WebChrome(chrome_options=opt)
+ # chrome=webdriver.Chrome()
+ chrome.implicitly_wait(20)
+ chrome.get("http://10.17.65.200:8088/portal/")
+ # chrome.get("http://10.17.65.207:8088/uat/r/w")
+ sleep(2)
+ chrome.implicitly_wait(30)
+ # chrome.maximize_window()
+ chrome.find_element_by_id('input1').clear()
+ chrome.find_element_by_id('input1').send_keys('admin')
+ chrome.find_element_by_id('input2').clear()
+ chrome.find_element_by_id('input2').send_keys('Gyxc1234')
+ 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
+ #切换所属公司
+ chrome.find_element_by_class_name('changeCom').click()
+ sleep(1)
+ chrome.find_element_by_xpath('//span[text()="国药集团北京医疗器械有限公司"]/following-sibling::button').click()
+ sleep(1)
+ chrome.find_element_by_xpath('// button[text() = "确定"]').click()
+ sleep(1)
+ # chrome.find_element_by_xpath('//div[text()="销售管理"]').click()
+ # actions = ActionChains(chrome)
+ # actions.move_to_element(chrome.find_element_by_xpath('//div[text()="销售业务"]')).perform()
+ # chrome.find_element_by_xpath('//span[text()="销售订单"]').click()
+ 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(4)
+ 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")]'))
+ #获取订单号
+
+ orderno=chrome.find_element_by_xpath('//div[text() = "销售订单号 "]/following-sibling::div/span').text
+ print(orderno)
+ # chrome.switch_to.default_content()
+ sleep(4)
+ # while True:
+ # try:
+ # if chrome.find_element_by_xpath('//div[text()="订单公司名称 "]').is_displayed():
+ # print(chrome.find_element_by_xpath('//div[text()="订单公司名称 "]').text)
+ # break
+ # except:
+ # continue
+ print(chrome.find_element_by_xpath('//div[text()="订单公司名称 "]').text)
+
+
+ sleep(2)
+ # 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('国药集团北京')
+ # chrome.find_element_by_xpath('//input[@placeholder="模糊检索:公司名称,公司编码"]').send_keys(Keys.ENTER)
+ # chrome.find_element_by_xpath('(//span[@class="el-radio__inner"])[1]').click()
+
+ # chrome.find_element_by_xpath('//span[@class="ensureBtn"]/button').click()
+ # chrome.find_element_by_xpath('//button[@class="el-button el-button--primary el-button--mini"]').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="模糊检索:仓库编码,仓库名称,是否传WMS,所属公司名称"]').send_keys('北京强生非')
+ chrome.find_element_by_xpath('//input[@placeholder="模糊检索:仓库编码,仓库名称,是否传WMS,所属公司名称"]').send_keys(Keys.ENTER)
+ # chrome.find_element_by_xpath('//span/input[@type="radio" and @value="03105272b49986351ef7eb2930b5454de"]').click()
+ btn_div= chrome.find_element_by_xpath('//span/input[@type="radio" and @value="03105272b49986351ef7eb2930b5454de"]')
+ chrome.execute_script("arguments[0].click();", btn_div)
+ 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()
+ #客户名称
+ 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(
+ '1000486')
+ chrome.find_element_by_xpath(
+ '//input[@placeholder="模糊检索:客户编码,客户名称,收货地址号,收货地址信息,公司编码,货币码,税率/税区,客户分类,联系人,联系人电话"]').send_keys(
+ Keys.ENTER)
+ chrome.find_element_by_xpath(
+ '//div[@class="multiple-header number_col" and text()="1000486"]/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"])[4]').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('杨春刚')
+ chrome.find_element_by_xpath('//input[@placeholder="模糊检索:业务员名称,业务员编码,业务部门名称,业务部门编码,部门类型编码"]').send_keys(Keys.ENTER)
+ chrome.find_element_by_xpath('(//div[text()="杨春刚"])[3]/ancestor-or-self::td/preceding-sibling::td/div/label/span/span').click()
+ chrome.find_element_by_xpath('(//span[@class="ensureBtn"]/button[1])[4]').click()
+ #其他信息页签
+ chrome.find_element_by_xpath('//div[text()="其他信息"]').click()
+ chrome.find_element_by_xpath('//div[@cid="AWSUI.SwitchButton"]//div/div/div/div/span[1]').click()
+ # 子表信息录入
+ chrome.find_element_by_xpath('//div[text()="主体信息"]').click()
+
+ # 点击添加商品弹出添加商品子窗口
+ for i in range(3):
+ chrome.find_element_by_xpath('//span[text()="添加商品"]').click()
+ add_goods('PTCA',chrome)
+ chrome.find_element_by_xpath('(//div[@class="el-dialog__body"]/div[2]/span/button[1]/span)[5]').click()
+ sleep(20)
+ # for i in range(1):
+ # chrome.find_element_by_xpath('//span[text()="添加商品"]').click()
+ # add_goods('PTCA', chrome)
+ # chrome.find_element_by_xpath('(//div[@class="el-dialog__body"]/div[2]/span/button[1]/span)[5]').click()
+ # sleep(10)
+
+ # chrome.find_element_by_xpath('//span[text()="添加商品"]').click()
+ # chrome.find_element_by_xpath(
+ # '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,主计量单位,销售计量单位,厂家物料编码,存储条件说明,生产企业编码,供应商编码,行类型,商品性质,批发价,进口/国产/港澳台,件包数,产品备注,是否免备案,产品描述"]').send_keys(
+ # 'PTCA')
+ # chrome.find_element_by_xpath(
+ # '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,主计量单位,销售计量单位,厂家物料编码,存储条件说明,生产企业编码,供应商编码,行类型,商品性质,批发价,进口/国产/港澳台,件包数,产品备注,是否免备案,产品描述"]').send_keys(
+ # Keys.ENTER)
+ # sleep(1)
+ # chrome.find_element_by_xpath('//th[@class="el-table_18_column_229 multiple-column el-table-column--selection is-leaf headerCellClassName el-table__cell"]/div/label/span/span').click()
+ # chrome.find_element_by_xpath('(//div[@class="el-dialog__body"]/div[2]/span/button[1]/span)[5]').click()
+ # sleep(2)
+ sleep(6)
+ for i in range(1,201):
+
+ # element = chrome.find_element_by_xpath('(//td[@colid="col_177"])[%s]'%i)
+ # chrome.execute_script("arguments[0].click();", element)
+
+ # element=chrome.find_element_by_xpath('(//td[@colid="col_177"])[%s]'%i)
+ # element.click()
+ element=chrome.find_element_by_xpath('//span[@class="form-grid-check-num" and text()="%s"]/ancestor::td/following-sibling::td[5]'%i)
+ element.click()
+ sleep(1)
+ # element.send_keys("1")
+ # chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='1'")
+ chrome.find_element_by_class_name('awsui-input-number-right').send_keys('1')
+ # chrome.find_element_by_xpath('//td[@colid="col_177"]/div/div').send_keys('1')
+ sleep(1)
+ # chrome.find_element_by_xpath('(//td[@colid="col_178"])[%s]'%i).click()
+ # element = chrome.find_element_by_xpath('(//td[@colid="col_178"])[%s]' % i)
+ # chrome.execute_script("arguments[0].click();", element)
+ element = chrome.find_element_by_xpath(
+ '//span[@class="form-grid-check-num" and text()="%s"]/ancestor::td/following-sibling::td[6]' % i)
+ element.click()
+ sleep(2)
+
+ print('200条输入完毕')
+ chrome.find_element_by_xpath('//button[@ class="vxe-pager--next-btn" and @title="下一页"]').click()
+ sleep(15)
+ chrome.execute_script(
+ "document.getElementsByClassName('vxe-table--body-wrapper body--wrapper')[0].scrollTop=0;")
+
+ #输入第二页数据
+ for i in range(1,101):
+
+ # element = chrome.find_element_by_xpath('(//td[@colid="col_177"])[%s]'%i)
+ # chrome.execute_script("arguments[0].click();", element)
+
+ # element=chrome.find_element_by_xpath('(//td[@colid="col_177"])[%s]'%i)
+ # element.click()
+ element=chrome.find_element_by_xpath('//span[@class="form-grid-check-num" and text()="%s"]/ancestor::td/following-sibling::td[5]'%i)
+ element.click()
+ sleep(1)
+ # element.send_keys("1")
+ # chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='1'")
+ chrome.find_element_by_class_name('awsui-input-number-right').send_keys('1')
+ # chrome.find_element_by_xpath('//td[@colid="col_177"]/div/div').send_keys('1')
+ sleep(1)
+ # chrome.find_element_by_xpath('(//td[@colid="col_178"])[%s]'%i).click()
+ # element = chrome.find_element_by_xpath('(//td[@colid="col_178"])[%s]' % i)
+ # chrome.execute_script("arguments[0].click();", element)
+ element = chrome.find_element_by_xpath(
+ '//span[@class="form-grid-check-num" and text()="%s"]/ancestor::td/following-sibling::td[6]' % i)
+ element.click()
+ sleep(2)
+ print('ok')
+
+ #滚动条右拉
+ # document.getElementsByClassName('vxe-table--footer-wrapper body--wrapper')[0].scrollLeft = 5000
+ # chrome.execute_script("document.getElementsByClassName('vxe-table--footer-wrapper body--wrapper')[0].scrollLeft = 2000;")
+ # sleep(1)
+ #右侧滚动条向上
+ # chrome.execute_script("document.getElementsByClassName('vxe-table--body-wrapper body--wrapper')[0].scrollTop=0;")
+ # for i in range(1,201):
+ # element = chrome.find_element_by_xpath('(//td[@colid="col_197"])[%s]'%i)
+ # element.click()
+ # sleep(2)
+ # chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='8'")
+ # sleep(2)
+ # element = chrome.find_element_by_xpath('(//td[@colid="col_198"])[%s]'%i)
+ # element.click()
+ # sleep(2)
+ # chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='8'")
+ # sleep(2)
+ # lock = threading.Lock()
+ # lock.acquire()
+ start = time.clock()
+ #方案一============================开始
+ if type==1:
+ import datetime
+ now = datetime.datetime.now()
+ one_minutes_later = now + datetime.timedelta(minutes=1)
+ now = now.strftime('%Y-%m-%d %H:%M')
+ one_minutes_later = one_minutes_later.strftime('%Y-%m-%d %H:%M')
+ # print('bbbbbbbb'+one_minutes_later)
+ while True:
+ now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M')
+ # print('变化的时间' + now)
+ if now == one_minutes_later:
+ print('时间到了')
+ # global start
+ start = time.clock()
+ chrome.find_element_by_xpath('//span[text()="提交"]').click()
+ break
+ # 方案一============================结束
+ #方案二===============开始
+ if type==2:
+ m=get_time_m() #当前时间的分钟
+ m1=get_submit_time(m)#计划提交时间的分钟
+ print('销售订单计划提交时间的分钟',m1)
+ while True:
+ m2=get_time_m() #循环获取当前的分
+ # sleep(30)
+ if (m2==m1):
+ # chrome.find_element_by_xpath('//span[text()="保存"]').click()
+ start = time.clock()
+ chrome.find_element_by_xpath('//span[text()="提交"]').click()
+ break
+ #方案二===============结束
+ while True:
+ try:
+ if chrome.find_element_by_xpath('//p[text()="共享任务创建成功"]').is_displayed()==True:
+ # print('订单完成了')
+ break
+ # else:
+ # print('共享任务创建成功的元素没有出现')
+ except:
+ continue
+ # lock.release()
+ sleep(2)
+ # chrome.find_element_by_xpath('//button[@class="el-button el-button--primary el-button--mini awsui-button awsui-button--primary"]//span[text()="确定"]').click()
+ chrome.switch_to.default_content()
+ chrome.switch_to.frame(chrome.find_element_by_xpath('(//iframe[@class="metro-main-frame"])[2]'))
+ sleep(60)
+ while True:
+ try:
+ # if chrome.find_element_by_xpath('(//span[text()="%s"])[2]'%orderno).is_displayed()==True:
+ if chrome.find_element_by_xpath(
+ '//span[text() = "1"]/ancestor-or-self::td/following-sibling::td/div/span').is_displayed() == True:
+ # print('aaaaaaaaaaaaaaaaaaaaaaaa', chrome.find_element_by_xpath(
+ # '//span[text() = "1"]/ancestor-or-self::td/following-sibling::td/div/span').text)
+ break
+ except:
+ continue
+ print('销售订单创建完成')
+ end = time.clock()
+ print(start, end)
+ imgInfo = getErrorPhoto(chrome)
+ imgName = imgInfo[0]
+ image_path = imgInfo[1]
+ info=orderno+'执行耗时'+str(end - start)
+ now = get_time()
+ writeFile_append(pro_path + '/logs/catalina.out', info)
+ send_email1(image_path, info)
+ print('CPU执行时间: ', end - start)
+ except Exception as e:
+ print('出现异常')
+ # 将日志写入到文件中单独存储
+ pro_path = get_pro_path()
+ traceback.print_exc()
+ imgInfo = getErrorPhoto(chrome)
+ imgName = imgInfo[0]
+ image_path = imgInfo[1]
+ print(imgName, image_path)
+ print(repr(e))
+ info = repr(e)
+ now = get_time()
+ writeFile_append(pro_path + '/logs/logerror%s.txt' % now, info)
+ # send_email1(image_path, info)
+if __name__ == "__main__":
+ # 创建多线程时, 需要制定该线程执行的任务.name线程名字 target目标函数名
+ # t1 = threading.Thread(target=job,name="job1")
+ # t2 = threading.Thread(target=job,name="job2")
+ # t1.start()
+ # t2.start()
+ # opt = ChromeOptions() # 创建 Chrome 参数对象
+ # # opt.headless = True # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ # opt.headless = False # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ # opt.add_argument('--start-maximized')
+ # opt.add_argument('--window-size=1280x1024')
+ # # chrome = Chrome(options=opt) # 创建无界面对象
+ # chrome = WebChrome(chrome_options=opt) # airtest中的类
+
+ count=1
+ for i in range(count):
+ t = threading.Thread(target=job)
+ t.start()
+ t.join()
+
+def start1():
+ count = 1
+ for i in range(count):
+ t = threading.Thread(target=job)
+ t.start()
+ t.join()
+
+ # print(threading.active_count())
+ # print("程序执行结束.....")
+ # create_salesorder()
diff --git "a/testcase/od/\345\244\232\346\230\216\347\273\206/\351\224\200\345\224\256\350\256\242\345\215\225_\345\244\232\346\230\216\347\273\206300_\345\257\274\345\205\245_selenium\344\270\215\346\224\257\346\214\201.py" "b/testcase/od/\345\244\232\346\230\216\347\273\206/\351\224\200\345\224\256\350\256\242\345\215\225_\345\244\232\346\230\216\347\273\206300_\345\257\274\345\205\245_selenium\344\270\215\346\224\257\346\214\201.py"
new file mode 100644
index 0000000..9cadd4d
--- /dev/null
+++ "b/testcase/od/\345\244\232\346\230\216\347\273\206/\351\224\200\345\224\256\350\256\242\345\215\225_\345\244\232\346\230\216\347\273\206300_\345\257\274\345\205\245_selenium\344\270\215\346\224\257\346\214\201.py"
@@ -0,0 +1,328 @@
+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 mail1 import send_email1
+from public.tools import *
+
+
+
+
+# chrome = webdriver.Chrome(chrome_options=opt)
+
+def job():
+ print("这是一个需要执行的任务。。。。。")
+ create_salesorder()
+ print("当前线程的个数:", threading.active_count())
+ time.sleep(1)
+ print("当前线程的信息:", threading.current_thread())
+def add_goods(goodsname,chrome):
+ chrome.find_element_by_xpath(
+ '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,主计量单位,销售计量单位,厂家物料编码,存储条件说明,生产企业编码,供应商编码,行类型,商品性质,批发价,进口/国产/港澳台,件包数,产品备注,是否免备案,产品描述"]').send_keys(
+ goodsname)
+ chrome.find_element_by_xpath(
+ '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,主计量单位,销售计量单位,厂家物料编码,存储条件说明,生产企业编码,供应商编码,行类型,商品性质,批发价,进口/国产/港澳台,件包数,产品备注,是否免备案,产品描述"]').send_keys(
+ Keys.ENTER)
+ #获取页数
+ pagecount=chrome.find_element_by_xpath('(// li[ @class ="number"])[16]').text
+ pagecount=10
+ for i in range(int(pagecount)):
+ # chrome.find_element_by_xpath('//span[text()="添加商品"]').click()
+ # chrome.find_element_by_xpath(
+ # '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,主计量单位,销售计量单位,厂家物料编码,存储条件说明,生产企业编码,供应商编码,行类型,商品性质,批发价,进口/国产/港澳台,件包数,产品备注,是否免备案,产品描述"]').send_keys(
+ # goodsname)
+ # chrome.find_element_by_xpath(
+ # '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,主计量单位,销售计量单位,厂家物料编码,存储条件说明,生产企业编码,供应商编码,行类型,商品性质,批发价,进口/国产/港澳台,件包数,产品备注,是否免备案,产品描述"]').send_keys(
+ # Keys.ENTER)
+ sleep(1)
+ chrome.find_element_by_xpath(
+ '//th[@class="el-table_18_column_229 multiple-column el-table-column--selection is-leaf headerCellClassName el-table__cell"]/div/label/span/span').click()
+ #翻页
+ chrome.find_element_by_xpath('(//button[@class="btn-next is-last"])[6]').click()
+
+ #点击确定
+ # chrome.find_element_by_xpath('(//div[@class="el-dialog__body"]/div[2]/span/button[1]/span)[5]').click()
+ sleep(2)
+def create_salesorder(type=1):
+ try:
+ import time
+ pro_path = get_pro_path()
+ # start = time.clock()
+ # caps = DesiredCapabilities().CHROME
+ # caps["pageLoadStrategy"] = "normal" # complete
+ # caps["pageLoadStrategy"] = "eager" # interactive
+ # caps["pageLoadStrategy"] = "none"
+ # chrome = webdriver.Chrome(desired_capabilities=caps)
+ opt = ChromeOptions() # 创建 Chrome 参数对象
+ # opt.headless = True # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ opt.headless = False # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ opt.add_argument('--start-maximized')
+ opt.add_argument('--window-size=1280x1024')
+ # chrome = Chrome(options=opt) # 创建无界面对象
+ # chrome = WebChrome(chrome_options=opt)
+ chrome = WebChrome(chrome_options=opt)
+ # chrome=webdriver.Chrome()
+ chrome.implicitly_wait(20)
+ chrome.get("http://10.17.65.200:8088/portal/")
+ # chrome.get("http://10.17.65.207:8088/uat/r/w")
+ sleep(2)
+ chrome.implicitly_wait(30)
+ # chrome.maximize_window()
+ chrome.find_element_by_id('input1').clear()
+ chrome.find_element_by_id('input1').send_keys('admin')
+ chrome.find_element_by_id('input2').clear()
+ chrome.find_element_by_id('input2').send_keys('Gyxc1234')
+ 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
+ #切换所属公司
+ chrome.find_element_by_class_name('changeCom').click()
+ sleep(1)
+ chrome.find_element_by_xpath('//span[text()="国药集团北京医疗器械有限公司"]/following-sibling::button').click()
+ sleep(1)
+ chrome.find_element_by_xpath('// button[text() = "确定"]').click()
+ sleep(1)
+ # chrome.find_element_by_xpath('//div[text()="销售管理"]').click()
+ # actions = ActionChains(chrome)
+ # actions.move_to_element(chrome.find_element_by_xpath('//div[text()="销售业务"]')).perform()
+ # chrome.find_element_by_xpath('//span[text()="销售订单"]').click()
+ 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(4)
+ 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")]'))
+ #获取订单号
+
+ orderno=chrome.find_element_by_xpath('//div[text() = "销售订单号 "]/following-sibling::div/span').text
+ print(orderno)
+ # chrome.switch_to.default_content()
+ sleep(4)
+ # while True:
+ # try:
+ # if chrome.find_element_by_xpath('//div[text()="订单公司名称 "]').is_displayed():
+ # print(chrome.find_element_by_xpath('//div[text()="订单公司名称 "]').text)
+ # break
+ # except:
+ # continue
+ print(chrome.find_element_by_xpath('//div[text()="订单公司名称 "]').text)
+
+
+ sleep(2)
+ 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('国药集团北京')
+ chrome.find_element_by_xpath('//input[@placeholder="模糊检索:公司名称,公司编码"]').send_keys(Keys.ENTER)
+ chrome.find_element_by_xpath('(//span[@class="el-radio__inner"])[1]').click()
+
+ chrome.find_element_by_xpath('//span[@class="ensureBtn"]/button').click()
+ chrome.find_element_by_xpath('//button[@class="el-button el-button--primary el-button--mini"]').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="模糊检索:仓库编码,仓库名称,是否传WMS,所属公司名称"]').send_keys('北京强生非')
+ chrome.find_element_by_xpath('//input[@placeholder="模糊检索:仓库编码,仓库名称,是否传WMS,所属公司名称"]').send_keys(Keys.ENTER)
+ # chrome.find_element_by_xpath('//span/input[@type="radio" and @value="03105272b49986351ef7eb2930b5454de"]').click()
+ btn_div= chrome.find_element_by_xpath('//span/input[@type="radio" and @value="03105272b49986351ef7eb2930b5454de"]')
+ chrome.execute_script("arguments[0].click();", btn_div)
+ chrome.find_element_by_xpath('(//button[@class="el-button el-button--primary el-button--default"])[3]').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"])[4]').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('杨春刚')
+ chrome.find_element_by_xpath('//input[@placeholder="模糊检索:业务员名称,业务员编码,业务部门名称,业务部门编码,部门类型编码"]').send_keys(Keys.ENTER)
+ chrome.find_element_by_xpath('(//div[text()="杨春刚"])[3]/ancestor-or-self::td/preceding-sibling::td/div/label/span/span').click()
+ chrome.find_element_by_xpath('(//span[@class="ensureBtn"]/button[1])[4]').click()
+ #其他信息页签
+ chrome.find_element_by_xpath('//div[text()="其他信息"]').click()
+ chrome.find_element_by_xpath('//div[@cid="AWSUI.SwitchButton"]//div/div/div/div/span[1]').click()
+ # 子表信息录入
+ chrome.find_element_by_xpath('//div[text()="主体信息"]').click()
+
+ # 点击添加商品弹出添加商品子窗口
+ chrome.find_element_by_xpath('//button[text()="导入"]').click()
+ sleep(1)
+ # chrome.find_element_by_xpath('//span[text()="上传Excel文件"]').click()
+ sleep(1)
+ element = chrome.find_element_by_class_name('upload__text')
+ chrome.execute_script("arguments[0].click();", element)
+ sleep(1)
+ chrome.find_element_by_class_name('el-upload__text').send_keys(r'D:\PycharmProjects\骨科库存占用专项测试\testcase\od\销售订单明细8.xls')
+ sleep(1)
+ # for i in range(1):
+ # chrome.find_element_by_xpath('//span[text()="添加商品"]').click()
+ # add_goods('PTCA',chrome)
+ # chrome.find_element_by_xpath('(//div[@class="el-dialog__body"]/div[2]/span/button[1]/span)[5]').click()
+ # sleep(10)
+ # for i in range(1):
+ # chrome.find_element_by_xpath('//span[text()="添加商品"]').click()
+ # add_goods('PTCA', chrome)
+ # chrome.find_element_by_xpath('(//div[@class="el-dialog__body"]/div[2]/span/button[1]/span)[5]').click()
+ # sleep(10)
+
+ # chrome.find_element_by_xpath('//span[text()="添加商品"]').click()
+ # chrome.find_element_by_xpath(
+ # '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,主计量单位,销售计量单位,厂家物料编码,存储条件说明,生产企业编码,供应商编码,行类型,商品性质,批发价,进口/国产/港澳台,件包数,产品备注,是否免备案,产品描述"]').send_keys(
+ # 'PTCA')
+ # chrome.find_element_by_xpath(
+ # '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,主计量单位,销售计量单位,厂家物料编码,存储条件说明,生产企业编码,供应商编码,行类型,商品性质,批发价,进口/国产/港澳台,件包数,产品备注,是否免备案,产品描述"]').send_keys(
+ # Keys.ENTER)
+ # sleep(1)
+ # chrome.find_element_by_xpath('//th[@class="el-table_18_column_229 multiple-column el-table-column--selection is-leaf headerCellClassName el-table__cell"]/div/label/span/span').click()
+ # chrome.find_element_by_xpath('(//div[@class="el-dialog__body"]/div[2]/span/button[1]/span)[5]').click()
+ # sleep(2)
+ sleep(6)
+ for i in range(1,101):
+ element = chrome.find_element_by_xpath('(//td[@colid="col_177"])[%s]'%i)
+ chrome.execute_script("arguments[0].click();", element)
+
+ # element=chrome.find_element_by_xpath('(//td[@colid="col_177"])[%s]'%i)
+ # element.click()
+ sleep(2)
+ # element.send_keys("1")
+ # chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='1'")
+ chrome.find_element_by_class_name('awsui-input-number-right').send_keys('1')
+ # chrome.find_element_by_xpath('//td[@colid="col_177"]/div/div').send_keys('1')
+ sleep(2)
+ # chrome.find_element_by_xpath('(//td[@colid="col_178"])[%s]'%i).click()
+ element = chrome.find_element_by_xpath('(//td[@colid="col_178"])[%s]' % i)
+ chrome.execute_script("arguments[0].click();", element)
+ sleep(2)
+
+ #滚动条右拉
+ # document.getElementsByClassName('vxe-table--footer-wrapper body--wrapper')[0].scrollLeft = 5000
+ chrome.execute_script("document.getElementsByClassName('vxe-table--footer-wrapper body--wrapper')[0].scrollLeft = 2000");
+ for i in range(1,101):
+ element = chrome.find_element_by_xpath('(//td[@colid="col_197"])[%s]'%i)
+ element.click()
+ sleep(2)
+ chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='8'")
+ sleep(2)
+ element = chrome.find_element_by_xpath('(//td[@colid="col_198"])[%s]'%i)
+ element.click()
+ sleep(2)
+ chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='8'")
+ sleep(2)
+ # lock = threading.Lock()
+ # lock.acquire()
+ start = time.clock()
+ #方案一============================开始
+ if type==1:
+ import datetime
+ now = datetime.datetime.now()
+ one_minutes_later = now + datetime.timedelta(minutes=1)
+ now = now.strftime('%Y-%m-%d %H:%M')
+ one_minutes_later = one_minutes_later.strftime('%Y-%m-%d %H:%M')
+ # print('bbbbbbbb'+one_minutes_later)
+ while True:
+ now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M')
+ # print('变化的时间' + now)
+ if now == one_minutes_later:
+ print('时间到了')
+ # global start
+ start = time.clock()
+ chrome.find_element_by_xpath('//span[text()="提交"]').click()
+ break
+ # 方案一============================结束
+ #方案二===============开始
+ if type==2:
+ m=get_time_m() #当前时间的分钟
+ m1=get_submit_time(m)#计划提交时间的分钟
+ print('销售订单计划提交时间的分钟',m1)
+ while True:
+ m2=get_time_m() #循环获取当前的分
+ # sleep(30)
+ if (m2==m1):
+ start = time.clock()
+ chrome.find_element_by_xpath('//span[text()="提交"]').click()
+ break
+ #方案二===============结束
+ # lock.release()
+ sleep(2)
+ # chrome.find_element_by_xpath('//button[@class="el-button el-button--primary el-button--mini awsui-button awsui-button--primary"]//span[text()="确定"]').click()
+ chrome.switch_to.default_content()
+ chrome.switch_to.frame(chrome.find_element_by_xpath('(//iframe[@class="metro-main-frame"])[2]'))
+ sleep(20)
+ while True:
+ try:
+ if chrome.find_element_by_xpath('(//span[text()="%s"])[2]'%orderno).is_displayed()==True:
+ print('//span[text()="%s"]'%orderno)
+ break
+ except:
+ continue
+ print('销售订单创建完成')
+ end = time.clock()
+ print(start, end)
+ imgInfo = getErrorPhoto(chrome)
+ imgName = imgInfo[0]
+ image_path = imgInfo[1]
+ info=orderno+'执行耗时'+str(end - start)
+ now = get_time()
+ writeFile_append(pro_path + '/logs/catalina.out', info)
+ send_email1(image_path, info)
+ print('CPU执行时间: ', end - start)
+ except Exception as e:
+ print('出现异常')
+ # 将日志写入到文件中单独存储
+ pro_path = get_pro_path()
+ traceback.print_exc()
+ imgInfo = getErrorPhoto(chrome)
+ imgName = imgInfo[0]
+ image_path = imgInfo[1]
+ print(imgName, image_path)
+ print(repr(e))
+ info = repr(e)
+ now = get_time()
+ writeFile_append(pro_path + '/logs/logerror%s.txt' % now, info)
+ # send_email1(image_path, info)
+if __name__ == "__main__":
+ # 创建多线程时, 需要制定该线程执行的任务.name线程名字 target目标函数名
+ # t1 = threading.Thread(target=job,name="job1")
+ # t2 = threading.Thread(target=job,name="job2")
+ # t1.start()
+ # t2.start()
+ # opt = ChromeOptions() # 创建 Chrome 参数对象
+ # # opt.headless = True # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ # opt.headless = False # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ # opt.add_argument('--start-maximized')
+ # opt.add_argument('--window-size=1280x1024')
+ # # chrome = Chrome(options=opt) # 创建无界面对象
+ # chrome = WebChrome(chrome_options=opt) # airtest中的类
+
+ count=1
+ for i in range(count):
+ t = threading.Thread(target=job)
+ t.start()
+ t.join()
+
+def start1():
+ count = 1
+ for i in range(count):
+ t = threading.Thread(target=job)
+ t.start()
+ t.join()
+
+ # print(threading.active_count())
+ # print("程序执行结束.....")
+ # create_salesorder()
diff --git "a/testcase/od/\345\244\232\346\230\216\347\273\206/\351\224\200\345\224\256\350\256\242\345\215\225_\345\244\232\346\230\216\347\273\20650.py" "b/testcase/od/\345\244\232\346\230\216\347\273\206/\351\224\200\345\224\256\350\256\242\345\215\225_\345\244\232\346\230\216\347\273\20650.py"
new file mode 100644
index 0000000..c6aac9e
--- /dev/null
+++ "b/testcase/od/\345\244\232\346\230\216\347\273\206/\351\224\200\345\224\256\350\256\242\345\215\225_\345\244\232\346\230\216\347\273\20650.py"
@@ -0,0 +1,389 @@
+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 mail1 import send_email1
+from public.tools import *
+
+
+
+
+# chrome = webdriver.Chrome(chrome_options=opt)
+
+def job():
+ print("这是一个需要执行的任务。。。。。")
+ create_salesorder()
+ print("当前线程的个数:", threading.active_count())
+ time.sleep(1)
+ print("当前线程的信息:", threading.current_thread())
+def add_goods(goodsname,chrome):
+ chrome.find_element_by_xpath(
+ '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,主计量单位,销售计量单位,厂家物料编码,存储条件说明,生产企业编码,供应商编码,行类型,商品性质,批发价,进口/国产/港澳台,件包数,产品备注,是否免备案,产品描述"]').send_keys(
+ goodsname)
+ chrome.find_element_by_xpath(
+ '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,主计量单位,销售计量单位,厂家物料编码,存储条件说明,生产企业编码,供应商编码,行类型,商品性质,批发价,进口/国产/港澳台,件包数,产品备注,是否免备案,产品描述"]').send_keys(
+ Keys.ENTER)
+ #获取页数
+ # pagecount=chrome.find_element_by_xpath('(// li[ @class ="number"])[16]').text
+ pagecount=5
+ for i in range(int(pagecount)):
+ # chrome.find_element_by_xpath('//span[text()="添加商品"]').click()
+ # chrome.find_element_by_xpath(
+ # '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,主计量单位,销售计量单位,厂家物料编码,存储条件说明,生产企业编码,供应商编码,行类型,商品性质,批发价,进口/国产/港澳台,件包数,产品备注,是否免备案,产品描述"]').send_keys(
+ # goodsname)
+ # chrome.find_element_by_xpath(
+ # '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,主计量单位,销售计量单位,厂家物料编码,存储条件说明,生产企业编码,供应商编码,行类型,商品性质,批发价,进口/国产/港澳台,件包数,产品备注,是否免备案,产品描述"]').send_keys(
+ # Keys.ENTER)
+ sleep(1)
+ chrome.find_element_by_xpath(
+ '//th[@class="el-table_18_column_269 multiple-column el-table-column--selection is-leaf headerCellClassName el-table__cell"]/div/label/span/span').click()
+ #翻页
+ chrome.find_element_by_xpath('(//button[@class="btn-next is-last"])[6]').click()
+
+ #点击确定
+ # chrome.find_element_by_xpath('(//div[@class="el-dialog__body"]/div[2]/span/button[1]/span)[5]').click()
+ sleep(2)
+def create_salesorder(type=1):
+ try:
+ import time
+ pro_path = get_pro_path()
+ # start = time.clock()
+ # caps = DesiredCapabilities().CHROME
+ # caps["pageLoadStrategy"] = "normal" # complete
+ # caps["pageLoadStrategy"] = "eager" # interactive
+ # caps["pageLoadStrategy"] = "none"
+ # chrome = webdriver.Chrome(desired_capabilities=caps)
+ opt = ChromeOptions() # 创建 Chrome 参数对象
+ # opt.headless = True # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ opt.headless = False # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ opt.add_argument('--start-maximized')
+ opt.add_argument('--window-size=1280x1024')
+ # chrome = Chrome(options=opt) # 创建无界面对象
+ # chrome = WebChrome(chrome_options=opt)
+ chrome = WebChrome(chrome_options=opt)
+ # chrome=webdriver.Chrome()
+ chrome.implicitly_wait(20)
+ chrome.get("http://10.17.65.200:8088/portal/")
+ # chrome.get("http://10.17.65.207:8088/uat/r/w")
+ sleep(2)
+ chrome.implicitly_wait(30)
+ # chrome.maximize_window()
+ chrome.find_element_by_id('input1').clear()
+ chrome.find_element_by_id('input1').send_keys('admin')
+ chrome.find_element_by_id('input2').clear()
+ chrome.find_element_by_id('input2').send_keys('Gyxc1234')
+ 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
+ #切换所属公司
+ chrome.find_element_by_class_name('changeCom').click()
+ sleep(1)
+ chrome.find_element_by_xpath('//span[text()="国药集团北京医疗器械有限公司"]/following-sibling::button').click()
+ sleep(1)
+ chrome.find_element_by_xpath('// button[text() = "确定"]').click()
+ sleep(1)
+ # chrome.find_element_by_xpath('//div[text()="销售管理"]').click()
+ # actions = ActionChains(chrome)
+ # actions.move_to_element(chrome.find_element_by_xpath('//div[text()="销售业务"]')).perform()
+ # chrome.find_element_by_xpath('//span[text()="销售订单"]').click()
+ 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(4)
+ 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")]'))
+ #获取订单号
+
+ orderno=chrome.find_element_by_xpath('//div[text() = "销售订单号 "]/following-sibling::div/span').text
+ print(orderno)
+ # chrome.switch_to.default_content()
+ sleep(4)
+ # while True:
+ # try:
+ # if chrome.find_element_by_xpath('//div[text()="订单公司名称 "]').is_displayed():
+ # print(chrome.find_element_by_xpath('//div[text()="订单公司名称 "]').text)
+ # break
+ # except:
+ # continue
+ print(chrome.find_element_by_xpath('//div[text()="订单公司名称 "]').text)
+
+
+ sleep(2)
+ # 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('国药集团北京')
+ # chrome.find_element_by_xpath('//input[@placeholder="模糊检索:公司名称,公司编码"]').send_keys(Keys.ENTER)
+ # chrome.find_element_by_xpath('(//span[@class="el-radio__inner"])[1]').click()
+
+ # chrome.find_element_by_xpath('//span[@class="ensureBtn"]/button').click()
+ # chrome.find_element_by_xpath('//button[@class="el-button el-button--primary el-button--mini"]').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="模糊检索:仓库编码,仓库名称,是否传WMS,所属公司名称"]').send_keys('北京强生非')
+ chrome.find_element_by_xpath('//input[@placeholder="模糊检索:仓库编码,仓库名称,是否传WMS,所属公司名称"]').send_keys(Keys.ENTER)
+ # chrome.find_element_by_xpath('//span/input[@type="radio" and @value="03105272b49986351ef7eb2930b5454de"]').click()
+ btn_div= chrome.find_element_by_xpath('//span/input[@type="radio" and @value="03105272b49986351ef7eb2930b5454de"]')
+ chrome.execute_script("arguments[0].click();", btn_div)
+ 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()
+ #客户名称
+ 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(
+ '1000486')
+ chrome.find_element_by_xpath(
+ '//input[@placeholder="模糊检索:客户编码,客户名称,收货地址号,收货地址信息,公司编码,货币码,税率/税区,客户分类,联系人,联系人电话"]').send_keys(
+ Keys.ENTER)
+ chrome.find_element_by_xpath(
+ '//div[@class="multiple-header number_col" and text()="1000486"]/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"])[4]').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('杨春刚')
+ chrome.find_element_by_xpath('//input[@placeholder="模糊检索:业务员名称,业务员编码,业务部门名称,业务部门编码,部门类型编码"]').send_keys(Keys.ENTER)
+ chrome.find_element_by_xpath('(//div[text()="杨春刚"])[3]/ancestor-or-self::td/preceding-sibling::td/div/label/span/span').click()
+ chrome.find_element_by_xpath('(//span[@class="ensureBtn"]/button[1])[4]').click()
+ #其他信息页签
+ chrome.find_element_by_xpath('//div[text()="其他信息"]').click()
+ chrome.find_element_by_xpath('//div[@cid="AWSUI.SwitchButton"]//div/div/div/div/span[1]').click()
+ # 子表信息录入
+ chrome.find_element_by_xpath('//div[text()="主体信息"]').click()
+
+ # 点击添加商品弹出添加商品子窗口
+ for i in range(1):
+ chrome.find_element_by_xpath('//span[text()="添加商品"]').click()
+ add_goods('PTCA',chrome)
+ chrome.find_element_by_xpath('(//div[@class="el-dialog__body"]/div[2]/span/button[1]/span)[5]').click()
+ sleep(20)
+ # for i in range(1):
+ # chrome.find_element_by_xpath('//span[text()="添加商品"]').click()
+ # add_goods('PTCA', chrome)
+ # chrome.find_element_by_xpath('(//div[@class="el-dialog__body"]/div[2]/span/button[1]/span)[5]').click()
+ # sleep(10)
+
+ # chrome.find_element_by_xpath('//span[text()="添加商品"]').click()
+ # chrome.find_element_by_xpath(
+ # '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,主计量单位,销售计量单位,厂家物料编码,存储条件说明,生产企业编码,供应商编码,行类型,商品性质,批发价,进口/国产/港澳台,件包数,产品备注,是否免备案,产品描述"]').send_keys(
+ # 'PTCA')
+ # chrome.find_element_by_xpath(
+ # '//input[@placeholder="模糊检索:商品编码,商品名称,规格型号,主计量单位,销售计量单位,厂家物料编码,存储条件说明,生产企业编码,供应商编码,行类型,商品性质,批发价,进口/国产/港澳台,件包数,产品备注,是否免备案,产品描述"]').send_keys(
+ # Keys.ENTER)
+ # sleep(1)
+ # chrome.find_element_by_xpath('//th[@class="el-table_18_column_229 multiple-column el-table-column--selection is-leaf headerCellClassName el-table__cell"]/div/label/span/span').click()
+ # chrome.find_element_by_xpath('(//div[@class="el-dialog__body"]/div[2]/span/button[1]/span)[5]').click()
+ # sleep(2)
+ sleep(6)
+ for i in range(1,51):
+ if i==50:
+ print('50为什么有问题')
+
+ # element = chrome.find_element_by_xpath('(//td[@colid="col_177"])[%s]'%i)
+ # chrome.execute_script("arguments[0].click();", element)
+
+ # element=chrome.find_element_by_xpath('(//td[@colid="col_177"])[%s]'%i)
+ # element.click()
+ element=chrome.find_element_by_xpath('//span[@class="form-grid-check-num" and text()="%s"]/ancestor::td/following-sibling::td[5]'%i)
+ element.click()
+ sleep(2)
+ # element.send_keys("1")
+ # chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='1'")
+ chrome.find_element_by_class_name('awsui-input-number-right').send_keys('1')
+ # chrome.find_element_by_xpath('//td[@colid="col_177"]/div/div').send_keys('1')
+ sleep(2)
+ # chrome.find_element_by_xpath('(//td[@colid="col_178"])[%s]'%i).click()
+ # element = chrome.find_element_by_xpath('(//td[@colid="col_178"])[%s]' % i)
+ # chrome.execute_script("arguments[0].click();", element)
+ element = chrome.find_element_by_xpath(
+ '//span[@class="form-grid-check-num" and text()="%s"]/ancestor::td/following-sibling::td[6]' % i)
+ element.click()
+ sleep(2)
+
+ # print('200条输入完毕')
+ # chrome.find_element_by_xpath('//button[@ class="vxe-pager--next-btn" and @title="下一页"]').click()
+ # # sleep(2)
+ # chrome.execute_script(
+ # "document.getElementsByClassName('vxe-table--body-wrapper body--wrapper')[0].scrollTop=0;")
+
+ #输入第二页数据
+ # for i in range(1,51):
+ #
+ # # element = chrome.find_element_by_xpath('(//td[@colid="col_177"])[%s]'%i)
+ # # chrome.execute_script("arguments[0].click();", element)
+ #
+ # # element=chrome.find_element_by_xpath('(//td[@colid="col_177"])[%s]'%i)
+ # # element.click()
+ # element=chrome.find_element_by_xpath('//span[@class="form-grid-check-num" and text()="%s"]/ancestor::td/following-sibling::td[5]'%i)
+ # element.click()
+ # sleep(2)
+ # # element.send_keys("1")
+ # # chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='1'")
+ # chrome.find_element_by_class_name('awsui-input-number-right').send_keys('1')
+ # # chrome.find_element_by_xpath('//td[@colid="col_177"]/div/div').send_keys('1')
+ # sleep(2)
+ # # chrome.find_element_by_xpath('(//td[@colid="col_178"])[%s]'%i).click()
+ # # element = chrome.find_element_by_xpath('(//td[@colid="col_178"])[%s]' % i)
+ # # chrome.execute_script("arguments[0].click();", element)
+ # element = chrome.find_element_by_xpath(
+ # '//span[@class="form-grid-check-num" and text()="%s"]/ancestor::td/following-sibling::td[6]' % i)
+ # element.click()
+ # sleep(2)
+ print('ok')
+
+ #滚动条右拉
+ # document.getElementsByClassName('vxe-table--footer-wrapper body--wrapper')[0].scrollLeft = 5000
+ # chrome.execute_script("document.getElementsByClassName('vxe-table--footer-wrapper body--wrapper')[0].scrollLeft = 2000;")
+ # sleep(1)
+ #右侧滚动条向上
+ # chrome.execute_script("document.getElementsByClassName('vxe-table--body-wrapper body--wrapper')[0].scrollTop=0;")
+ # for i in range(1,201):
+ # element = chrome.find_element_by_xpath('(//td[@colid="col_197"])[%s]'%i)
+ # element.click()
+ # sleep(2)
+ # chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='8'")
+ # sleep(2)
+ # element = chrome.find_element_by_xpath('(//td[@colid="col_198"])[%s]'%i)
+ # element.click()
+ # sleep(2)
+ # chrome.execute_script("document.getElementsByClassName('awsui-input-number-right')[0].value='8'")
+ # sleep(2)
+ # lock = threading.Lock()
+ # lock.acquire()
+ start = time.clock()
+ #方案一============================开始
+ if type==1:
+ import datetime
+ now = datetime.datetime.now()
+ one_minutes_later = now + datetime.timedelta(minutes=1)
+ now = now.strftime('%Y-%m-%d %H:%M')
+ one_minutes_later = one_minutes_later.strftime('%Y-%m-%d %H:%M')
+ # print('bbbbbbbb'+one_minutes_later)
+ while True:
+ now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M')
+ # print('变化的时间' + now)
+ if now == one_minutes_later:
+ print('时间到了')
+ # global start
+ start = time.clock()
+ chrome.find_element_by_xpath('//span[text()="提交"]').click()
+ break
+ # 方案一============================结束
+ #方案二===============开始
+ if type==2:
+ m=get_time_m() #当前时间的分钟
+ m1=get_submit_time(m)#计划提交时间的分钟
+ print('销售订单计划提交时间的分钟',m1)
+ while True:
+ m2=get_time_m() #循环获取当前的分
+ # sleep(30)
+ if (m2==m1):
+ chrome.find_element_by_xpath('//span[text()="保存"]').click()
+ start = time.clock()
+ chrome.find_element_by_xpath('//span[text()="提交"]').click()
+ break
+ #方案二===============结束
+ while True:
+ try:
+ if chrome.find_element_by_xpath('//p[text()="共享任务创建成功"]').is_displayed() == True:
+ print('订单完成了')
+ break
+ else:
+ print('共享任务创建成功的元素没有出现')
+ except:
+ continue
+ # lock.release()
+ # sleep(2)
+ # chrome.find_element_by_xpath('//button[@class="el-button el-button--primary el-button--mini awsui-button awsui-button--primary"]//span[text()="确定"]').click()
+ chrome.switch_to.default_content()
+ chrome.switch_to.frame(chrome.find_element_by_xpath('(//iframe[@class="metro-main-frame"])[2]'))
+ # sleep(60)
+ while True:
+ try:
+ # if chrome.find_element_by_xpath('(//span[text()="%s"])[2]'%orderno).is_displayed()==True:
+ if chrome.find_element_by_xpath(
+ '//span[text() = "1"]/ancestor-or-self::td/following-sibling::td/div/span').is_displayed() == True:
+ print('aaaaaaaaaaaaaaaaaaaaaaaa', chrome.find_element_by_xpath(
+ '//span[text() = "1"]/ancestor-or-self::td/following-sibling::td/div/span').text)
+ break
+ except:
+ continue
+ print('销售订单创建完成')
+ end = time.clock()
+ print(start, end)
+ imgInfo = getErrorPhoto(chrome)
+ imgName = imgInfo[0]
+ image_path = imgInfo[1]
+ info=orderno+'执行耗时'+str(end - start)
+ now = get_time()
+ writeFile_append(pro_path + '/logs/catalina.out', info)
+ send_email1(image_path, info)
+ print('CPU执行时间: ', end - start)
+ except Exception as e:
+ print('出现异常')
+ # 将日志写入到文件中单独存储
+ pro_path = get_pro_path()
+ traceback.print_exc()
+ imgInfo = getErrorPhoto(chrome)
+ imgName = imgInfo[0]
+ image_path = imgInfo[1]
+ print(imgName, image_path)
+ print(repr(e))
+ info = repr(e)
+ now = get_time()
+ writeFile_append(pro_path + '/logs/logerror%s.txt' % now, info)
+ # send_email1(image_path, info)
+if __name__ == "__main__":
+ # 创建多线程时, 需要制定该线程执行的任务.name线程名字 target目标函数名
+ # t1 = threading.Thread(target=job,name="job1")
+ # t2 = threading.Thread(target=job,name="job2")
+ # t1.start()
+ # t2.start()
+ # opt = ChromeOptions() # 创建 Chrome 参数对象
+ # # opt.headless = True # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ # opt.headless = False # 把 Chrome 设置成无界面模式,windows/Linux 皆可
+ # opt.add_argument('--start-maximized')
+ # opt.add_argument('--window-size=1280x1024')
+ # # chrome = Chrome(options=opt) # 创建无界面对象
+ # chrome = WebChrome(chrome_options=opt) # airtest中的类
+
+ count=1
+ for i in range(count):
+ t = threading.Thread(target=job)
+ t.start()
+ t.join()
+
+def start1():
+ count = 1
+ for i in range(count):
+ t = threading.Thread(target=job)
+ t.start()
+ t.join()
+
+ # print(threading.active_count())
+ # print("程序执行结束.....")
+ # create_salesorder()
diff --git "a/testcase/od/\345\244\232\346\230\216\347\273\206/\351\224\200\345\224\256\350\256\242\345\215\225\346\230\216\347\273\2068.xls" "b/testcase/od/\345\244\232\346\230\216\347\273\206/\351\224\200\345\224\256\350\256\242\345\215\225\346\230\216\347\273\2068.xls"
new file mode 100644
index 0000000000000000000000000000000000000000..24b559a7a47d7cde5eed7e566448a532bc4ea8ae
GIT binary patch
literal 278016
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