def hede_test(url, data, key): """ 和德创建保单 测试秘钥(secret)为:b0a44d2ac9bb4196b8977360554f91bb 正式秘钥(secret)为:6c6d55134dc74946aad0601cf1171808 测试地址:http://apitest.dxtmobile.com/insure/channelPolicy/save 正式地址:http://insure.hollardchina.com.cn/insure/channelPolicy/save :return: """ timestamp = int(time.time() * 1000) headers = { "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8" } datas = dict(data) datas.update({"timestamp": timestamp}) logger.info("传入数据: " + str(datas)) data_list = sorted(datas.items(), key=lambda e: e[0], reverse=False) datas_str = "&".join(u"{}={}".format(k, v) for k, v in data_list) + '&' + 'key' + '=' + key logger.info("加密前数据: " + datas_str) sign = MD5_tool(datas_str).upper() logger.info("签名数据: " + sign) datas.update({"sign": sign}) res = requests.post(url=url, data=datas, headers=headers) logger.info("请求地址: " + url) logger.info("请求数据: " + json.dumps(datas)) return res
def send(self): self.msg['Subject'] = self.title self.msg['From'] = self.sender self.msg['To'] = self.receiver # 邮件正文 if self.message: self.msg.attach(MIMEText(self.message)) # 添加附件,支持多个附件(传入list),或者单个附件(传入str) if self.files: if isinstance(self.files, list): for f in self.files: self._attach_file(f) elif isinstance(self.files, str): self._attach_file(self.files) # 连接服务器并发送 try: smtp_server = smtplib.SMTP(self.server) # 连接sever except (gaierror and error) as e: logger.exception('发送邮件失败,无法连接到SMTP服务器,检查网络以及SMTP服务器. %s', e) else: try: smtp_server.login(self.sender, self.password) # 登录 except smtplib.SMTPAuthenticationError as e: logger.exception('用户名密码验证失败!%s', e) else: smtp_server.sendmail(self.sender, self.receiver.split(';'), self.msg.as_string()) # 发送邮件 finally: smtp_server.quit() # 断开连接 logger.info('发送邮件"{0}"成功! 收件人:{1}。如果没有收到邮件,请检查垃圾箱,' '同时检查收件人地址是否正确'.format(self.title, self.receiver))
def move_to_element(self, css): """ 鼠标越过元素 """ logger.info("-- move_to_element: %s" % css) self.element_wait(css) el = self.get_element(css) ActionChains(self.driver).move_to_element(el).perform()
def _attach_file(self, att_file): """将单个文件添加到附件列表中""" att = MIMEText(open('%s' % att_file, 'rb').read(), 'plain', 'utf-8') att["Content-Type"] = 'application/octet-stream' file_name = re.split(r'[\\|/]', att_file) att["Content-Disposition"] = 'attachment; filename="%s"' % file_name[-1] self.msg.attach(att) logger.info('attach file {}'.format(att_file))
def click(self, css): """ 点击 """ logger.info("-- click: %s" % css) self.element_wait(css) el = self.get_element(css) el.click()
def submit(self, css): """ 提交表单 """ logger.info("-- submit: %s" % css) self.element_wait(css) el = self.get_element(css) el.submit()
def double_click(self, css): """ 双击 """ logger.info("-- double_click: %s" % css) self.element_wait(css) el = self.get_element(css) ActionChains(self.driver).double_click(el).perform()
def right_click(self, css): """ 右键点击 """ logger.info("-- right_click: %s" % css) self.element_wait(css) el = self.get_element(css) ActionChains(self.driver).context_click(el).perform()
def type(self, css, text): """ 输入内容信息 """ logger.info("-- type: %s %s" % (css, text)) self.element_wait(css) el = self.get_element(css) el.send_keys(text)
def clear(self, css): """ 清空 """ logger.info("-- clear: %s" % css) self.element_wait(css) el = self.get_element(css) el.clear()
def switch_to_frame(self, css): """ 切换到指定的frame """ self.element_wait(css) iframe_el = self.get_element(css) self.driver._switch_to.frame(iframe_el) logger.info("-- switch_to_frame: %s" % css)
def get_display(self, css): """ 判断元素是否存在 """ self.element_wait(css) el = self.get_element(css) logger.info("-- get_display: %s" % css) return el.is_displayed()
def get_text(self, css): """ 获取元素文本信息 """ self.element_wait(css) el = self.get_element(css) txt = el.text logger.info("-- get_text: %s %s" % (css, txt)) return txt
def action_hede(self, case_id, case_name, login_url, login_data, identity, base_url, base_date, from_url, from_data, assertion): logger.info(u" ====== 【" + case_id + u":" + case_name + u"】 ====== ") action_page = http_update_hepei(login_url, eval(login_data), identity, base_url, eval(base_date), from_url, eval(from_data)) logger.info(u"返回数据: " + action_page.text) self.assertEqual(action_page.json()["message"], assertion, action_page.text)
def js(self, script): """ 执行 JavaScript 脚本 使用方法: driver.js("window.scrollTo(200,1000);") """ logger.info("-- js: %s" % script) self.driver.execute_script(script)
def get_attribute(self, css, attribute): """ 获取元素属性值 使用方法: driver.get_attribute("css=>#el","type") """ el = self.get_element(css) logger.info("-- get_attribute: %s %s" % (css, el.get_attribute(attribute))) return el.get_attribute(attribute)
def drag_and_drop(self, el_css, ta_css): """ 拖动某个元素到某个距离,然后将其删除。 """ logger.info("-- drag_and_drop: %s %s" % el_css, ta_css) self.element_wait(el_css) element = self.get_element(el_css) self.element_wait(ta_css) target = self.get_element(ta_css) ActionChains(driver).drag_and_drop(element, target).perform()
def element_size(self, css, scss): """ 获取表格元素的集合 :param css: :param scss: :return: """ x = self.driver.find_element_by_id(css).find_elements_by_tag_name(scss) # rowall = [rowall.text for rowall in x] logger.info("-- element_size: %s" % x) return x
def open_new_window(self, css): """ 创建新窗口,并指定到新窗口 """ original_windows = self.driver.current_window_handle el = self.get_element(css) el.click() all_handles = self.driver.window_handles for handle in all_handles: if handle != original_windows: self.driver._switch_to.window(handle) logger.info("-- open_new_window: %s" % css)
def api_test(url, datas, key): """ 将数据排序,使用MD5加密,拼接后post请求 :param url: :param data: :param key: :return: r.json() """ timestamp = int(time.time()) data = dict(datas) data.update({"timestamp": timestamp}) data_list = sorted(data.items(), key=lambda e: e[0], reverse=False) data_str = "&".join(u"{}={}".format(k, v) for k, v in data_list) + '&' + key logger.info("加密前数据: " + data_str) md5 = hashlib.md5() # 使用MD5加密模式 md5.update(data_str.encode("utf8")) # 将参数字符串传入 sign = md5.hexdigest() data.setdefault('sign', sign) logger.info("签名数据: " + sign) r = requests.post(url + json.dumps(data)) logger.info("请求地址: " + url) logger.info("请求数据: " + json.dumps(data)) return r
def test_remove_2(self): '''测试正常删除单个空文件夹''' self.lib.Raysync_SetRemoveCallback(self.instance, RemoveResult_cb) #设置创建文件夹回调,在public中设置回调时的格式 files = (ctypes.c_char_p * 2)() # 将上传文件转化为c的数组,ctyps.c_char_p * 文件数量 + 1 files[0] = ctypes.c_char_p(b'AutoTestMkdir') # 格式化167-mov.mov 文件 self.lib.Raysync_Remove(self.instance, "/", files) while not remove_task.valid: time.sleep(1) self.assertTrue(remove_task.remove_result == 0) if remove_task.remove_result != 0: logger.info("删除失败")
def test_remove_1(self): '''测试正常删除单个文件''' self.lib.Raysync_SetRemoveCallback(self.instance, RemoveResult_cb) #设置创建文件夹回调,在public中设置回调时的格式 self.lib.Raysync_SetListCallback(self.instance, ls_cb) #设置回调,在public中设置回调时的格式 files = (ctypes.c_char_p * 2)() # 将上传文件转化为c的数组,ctyps.c_char_p * 文件数量 + 1 files[0] = ctypes.c_char_p(b'burpsuite_community_windows-x64_v1_7_36.exe') # 格式化167-mov.mov 文件 self.lib.Raysync_Remove(self.instance, "/", files) while not remove_task.valid: time.sleep(1) self.assertTrue(remove_task.remove_result == 0) if remove_task.remove_result != 0: logger.info("删除失败")
def test_remove_5(self): '''测试删除单个不存在的文件''' self.lib.Raysync_SetRemoveCallback(self.instance, RemoveResult_cb) #设置创建文件夹回调,在public中设置回调时的格式 self.lib.Raysync_SetListCallback(self.instance, ls_cb) #设置回调,在public中设置回调时的格式 files = (ctypes.c_char_p * 2)() # 将上传文件转化为c的数组,ctyps.c_char_p * 文件数量 + 1 files[0] = ctypes.c_char_p(b'NotExist.mov') # 格式化167-mov.mov 文件 self.lib.Raysync_Remove(self.instance, "/", files) while not remove_task.valid: time.sleep(1) self.assertTrue(remove_task.remove_result != 0) if remove_task.remove_result == 0: logger.info("文件已存在,正常删除")
def test_task_2(self): '''正常开始单个文件上传传输''' self.lib.Raysync_SetTaskListCallback(self.instance, TaskInfo_cb) #设置任务列表回调,获取任务ID self.lib.Raysync_SetTaskStateChangedCallback(self.instance, statechanged_func) self.lib.Raysync_SetRemoveCallback(self.instance, RemoveResult_cb) #设置文件删除回调 files = (ctypes.c_char_p * 2)() # 将上传文件转化为c的数组,ctyps.c_char_p * 文件数量 + 1 files[0] = ctypes.c_char_p( b'burpsuite_community_windows-x64_v1_7_36.exe') # 格式化167-mov.mov 文件 try: self.lib.Raysync_Remove(self.instance, '/', files) while not remove_task.valid: time.sleep(1) except: logger.info('服务器不存在该文件,无需删除') self.lib.Raysync_Upload(self.instance, bytes(UPLOAD_PATH, encoding='utf8'), '/', files, None, 'upload_task_2') # 上传单个167-mov.mov 文件 self.lib.Raysync_GetTaskList(self.instance) while True: if task.TaskID != 0: break else: time.sleep(1) #循环获取taskID,如果不为0则退出循环 self.lib.Raysync_StopTask(self.instance, task.TaskID) #停止任务 time.sleep(2) self.assertTrue(upload_task.task_state == 9) self.lib.Raysync_StartTask(self.instance, task.TaskID) time.sleep(2) #开始任务 while True: if upload_task.task_state >= 9: break else: time.sleep(1) self.assertTrue(upload_task.task_state == 10)
def test_remove_4(self): '''测试正常删除多个文件''' self.lib.Raysync_SetRemoveCallback(self.instance, RemoveResult_cb) #设置创建文件夹回调,在public中设置回调时的格式 remove_files = ['167_MPG.mpg','英文max-webm.webm','中文maya_mp4格式.mp4','中文maya—WNV.wmv'] files = (ctypes.c_char_p * (len(remove_files) + 1))() a = 0 for i in remove_files: b = i files[a] = ctypes.c_char_p(bytes(b, encoding='utf8')) a = a + 1 # 将上传文件转化为c的数组,ctyps.c_char_p * 文件数量 + 1 self.lib.Raysync_Remove(self.instance, "/", files) while not remove_task.valid: time.sleep(1) self.assertTrue(remove_task.remove_result == 0) if remove_task.remove_result != 0: logger.info("删除失败")
def setUp(self): self.instance = self.lib.Raysync_CreateRaysyncInterface() #创建实例 try: self.lib except: logger.info("dll文件不存在") #确认是否存在dll文件 try: self.lib.Raysync_Connect(self.instance, 500) except: logger.info("Raysync_Connect 失败") #与dll文件建连 try: self.lib.Raysync_Login(self.instance, bytes(self.URL, encoding='gbk'), self.port, bytes(self.username, encoding='gbk'), bytes(self.password, encoding='gbk')) #登录客户端,地址,端口号,用户名,密码可在config.yml中修改 #登录server except: logger.info('登录失败,请检查服务器地址/端口/用户名/密码是否正确') rename_task.valid = False mkdir_task.valid = False self.lib.Raysync_List(self.instance, "/") #list操作 time.sleep(2)
def setUp(self): self.instance = self.lib.Raysync_CreateRaysyncInterface() try: self.lib except: logger.info("dll文件不存在") #确认是否存在dll文件 try: self.lib.Raysync_Connect(self.instance, 500) except: logger.info("Raysync_Connect 失败") #与dll文件建连 try: self.lib.Raysync_Login(self.instance, bytes(self.URL, encoding='gbk'), self.port, bytes(self.username, encoding='gbk'), bytes(self.password, encoding='gbk')) except: logger.info('登录失败,请检查服务器地址/端口/用户名/密码是否正确') #登录客户端,地址,端口号,用户名,密码可在config.yml中修改 #登录server upload_task.task_state = 0 # 初始化upload_task.task_state = 0 self.lib.Raysync_List(self.instance, "/") #list操作 time.sleep(2) self.lib.Raysync_DeleteAllTask(self.instance) #清空传输列表 time.sleep(1)
def action_login(self, case_id, case_name, username, password, *arge): # ***** 【登录模块】 ***** login_page = LoginPage.LoginPage(self.driver, self.url) logger.info(u"===== 【" + case_id + u"】" + case_name + u" =====") logger.info("用户名:" + username + " 密码:" + password) # 调用用户名输入组件 login_page.test_user_login(username, password) time.sleep(2) saveScreenshot.saveScreenshot(self.driver, "登录模块") try: self.assertEqual(self.driver.get_title(), u"系统") logger.info(u"***** 【登录成功】 *****") except: logger.info(u"***** 【登录失败】 *****")
def test_task_3(self): '''正常暂停单个文件夹上传传输''' self.lib.Raysync_SetTaskStateChangedCallback(self.instance, statechanged_func) #设置任务状态回调 self.lib.Raysync_SetTaskListCallback(self.instance, TaskInfo_cb) #设置任务列表回调,获取任务ID self.lib.Raysync_SetRemoveCallback(self.instance, RemoveResult_cb) #设置文件删除回调 files = (ctypes.c_char_p * 2)() # 将上传文件转化为c的数组,ctyps.c_char_p * 文件数量 + 1 files[0] = ctypes.c_char_p(b'upload_task') # 格式化upload_task try: self.lib.Raysync_Remove(self.instance, '/', files) while not remove_task.valid: time.sleep(1) except: logger.info('服务器不存在该文件,无需删除') time.sleep(1) self.lib.Raysync_Upload(self.instance, bytes(BASE_PATH, encoding='utf8'), '/', files, None, 'upload_task_3') self.lib.Raysync_GetTaskList(self.instance) while True: if task.TaskID != 0: break else: time.sleep(1) # 上传单个167-mov.mov 文件 time.sleep(5) self.lib.Raysync_StopTask(self.instance, task.TaskID) #停止任务 while True: if upload_task.task_state >= 9: break else: time.sleep(1) self.assertTrue(upload_task.task_state == 9)
def test_upload_2(self): '''正常上传单个文件夹''' self.lib.Raysync_SetTaskStateChangedCallback(self.instance, statechanged_func) files = (ctypes.c_char_p * 2)() # 将上传文件转化为c的数组,ctyps.c_char_p * 文件数量 + 1 files[0] = ctypes.c_char_p(b'upload_task') try: self.lib.Raysync_Remove(self.instance, '/', files) while not remove_task.valid: time.sleep(1) break except: logger.info('服务器不存在该文件,无需删除') self.lib.Raysync_Upload(self.instance, bytes(BASE_PATH, encoding='utf8'), '/', files, None, 'upload_task_2') #上传upload_task目录 while True: if upload_task.task_state >= 9: break else: time.sleep(1) self.assertTrue(upload_task.task_state == 10)