python suds soap调用suds方法,抛出"对象实例没有设置"的异常,为什么

当被调用服务的返回xml内容值不是按照wsdl文件描述定义的, 就莫名奇妙返回suds.WebFault
没有更多详细信息!
于是将解压,并插入到sys.path[0], 通过设置断点的方式找出非标准的返回报文到底在说啥。从而调整对应参数。
suds-0.4/suds/bindings/binding.py (246~268)
def get_fault(self, reply):
Extract the fault from the specified soap reply.
If I{faults} is True, an
exception is raised.
Otherwise, the I{unmarshalled} fault L{Object} is
This method is called when the server raises a I{web fault}.
@param reply: A soap reply message.
@type reply: str
@return: A fault object.
@rtype: tuple ( L{Element}, L{Object} )
import pdb
pdb.set_trace()
reply = self.replyfilter(reply)
sax = Parser()
faultroot = sax.parse(string=reply)
soapenv = faultroot.getChild('Envelope')
soapbody = soapenv.getChild('Body')
fault = soapbody.getChild('Fault')
unmarshaller = self.unmarshaller(False)
p = unmarshaller.process(fault)
if self.options().faults:
raise WebFault(p, faultroot)
return (faultroot, p.detail)
顺便记录下suds神器的基本用法,方便查阅:
1. 查看服务接口
import suds
client=suds.client.Client('xxxx_webservice_url')
def get_all_methods(client):
return [method for method in client.wsdl.services[0].ports[0].methods]
2. 查看某个具体接口的传输参数及类型
def get_method_args(client, method_name):
method = client.wsdl.services[0].ports[0].methods[method_name]
input_params = method.binding.input
return input_params.param_defs(method)
3. 调用接口服务
client.service.xxx_function(....)
4. 关于调试
输出之前调用服务接口时发送了什么soap报文,以及收到什么样的soap报文
print 'last sent:\n', client.last_sent()
print 'last recv:\n', client.last_received()
&当服务器返回报文格式不规范时(非wsdl中定义的),client.last_received()为None。这个时候显然对联调极为不利。
&那就利用suds自身的日志记录看看咯。设定如下:
import sysimport logging
logger = logging.getLogger('suds')
logger.setLevel(logging.DEBUG)
logger.addHandler(logging.StreamHandler(sys.stdout))
如果只关心传输了什么,则可以限定logger为&suds.transport.http&
import sys
logger = logging.getLogger('suds.transport.http')
logger.setLevel(logging.DEBUG)
logger.addHandler(logging.StreamHandler(sys.stdout))
&5. 异常的捕捉和输出
client.service.xxx_func(*args, **kwargs)
except suds.WebFault,ex:
print ex.fault
print ex.document
后记:对于第三方库莫名其妙的问题,果断及时拿源码过来剖析(至少debug)
&来个demo说明如何运用,如下:
&&& import suds
&&& url='/webservice/kuaidi/kuaidi.asmx?wsdl'
&&& client = suds.client.Client(url)
&&& print get_all_methods(client)
[KuaidiQuery]
&&& print get_method_args(client, 'KuaidiQuery')
[(Compay, &Element:0x7f6c55bc43d0 name="Compay" type="(u'string', u'http://www.w3.org/2001/XMLSchema')" /&), (OrderNo, &Element:0x7f6c55bc4450 name="OrderNo" type="(u'string', u'http://www.w3.org/2001/XMLSchema')" /&)]
&&& print client.service.KuaidiQuery(Company='EMS', OrderNo='1111')
(KuaidiQueryResult){
RESULTS = "0"
MESSAGE = "接口查询成功"
&&& print client.last_sent()
&?xml version="1.0" encoding="UTF-8"?&
&SOAP-ENV:Envelope xmlns:ns0="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"&
&SOAP-ENV:Header/&
&ns0:Body&
&ns1:KuaidiQuery&
&ns1:OrderNo&1111&/ns1:OrderNo&
&/ns1:KuaidiQuery&
&/ns0:Body&
&/SOAP-ENV:Envelope&
&&& print client.last_received()
&?xml version="1.0" encoding="UTF-8"?&
&soap:Envelope&
&soap:Body&
&KuaidiQueryResponse xmlns="/"&
&KuaidiQueryResult&
&RESULTS&0&/RESULTS&
&MESSAGE&接口查询成功&/MESSAGE&
&/KuaidiQueryResult&
&/KuaidiQueryResponse&
&/soap:Body&
&/soap:Envelope&
转载请注明本文:/Tommy-Yu/p/5567091.html
阅读(...) 评论()你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
**我在Robotframework中用AppiumLibrary写了android测试,我发现群里面没有人用这个框架,我每次问问题回答的人都不多,
下面是我遇到的一些问题以及找到的解决办法,很初级,但是希望能帮到刚开始接触的同学.
Question1:
定位的时候用id定位的而且在虚拟机上是可以跑通的,但是到真机上就报错
这是原来的写法
这是在真机上运行时的写法
就是在写id的时候一定要写全路径。
Question2:
备注:我的手机是meizu的。
用appium在命令行启动后,运行用例时报错:api版本不能低于17.
我的版本是19,报这个错的解决办法:
用以下命令:
appium -a 127.0.0.1 -p 4723 -U 040ABFTWNJWR --no-reset
其中040ABFTWNJWR 是我的设备名。
Question3:
魅族手机MX2聊到电脑的时候用命令adb devices提示找不到设备。
解决办法:
Windows 7中文环境
建立或修改C:\用户&你的用户名>.android\adb_usb.ini文件,在该文件中添加一行文本,内容是0x2a45。
Question4:
在可编辑区域用input text输入中文时,代码中的中文内容并没有输入到文本框中(英文可以输入)
解决办法:
在open application的时候最后面增加两个参数.
Question5:
调用hide keyboard关键词后无法再次调出键盘?
在输入法中去掉 Appium Android Input..的勾选,就可以调出键盘。
Question6:
Robotframework+appiumLibrary中用xpath时总是报错,发现是没有加android.widget,正确xpath写法如下:
xpath=//android.widget.RelativeLayout[2]/android.widget.TextView[contains(@index,0)]
xpath=//android.widget.RelativeLayout[2]/android.widget.TextView[1]**
**我在Robotframework中用AppiumLibrary写了android测试,我发现群里面没有人用这个框架,我每次问问题回答的人都不多,
下面是我遇到的一些问题以及找到的解决办法,很初级,但是希望能帮到刚开始接触的同学.
Question1:
定位的时候用id定位的而且在虚拟机上是可以跑通的,但是到真机上就报错
这是原来的写法
这是在真机上运行时的写法
就是在写id的时候一定要写全路径。
Question2:
备注:我的手机是meizu的。
用appium在命令行启动后,运行用例时报错:api版本不能低于17.
我的版本是19,报这个错的解决办法:
用以下命令:
appium -a 127.0.0.1 -p 4723 -U 040ABFTWNJWR --no-reset
其中040ABFTWNJWR 是我的设备名。
Question3:
魅族手机MX2聊到电脑的时候用命令adb devices提示找不到设备。
解决办法:
Windows 7中文环境
建立或修改C:\用户&你的用户名>.android\adb_usb.ini文件,在该文件中添加一行文本,内容是0x2a45。
Question4:
在可编辑区域用input text输入中文时,代码中的中文内容并没有输入到文本框中(英文可以输入)
解决办法:
在open application的时候最后面增加两个参数.
Question5:
调用hide keyboard关键词后无法再次调出键盘?
在输入法中去掉 Appium Android Input..的勾选,就可以调出键盘。
Question6:
Robotframework+appiumLibrary中用xpath时总是报错,发现是没有加android.widget,正确xpath写法如下:
xpath=//android.widget.RelativeLayout[2]/android.widget.TextView[contains(@index,0)]
xpath=//android.widget.RelativeLayout[2]/android.widget.TextView[1]**
详细请看文档,如有地方写错请指正!我会纠正
详细请看文档,如有地方写错请指正!我会纠正
使用第三方库的时候,有时不太方便,于是想对其进行修改或添加keyword,修改的话可以直接对keyword进行修改;添加的话可以直接在第三方py文件里进行,也可以再新建一个py文件,进行添加keyword。
第三方库的“官方”也会对其进行维护,会有新的版本,当你下载、更新、使用新版本的时候,个人新添加的keyword就有被覆盖的危险。所以,新建py文件来维护个人的keyword会相对比较方便。
新建py文件需要注意以下(site-packages第三方库中新建):
新建类要继承KeywordGroup类;
新建类所在包的__init__.py中要引入该类;
3.外层包的__init__.py中要继承新建的类;
使用第三方库的时候,有时不太方便,于是想对其进行修改或添加keyword,修改的话可以直接对keyword进行修改;添加的话可以直接在第三方py文件里进行,也可以再新建一个py文件,进行添加keyword。
第三方库的“官方”也会对其进行维护,会有新的版本,当你下载、更新、使用新版本的时候,个人新添加的keyword就有被覆盖的危险。所以,新建py文件来维护个人的keyword会相对比较方便。
新建py文件需要注意以下(site-packages第三方库中新建):
新建类要继承KeywordGroup类;
新建类所在包的__init__.py中要引入该类;
3.外层包的__init__.py中要继承新建的类;
说明:由于Python本身无法直接调用C# DLL(只可调用C/C++ DLL),需要通过IronPython来调用。
步骤一:设置环境变量:将放置.NET程序集文件所在的目录加入到系统环境变量Path中,例如(C:\IronPython 27\DLLs、C:\Python27\DLLs)
步骤二:首先利用“SharpDevelop 2.2”对.NET程序集文件进行重新编译
步骤三:如果存在程序集文件的名称与其命名空间不一致,则打开:windows->Preferences->PyDev->Interpreter – IronPython,在Forced Builtins下面手工添加程序集文件的命名空间字段强制编译。
步骤四:在开发环境中导入该程序集的命名空间模块,如下:
import clr
clr.AddReference('ExDataGrid')
import ExDataGridView
例子如下:
加载C# DLL
需要加载的C# DLL源码如下(由于详细实现代码较长,在此省略):
我们需要在IronPython脚本中调用HashCalc函数,Python脚本如下:
详细说明:
clr.AddReferenceToFile(&SimpleHash.dll&) 加载DLL文件from Common import * 导入命名空间由于C#方法HashCalc不是静态方法,需要先定义类,再进行访问,如下:
import clr
clr.AddReference('OprtAnalyse')
import OprtAnalyse
ClaObj = OprtAnalyse.OprtDescription()
OprtDescriptionPy(ClaObj):
def __init__(self):
def add_Oprt_Description1(self,arg1):
ClaObj.SubstationID = arg1
return ClaObj.OprtCatagoryID
若HashCalc为静态方法,则IronPython脚本可直接调用:查看源代码
C#方法参数为byte[]格式,需要将str转换为byte[]格式,否则会报错“TypeError: expected Array[Byte], gotstr”,相互转换代码如下:
说明:由于Python本身无法直接调用C# DLL(只可调用C/C++ DLL),需要通过IronPython来调用。
步骤一:设置环境变量:将放置.NET程序集文件所在的目录加入到系统环境变量Path中,例如(C:\IronPython 27\DLLs、C:\Python27\DLLs)
步骤二:首先利用“SharpDevelop 2.2”对.NET程序集文件进行重新编译
步骤三:如果存在程序集文件的名称与其命名空间不一致,则打开:windows->Preferences->PyDev->Interpreter – IronPython,在Forced Builtins下面手工添加程序集文件的命名空间字段强制编译。
步骤四:在开发环境中导入该程序集的命名空间模块,如下:
import clr
clr.AddReference('ExDataGrid')
import ExDataGridView
例子如下:
加载C# DLL
需要加载的C# DLL源码如下(由于详细实现代码较长,在此省略):
我们需要在IronPython脚本中调用HashCalc函数,Python脚本如下:
详细说明:
clr.AddReferenceToFile(&SimpleHash.dll&) 加载DLL文件from Common import * 导入命名空间由于C#方法HashCalc不是静态方法,需要先定义类,再进行访问,如下:
import clr
clr.AddReference('OprtAnalyse')
import OprtAnalyse
ClaObj = OprtAnalyse.OprtDescription()
OprtDescriptionPy(ClaObj):
def __init__(self):
def add_Oprt_Description1(self,arg1):
ClaObj.SubstationID = arg1
return ClaObj.OprtCatagoryID
若HashCalc为静态方法,则IronPython脚本可直接调用:查看源代码
C#方法参数为byte[]格式,需要将str转换为byte[]格式,否则会报错“TypeError: expected Array[Byte], gotstr”,相互转换代码如下:
由于在播放器的UI变化相对较小,且播放器是网站最重要的页面元素。为了解放一部分手工测试,开发和测试团队推出了一种用低成本对播放器进行快速的回归测试的方法。
人员与职责
(播放器开发leader):负责设计透出接口
(播放器开发):负责实现播放器接口
(测试开发):负责把接口封装成关键字集成到测试平台
(播放器测试):负责编写自动化测试用例
(播放器测试):负责编写自动化测试用例
工作原理简介
普通的webUI自动化测试工具比如QTP、webdriver等只能抓取到页面的html。对于flash页面的抓取无能为力。我们的自动化方案就是通过javascript驱动开发暴露出来的播放器接口进行各种操作、读取,进而封装成易懂通用的关键字供测试人员调用,从而编写自动化测试用例。
此方案离不开开发的全力支持,只有开发为我们开发出来debug版本,测试方案才能进行。总体来说开发给我们提供了2个接口。1个是$call(),通常用来获取播放器里面的某个控件(比如$call(‘TogglePauseButton’))、播放状态(比如$call('state.adState'))、播放器高度(比如$call(‘player.metaData.height’))。另一个是$event(),通常表示要对播放器做某个事件(比如$event(‘TogglePauseButton’’,’click’)表示点击暂停按钮)。开发是整个过程中最重要的角色,是整个项目可行性的先决条件。
语言和工具
语言:javascript、python(非必要,其他任意语言)
工具:flashfirebug(抓取控件用)、robotframework(非必要,我们团队封装的关键字供该测试平台使用,phpunit也可以另外封装)
关键字封装方法
如果开发已经给出了测试版本,方法封装示例如下
def click_flex_element(self, locator):
&&& Clicks display object.
|Click Flex Element|TogglePauseButton| #点击暂停按钮
return self._do_command(&$event('%s','click');&, locator)
此方法的意思是点击某个对象。翻译成js就是
document.getElementById(&tudouPlayer&).$event(&TogglePauseButton&,&click&)
如果开发暴露了接口,直接在浏览器输入上面js就可以触发点击事件。
关键字调用方法
已经封装成关键字了,下面就是在robotframework里面的调用方法。
Case名:播放器播放到20%的时候,点击暂停,播放停止
Case setup:location should be->Selenium2Library |${url} #测试先决条件,浏览器访问地址是一定的
Step1:${state}=|play state->Selenium2LibraryFlexPilot| #获取当前的播放状态
Step2:should be true->BuiltIn|#当前播放状态应该为在播放
Step3:drag and drop seekvideo->Selenium2LibraryFlexPilot|0.2|#拖动播放进度条到20%
Step4:click flex element->Selenium2LibraryFlexPilot|TogglePauseButton|#点击暂停按钮
Step5:${state2}=|play state->Selenium2LibraryFlexPilot|#获取当前播放状态
Step6:should not be true->BuiltIn|${state2}|#当前播放状态应该为没有播放
Step7:${time1}=|get playing time->Selenium2LibraryFlexPilot|#获取当前的播放时间
Step8:sleep->BuiltIn|2|#等待2秒
Step9:${time2}=|get playing time->Selenium2LibraryFlexPilot|#获取当前的播放时间
Step10:should be equal->BuiltIn|${time1}|${time2}|#2次获取的时间应该一致
虽然webdriver不能直接访问flash,但是通过flash暴露接口的办法绕过去直接让js可以访问测试对象,原理也比较简单清楚。在实际推进过程中遇到的最大问题是开发和测试对自动化的理解与沟通。如果能得到开发的支持,后续的技术应该不会存在问题。
由于在播放器的UI变化相对较小,且播放器是网站最重要的页面元素。为了解放一部分手工测试,开发和测试团队推出了一种用低成本对播放器进行快速的回归测试的方法。
人员与职责
(播放器开发leader):负责设计透出接口
(播放器开发):负责实现播放器接口
(测试开发):负责把接口封装成关键字集成到测试平台
(播放器测试):负责编写自动化测试用例
(播放器测试):负责编写自动化测试用例
工作原理简介
普通的webUI自动化测试工具比如QTP、webdriver等只能抓取到页面的html。对于flash页面的抓取无能为力。我们的自动化方案就是通过javascript驱动开发暴露出来的播放器接口进行各种操作、读取,进而封装成易懂通用的关键字供测试人员调用,从而编写自动化测试用例。
此方案离不开开发的全力支持,只有开发为我们开发出来debug版本,测试方案才能进行。总体来说开发给我们提供了2个接口。1个是$call(),通常用来获取播放器里面的某个控件(比如$call(‘TogglePauseButton’))、播放状态(比如$call('state.adState'))、播放器高度(比如$call(‘player.metaData.height’))。另一个是$event(),通常表示要对播放器做某个事件(比如$event(‘TogglePauseButton’’,’click’)表示点击暂停按钮)。开发是整个过程中最重要的角色,是整个项目可行性的先决条件。
语言和工具
语言:javascript、python(非必要,其他任意语言)
工具:flashfirebug(抓取控件用)、robotframework(非必要,我们团队封装的关键字供该测试平台使用,phpunit也可以另外封装)
关键字封装方法
如果开发已经给出了测试版本,方法封装示例如下
def click_flex_element(self, locator):
&&& Clicks display object.
|Click Flex Element|TogglePauseButton| #点击暂停按钮
return self._do_command(&$event('%s','click');&, locator)
此方法的意思是点击某个对象。翻译成js就是
document.getElementById(&tudouPlayer&).$event(&TogglePauseButton&,&click&)
如果开发暴露了接口,直接在浏览器输入上面js就可以触发点击事件。
关键字调用方法
已经封装成关键字了,下面就是在robotframework里面的调用方法。
Case名:播放器播放到20%的时候,点击暂停,播放停止
Case setup:location should be->Selenium2Library |${url} #测试先决条件,浏览器访问地址是一定的
Step1:${state}=|play state->Selenium2LibraryFlexPilot| #获取当前的播放状态
Step2:should be true->BuiltIn|#当前播放状态应该为在播放
Step3:drag and drop seekvideo->Selenium2LibraryFlexPilot|0.2|#拖动播放进度条到20%
Step4:click flex element->Selenium2LibraryFlexPilot|TogglePauseButton|#点击暂停按钮
Step5:${state2}=|play state->Selenium2LibraryFlexPilot|#获取当前播放状态
Step6:should not be true->BuiltIn|${state2}|#当前播放状态应该为没有播放
Step7:${time1}=|get playing time->Selenium2LibraryFlexPilot|#获取当前的播放时间
Step8:sleep->BuiltIn|2|#等待2秒
Step9:${time2}=|get playing time->Selenium2LibraryFlexPilot|#获取当前的播放时间
Step10:should be equal->BuiltIn|${time1}|${time2}|#2次获取的时间应该一致
虽然webdriver不能直接访问flash,但是通过flash暴露接口的办法绕过去直接让js可以访问测试对象,原理也比较简单清楚。在实际推进过程中遇到的最大问题是开发和测试对自动化的理解与沟通。如果能得到开发的支持,后续的技术应该不会存在问题。
嘚啵嘚(可以直接跳过,看正题):
之前在禅道工具练习里遇到个富文本编辑器,在整个html中显示为一个iframe里又嵌套个html,里面就包含两层,如下&html>&body>&body/>&html/>,当时抓瞎,这个文本框怎么没有个&textarea>的标签,没法通过locator元素定位。但是用firebug发现富文本编辑器的功能按钮还是可以识别的,比如B按钮加粗,斜体什么的。点击以后就会在下面文本域中获得光标了,于是就想模拟键盘输入(VBScript下面不是有个SendKeys么),Selenium2Library下面碰巧有个press key方法,但无奈press key需要两个参数locator和key,晕死,本来就找不到文本框,定位毛呀(当然这个在后来证实,直接定位body,往里面写值也是允许的),但是就想用模拟键盘输入实现。
今天看AutoItLibrary库里有个send方法,实验了下,可以实现在光标处输入任何内容。和Selenium2Library下的input text功能类似,但是不需要定位哦。
有时候遇到个问题纠结也没用,先放下,不知道什么时候就碰到解决方法了。
嘚啵嘚(可以直接跳过,看正题):
之前在禅道工具练习里遇到个富文本编辑器,在整个html中显示为一个iframe里又嵌套个html,里面就包含两层,如下&html>&body>&body/>&html/>,当时抓瞎,这个文本框怎么没有个&textarea>的标签,没法通过locator元素定位。但是用firebug发现富文本编辑器的功能按钮还是可以识别的,比如B按钮加粗,斜体什么的。点击以后就会在下面文本域中获得光标了,于是就想模拟键盘输入(VBScript下面不是有个SendKeys么),Selenium2Library下面碰巧有个press key方法,但无奈press key需要两个参数locator和key,晕死,本来就找不到文本框,定位毛呀(当然这个在后来证实,直接定位body,往里面写值也是允许的),但是就想用模拟键盘输入实现。
今天看AutoItLibrary库里有个send方法,实验了下,可以实现在光标处输入任何内容。和Selenium2Library下的input text功能类似,但是不需要定位哦。
有时候遇到个问题纠结也没用,先放下,不知道什么时候就碰到解决方法了。
步骤说明:
步骤1:首先需要创建一个SOAP Client,使用关键字Create Soap Client,该关键字会把wsdl的信息打印到屏幕上,示例如下:
Create Soap Client
步骤2:创建WSDL对象,关键字:Create Wsdl Object(type,name_value_pairs),type必须是wsdl结构中存在的。示例如下:
${WsdlObject}=
Create Wsdl Object
GetWorkSheetStep
步骤3:获取WSDL对象属性值:Get Wsdl Object Attribute(object,name),object即WSDL对象,name是具体属性名称。示例如下:
${SheetGuide_AttributeValue}=
Get Wsdl Object Attribute
${WsdlObject}
步骤4:设置WSDL对象属性值:Set Wsdl Object Attribute(object,name,value),object即WSDL对象,name是具体属性名称,value是设置的属性值,示例如下:
Set Wsdl Object Attribute
${WsdlObject}
49bb465f-bc61-4e5a-a822-fe9
步骤5:OK,当设置完属性值后,就可以发送请求了。关键字:Call Soap Method(name,arg)。
示例如下:Call Soap Method
GetWorkSheetStep
${WsdlObject}
RIDE操作步骤如下:
步骤一:建立好目录以及相应的testsuite,在RIDE窗口中,加载SudsLibrary库,如下图所示:
步骤二:编写测试脚本,首先创建一个soap client(wsdl对象),定义为绑定和网络地址组合的单个端点,如下图所示:
所对应的测试脚本内容如下:
*** Settings ***
SudsLibrary
*** Variables ***
${localhost}
*** Test Cases ***
创建WSDL对象-正常_01
[Documentation]
WSDL对象(例如:l)
Loads a WSDL from the given URL/path and creates a Suds SOAP client.
Create Soap Client
${localhost}
Sets the port to use in future requests. port should be the name or the index of the port as it appears in the WSDL.
Service1Soap
步骤三:创建wsdl对象,调用soap方法,获取接受值,如下图所示:
所对应的测试脚本如下:
[Documentation]
验证GetWorkSheetStep()方法
Creates a WSDL object of the specified type.Requested type must be defined in the WSDL.
${WsdlObject_GetWorkSheetStep}=
Create Wsdl Object
GetWorkSheetStep
Gets the attribute of a WSDL object.
${SheetGuide_AttributeValue}=
Get Wsdl Object Attribute
${WsdlObject_GetWorkSheetStep}
Sets the attribute of a WSDL object.
Set Wsdl Object Attribute
${WsdlObject_GetWorkSheetStep}
49bb465f-bc61-4e5a-a822-fe9
Calls the SOAP method with the given name and args.
Call Soap Method
GetWorkSheetStep
${WsdlObject_GetWorkSheetStep}
${receive_xml}=
Get Last Received
${receive_xml}
步骤说明:
步骤1:首先需要创建一个SOAP Client,使用关键字Create Soap Client,该关键字会把wsdl的信息打印到屏幕上,示例如下:
Create Soap Client
步骤2:创建WSDL对象,关键字:Create Wsdl Object(type,name_value_pairs),type必须是wsdl结构中存在的。示例如下:
${WsdlObject}=
Create Wsdl Object
GetWorkSheetStep
步骤3:获取WSDL对象属性值:Get Wsdl Object Attribute(object,name),object即WSDL对象,name是具体属性名称。示例如下:
${SheetGuide_AttributeValue}=
Get Wsdl Object Attribute
${WsdlObject}
步骤4:设置WSDL对象属性值:Set Wsdl Object Attribute(object,name,value),object即WSDL对象,name是具体属性名称,value是设置的属性值,示例如下:
Set Wsdl Object Attribute
${WsdlObject}
49bb465f-bc61-4e5a-a822-fe9
步骤5:OK,当设置完属性值后,就可以发送请求了。关键字:Call Soap Method(name,arg)。
示例如下:Call Soap Method
GetWorkSheetStep
${WsdlObject}
RIDE操作步骤如下:
步骤一:建立好目录以及相应的testsuite,在RIDE窗口中,加载SudsLibrary库,如下图所示:
步骤二:编写测试脚本,首先创建一个soap client(wsdl对象),定义为绑定和网络地址组合的单个端点,如下图所示:
所对应的测试脚本内容如下:
*** Settings ***
SudsLibrary
*** Variables ***
${localhost}
*** Test Cases ***
创建WSDL对象-正常_01
[Documentation]
WSDL对象(例如:l)
Loads a WSDL from the given URL/path and creates a Suds SOAP client.
Create Soap Client
${localhost}
Sets the port to use in future requests. port should be the name or the index of the port as it appears in the WSDL.
Service1Soap
步骤三:创建wsdl对象,调用soap方法,获取接受值,如下图所示:
所对应的测试脚本如下:
[Documentation]
验证GetWorkSheetStep()方法
Creates a WSDL object of the specified type.Requested type must be defined in the WSDL.
${WsdlObject_GetWorkSheetStep}=
Create Wsdl Object
GetWorkSheetStep
Gets the attribute of a WSDL object.
${SheetGuide_AttributeValue}=
Get Wsdl Object Attribute
${WsdlObject_GetWorkSheetStep}
Sets the attribute of a WSDL object.
Set Wsdl Object Attribute
${WsdlObject_GetWorkSheetStep}
49bb465f-bc61-4e5a-a822-fe9
Calls the SOAP method with the given name and args.
Call Soap Method
GetWorkSheetStep
${WsdlObject_GetWorkSheetStep}
${receive_xml}=
Get Last Received
${receive_xml}
学习selenium的web测试,xpath是定位元素的常用手段。
因为我之前都是用ie8自带的开发人员工具(F12)来查看,xpath基本上手写,多数都用的//,匹配所有符合条件节点,如://div/a[text()='找的就是你'],就是查找页面所有div元素里包含链接a,且显示为‘找的就是你’的对象。
前几天用的火狐的firepath插件,发现百度首页的搜索框给的xpath是.//*[@id='kw'],这个.的作用是?如果指的是当前节点,那么问题来了,当前的节点又是在什么地方定义的呢?带着这个问题我决定搞清楚,并把它写下来,作为知识学习&总结的开始。
PS:强烈建议大家安装火狐下的firepath,因为在xpath:里修改后,点eval或者按回车键,就能验证自己写的xpath能不能找到页面元素,真的是很方便的说。
经过我在firepath中在百度首页实验,.//[@id='kw'],和//[@id='kw']都能定位到搜索框,看来 . 是从整个页面的跟开始定位的,那么想来.//和//真的就没啥区别了。
不知道我的理解是不是有问题,欢迎批评交流。谢谢
学习selenium的web测试,xpath是定位元素的常用手段。
因为我之前都是用ie8自带的开发人员工具(F12)来查看,xpath基本上手写,多数都用的//,匹配所有符合条件节点,如://div/a[text()='找的就是你'],就是查找页面所有div元素里包含链接a,且显示为‘找的就是你’的对象。
前几天用的火狐的firepath插件,发现百度首页的搜索框给的xpath是.//*[@id='kw'],这个.的作用是?如果指的是当前节点,那么问题来了,当前的节点又是在什么地方定义的呢?带着这个问题我决定搞清楚,并把它写下来,作为知识学习&总结的开始。
PS:强烈建议大家安装火狐下的firepath,因为在xpath:里修改后,点eval或者按回车键,就能验证自己写的xpath能不能找到页面元素,真的是很方便的说。
经过我在firepath中在百度首页实验,.//[@id='kw'],和//[@id='kw']都能定位到搜索框,看来 . 是从整个页面的跟开始定位的,那么想来.//和//真的就没啥区别了。
不知道我的理解是不是有问题,欢迎批评交流。谢谢
在公司工作不是太忙时和同事(daibing0527)一起对Robot Framework的当前Selenium2Library V1.6版本的英文关键字文档根据使用理解汉化。因为外语水平一般,也使用了Google翻译的帮助,如果有什么语义问题,欢迎大家扔砖指点。稍后有时候会继续把其它常用类库中文化。
修正关键字错误;
在公司工作不是太忙时和同事(daibing0527)一起对Robot Framework的当前Selenium2Library V1.6版本的英文关键字文档根据使用理解汉化。因为外语水平一般,也使用了Google翻译的帮助,如果有什么语义问题,欢迎大家扔砖指点。稍后有时候会继续把其它常用类库中文化。
修正关键字错误;
1 个问题, 1 人关注

我要回帖

更多关于 python suds 实例 的文章

 

随机推荐