新的需求中处理数据需要有个payment的操作,功能测试是用soapui发送xml,但是因为那个xml需要的数据较多并且比较麻烦所以想做成自动化,捣鼓了快一周终于成功了QUQ 不容易
记录下做的时候遇到的坑和points
1.数据获取
拼xml要从ORACLE中查询多个表单,一开始是写了几个def每个对应一张表的sql
因为中间会有一些上张表的结果是下张的取值,一开始想直接都写到文件里
结果发现执行的时候因为有pyc所以不是实时获取的
改成return,最后输出四个表的结果整在一个return
写的很新手,感觉很累赘,不过暂时没想到更好的方法QUQ
用的cx_Oracle的方法,一开始数据库都连不上下了instantclient也不行,最后还是装了oracle_x64完整版
不过这个坑不知道是不是因为一开始公司的电脑装了x86版本的oracle
2.拼xml
这个里面也遇到好几个坑
1)xml中有一段需要修改的字段都在里面,可这个中间的标签直接是查不到的,就先输出了这段中间的到一个新的xml再修改
2)结果生成的新的好不容易改好了,拼回去的时候发现字符被转码了,最后加了HTMLParser库,但是用xml.etree.ElementTree 带的方法存还是被转码了
最后还是用了个笨办法就是把输出的xml再次转码ORZ,希望自己回头看这篇文的时候已经可以用正常思维解决这种尴尬问题?
转码代码
html_parser =HTMLParser.HTMLParser()
new_cont= html_parser.unescape(all_the_text)
3)被转码的同时还发现xml上面的xmlns变成了ns0查了发现也是需要先注册自己的地址,用的还是xml.etree.ElementTree
代码
ET.register_namespace('ws', "url")
ET.register_namespace('soapenv', "url")
PS 这段还遗留了一个问题其中有两个标签的总数是不固定的,他们在一个大标签下
如果少于或者多于模板中的个数,是应该要删掉或者添加相应的大标签及下面的内容(这个大标签下分别有这两个参数和一个空标签)
目前只加了个判断提示,对标签的append和delete还没摸索成功=-= delay吧
3.发送soap
这个是无意百度到的一个大佬的方法,基本是搬过来自己加了点配置吧QUQ
打印代码
#coding=utf-8
importHTMLParser
html_parser=HTMLParser.HTMLParser()importxml.dom.minidom as dmdefprint_decorator(argument):defreal_decorator(function):def wrapper(*args, **kwargs):print '-' * 10 + 'start of' + argument + '-' * 10function(*args, **kwargs)print '-' * 10 + 'end of' + argument + '-' * 10
returnwrapperreturnreal_decorator
@print_decorator('Request')defprint_request(request):print ' '.join((request.method, request.path_url))
print_headers(request.headers)print
ifrequest.body:
print_xml(request.body)defprint_headers(headers):for k, v inheaders.items():print ':'.join((k, v))
@print_decorator('Response')defprint_response(response):printresponse.status_codeprintprint_headers(response.headers)#print print_xml(html_parser.unescape(response.text))
xml =dm.parseString(html_parser.unescape(response.text))print '-' * 10 + 'Response xml' + '-' * 10
printxml.toprettyxml()defprint_xml(xml_str):print xml_str
发送代码
#coding=utf-8
importrequestsfrom print_utils import *
importHTMLParserimportos
cwd=os.path.dirname(os.getcwd())
filepath= os.path.abspath(cwd + '/xml')defsoapXML():#url
#copy from SOAP 1.1 body
xml = filepath+"/name.xml"fileread=open(xml)
html_parser=HTMLParser.HTMLParser()try:
all_the_text_file=fileread.read()#print all_the_text_file
new_cont_file =html_parser.unescape(all_the_text_file)#print new_cont_file
finally:
fileread.close()
request_body=new_cont_file
request_headers= {'Host': 'url','Content-Type': 'text/xml; charset=utf-8'}
response= requests.post('url',
data=request_body, headers=request_headers)
s=requests.session()
s.keep_alive=False#requests.adapters.DEFAULT_RETRIES = 5
request =response.request
print_request(request)
print_response(response)
response的xml一开始也被转码了,加了个xml.dom.minidom库的dm.parseString方法
没想到发送soap这么简单,百度的时候还看到有用urllib2的库来执行的,不过这个方法成功了就没研究delay+1。。。
中间还遇到个坑发送一直报错,日志是hash错误(我们的xml中有一段是多个字段拼起来hash的)
后来发现是环境和服务可能挂了重启了就成功了_(:з」∠)_长呼一口气啊。。
前后坑了快一周吧,算是暂时能用了