在Robot框架中使用SUDS库和MessagePlugin创建对象类型的Soap消息

在Robot框架中使用SUDS库和MessagePlugin创建对象类型的Soap消息,soap,robotframework,suds,Soap,Robotframework,Suds,这是这个问题的延续: 在那里,确定使用RF肥皂水不可能单独使用肥皂水创建具有ObjectType的消息。我想尝试MessagePlugin方法,但遗憾的是文档中的信息对我来说还不够: from robot.libraries.BuiltIn import BuiltIn from suds.plugin import MessagePlugin class _MyPlugin(MessagePlugin): def marshalled(self, context):

这是这个问题的延续:

在那里,确定使用RF肥皂水不可能单独使用肥皂水创建具有ObjectType的消息。我想尝试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()?

中可以找到消息插件的一般说明。更多细节请参阅。你不需要调用marshaled,suds需要调用。为了更好地理解如何实现封送方法,请阅读的文档。suds插件本质上是一个监听器。我的示例使用公共web服务进行演示

假设您的请求如下所示:

...
<ns0:Body>
    <ns1:GetStatistics>
      <ns1:X>
...
....
<ns0:Body>
    <ns1:GetStatistics type="specialType">
      <ns1:X>
 ...
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
只要插件附加了关键字Attach My plugin,type属性就会一直被设置。有一个默认类型。要更改type的值,请使用关键字Set GetStats type。任何类型集都将在以后的所有请求中使用,直到它被更改为止。这里使用两个类的唯一原因是防止“封送”成为公开关键字

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