Sk12
Sk12

Reputation: 1

Post Https SOAP request for performing an action in application using robot framework

I wrote this robot framework test to post a https request to a webservice. The request body is in xml format and not in Json. I have used request library for this, but i am receiving error when i post using the code listed below.

With postman, i had send the body as raw data and got response as 200 ok, but when i try to do the same in robot framework its throwing error 404.

Please help me on this:

  1. Is requests library relevant for post of https xml data soap request to a web service?
  2. Can any modification be made to below code for posting a https request to a web service?
  3. Is there any other library through which we could achieve calling soap web service?

The Robot Framework Script

***Library***

Library           String

Library           Collections

Library           RequestsLibrary


***Variables***

${user} =  username

${passwd} =  pwd

&{headers}      Content-Type=application/soap+xml  or text/xml          Authorization=Basic encrypted details

${body_request} =   <s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://schemas.xmlsoap.org/ws/2004/08/addressing"><s:Header><a:Action s:mustUnderstand="1">http://example.com/schemas</a:Action><a:MessageID>msgid</a:MessageID><a:ReplyTo><a:Address>url</a:Address></a:ReplyTo><a:To s:mustUnderstand="1">serviceurl</a:To></s:Header><s:Body xmlns:xsi=body"></s:Body></s:Envelope>


*** Test Cases ***

    ${auth}=  Create List  ${user}  ${passwd}
    Create Session      alias=proc      url=url      headers=${headers}  auth=${auth}
    Sleep     5
    ${resp2}    Post Request  alias=proc   uri=url  data=${body_request}            json=None        params=None         
    headers=${headers}        files=None    allow_redirects=True      timeout=None
        Should Be Equal As Strings  ${resp2.status_code}  200
    Log To Console    ${resp2.status_code}

Upvotes: 0

Views: 2190

Answers (1)

forkdbloke
forkdbloke

Reputation: 1565

Answers to your question mentioned below,

Is requests library relevant for post of https xml data soap request to a web service? - yes, it can be used. however, there are better ways to achieve the same, see the solution below.

Can any modification be made to below code for posting a https request to a web service? - I think it is nothing to do with https, since 400 is bad request, you need to look at the body.

Is there any other library through which we could achieve calling soap web service? - SudsLibrary.

Although, you can make use of requests module to achieve your solution, My philosophy when making use of robotframework is "SIMPLY MAKE USE OF EXISTING LIBRARIES" which is already verified. Please do not spend time to solve the problem keeping the thought process of "using a language".

Solution

Please make use of "SudsLibrary" library for SOAP requests, look at Keyword Documentation for your reference.

SudsLibrary is a library for functional testing of SOAP-based web services. SudsLibrary is based on Suds, a dynamic SOAP 1.1 client.

pip install robotframework-sudslibrary3

When you use the above library your code would be something similar to the one seen below,

*** Settings ***
Library    SudsLibrary
Library    Collections    

*** Test Cases ***
Sample Testcase On SOAP 
    ${BASE_URL}    Set Variable         http://www.someservice.com
    ${SERVICE}     Create Dictionary    
    ...                                 name=someservice    
    ...                                 wsdl=someservice.asmx?WSDL
    ${PORT}        Set variable         SERVICE_PORT
    ${METHOD}      Set variable         CALLSOMEACTION

    Set Binding     SOAP-ENV    http://www.w3.org/2003/05/soap-envelope
    Create Soap Client     ${BASE_URL}/${SERVICE.name}/${SERVICE.wsdl}
    Set Port    ${PORT}

    Set Headers    Content-Type    application/soap+xml
    Set Headers    Authorization   Basic encrypted details
    Set Headers    Soapaction      ${EMPTY}
    Set Headers    Action          "${BASE_URL}/${SERVICE.name}/${METHOD}"

    ${result}      Call Soap Method     ${METHOD}

Upvotes: 1

Related Questions