2016-07-27 13 views
0

Dies ist eine Fortsetzung für diese Fragen: Creating Soap messages with objectTypes using SUDS library in Robot FrameworkErstellen von SOAP-Nachrichten mit Object mit SUDS Bibliothek und MessagePlugin in Robot Framework

Dort wurde es mit RF SUDS festgestellt, dass es nicht möglich ist, zu erstellen, um Nachrichten mit Object allein SUDS verwenden. Ich mag den MessagePlugin Ansatz versuchen, aber leider ist die Informationen in der Dokumentation ist nicht ganz genug für mich:

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) 

Hat jemand ein komplettes Roboter-Beispiel dafür, wie das obige Snippet benutzen? Was sollte ich als Kontext weitergeben? Muss ich irgendwann attach_my_plugin() aufrufen?

Antwort

1

Eine allgemeine Beschreibung der Nachrichten-Plugins finden Sie in der Suds documentation. Weitere Details finden Sie in der class documentation. Sie rufen Marshall nicht auf, Schaum. Um besser zu verstehen, wie die Marshalled-Methode implementiert wird, lesen Sie die Dokumentation für Element. Ein Suds-Plugin ist im Wesentlichen ein Listener. In meinem Beispiel wird ein öffentlicher Webdienst zur Demonstration verwendet.

Sagen Sie Ihre Anfrage wie folgt aussieht:

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

Aber man muss es so aussehen:

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

hier ein Plugin ist, dass das type-Attribut auf das GetStatistics Element hinzufügt. Dies kann erforderlich sein, wenn ein Element über untergeordnete Elemente und Attribute verfügt. Suds 0.4 unterstützt dies nicht, aber es ist eine gültige SOAP. Es kann eine Abzweigung von Suds geben, die dies unterstützt.

*** 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 

Inhalt von 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 

Das type-Attribut wird immer so lange eingestellt werden, wie das Plugin Mein Plugin mit dem Schlüsselwort anhängen angebracht ist. Es gibt einen Standardtyp. Um den Wert von type zu ändern, wird das Schlüsselwort Set GetStats Type verwendet. Jeder Typsatz wird in allen zukünftigen Anforderungen verwendet, bis er geändert wird. Der einzige Grund, warum hier zwei Klassen verwendet werden, besteht darin, zu verhindern, dass "marshalled" zu einem exponierten Schlüsselwort wird.