2016-07-27 132 views
0

这是一个延续了这个问题,创建使用肥皂水库和MessagePlugin对象类型的SOAP消息:Creating Soap messages with objectTypes using SUDS library in Robot Framework在机器人框架

在那里它被确定与RF肥皂水就不可能创造与单独使用肥皂水对象类型的信息。我想试试MessagePlugin办法,但遗憾的是在文档中的信息是不太够我:

from robot.libraries.BuiltIn import BuiltIn 
from suds.plugin import MessagePlugin 

class _MyPlugin(MessagePlugin): 
    def marshalled(self, context): 
     body = context.envelope.getChild('Body') 
     foo = body[0] 
     foo.set('id', '12345') 
     foo.set('version', '2.0') 

class SudsLibraryExtensions(object): 
    def attach_my_plugin(self): 
     client = BuiltIn().get_library_instance("SudsLibrary")._client() 
     # prepend so SudsLibrary's plugin is left in place 
     plugins = client.options.plugins 
     if any(isinstance(x, _MyPlugin) for x in plugins): 
      return 
     plugins.insert(0, _MyPlugin()) 
     client.set_options(plugins=plugins) 

有没有人对如何使用上面的代码中任何完整的机器人的例子吗?我应该把什么作为上下文进行编组?我需要在某个时候调用attach_my_plugin()吗?

回答

1

消息插件的一般描述可以在Suds documentation中找到。更多细节请见class documentation。你不打电话给编组,泡沫是。为了更好地理解如何实现编组方法,请阅读Element的文档。泡沫插件本质上是一个监听器。我的示例使用公共Web服务进行演示。

说出你的要求是这样的:

... 
<ns0:Body> 
    <ns1:GetStatistics> 
     <ns1:X> 
... 

但你需要它看起来像这样:

.... 
<ns0:Body> 
    <ns1:GetStatistics type="specialType"> 
     <ns1:X> 
... 

下面是添加类型属性的GetStatistics元素的插件。当元素包含子元素和属性时,这可能是必要的。 Suds 0.4不支持这个,但它是有效的SOAP。可能有一个Sud的分支支持这一点。

*** Settings *** 
Library   SudsLibrary 
Library   c:/SudsLibraryExtensions.py 

*** Test Cases *** 
Message Plugin 
    Create Soap Client http://www.webservicex.net/Statistics.asmx?WSDL 
    Attach My Plugin 
    Set GetStats Type specialType 
    ${dbl array}= Create Wsdl Object ArrayOfDouble 
    Append To List ${dbl array.double} 2.0 
    Append To List ${dbl array.double} 3.0 
    ${result}= Call Soap Method GetStatistics ${dbl array} 
    Should Be Equal As Numbers ${result.Average} 2.5 

的C含量:/SudsLibraryExtensions.py:

from robot.libraries.BuiltIn import BuiltIn 
from suds.plugin import MessagePlugin 

class _MyPlugin(MessagePlugin): 

    def __init__(self): 
     self._type = 'defaultType' 

    def marshalled(self, context): 
     body = context.envelope.getChild('Body') 
     call = body.getChild('GetStatistics') 
     call.set('type', self._type) 

    def set_getstats_type(self, value): 
     self._type = value 

class SudsLibraryExtensions(object): 
    def attach_my_plugin(self): 
     client = BuiltIn().get_library_instance("SudsLibrary")._client() 
     plugins = client.options.plugins 
     if any(isinstance(x, _MyPlugin) for x in plugins): 
      return 
     # prepend so SudsLibrary's plugin is left in place 
     plugins.insert(0, _MyPlugin()) 
     client.set_options(plugins=plugins) 

    def set_getstats_type(self, value): 
     self._get_plugin().set_getstats_type(value) 

    def _get_plugin(self): 
     client = BuiltIn().get_library_instance("SudsLibrary")._client() 
     plugins = client.options.plugins 
     my_plugin = next((plugin for plugin in plugins if isinstance(plugin, _MyPlugin)), None) 
     if my_plugin is None: 
      raise RuntimeError("Plugin not found. Did you call Attach My Plugin?") 
     return my_plugin 

type属性将始终使用,只要该插件被安装与关键字附加我的插件设置。有一个默认类型。要更改类型的值,使用关键字Set GetStats Type。任何类型集将被用于所有未来的请求,直到它被更改。这里使用两个类的唯一原因是为了防止“编组”成为暴露的关键字。