Search code examples
pythonxmlsoaprobotframeworkcdata

Roboframework CDATA xml with request library


I am trying to automate test for soap/xml messages with request library. If have tried other libraries but there I run into problems (mainly lacking the possibility of accessing the WSDL with an URL). I have succes with request library in the sennse that I manage to send in a message and get the response message back. So far so good, but there is one problem with the response I get in my logging. One of the tags in the response has a <[!CDATA[]] part, which is not correctly formatted in the response. This makes it very cumbersome to retrieve the content of the response, if not impossible. I tried to see if parsing into xml would work, but I get just the same. I hope someone has a good suggestion to get the response back in a correct format. See below for my robot script and the expected and actual response I get in robot (everything is edited as to not share any sensitive data).

Robot script:

 *** Settings ***
 Library     RequestsLibrary
 Library     Collections
 Library     SeleniumLibrary
 Library     String
 Library     OperatingSystem
 Library     XML     use_lxml=${TRUE}
 Library    SoapLibrary
 Resource    ../Resources/Inputs/cardscan240xml.robot
 *** Variables ***
omitted
*** testcases ***
create session  CardScan    ${base_url}
#Create Request Headers
${request_header}=    create dictionary               SOAPAction="document/http://xxxx.com/CustomUI:xxxxxxxxxxMember"  Content-Type=text;charset=utf-8
#Send the XML request body
${SAVE_Response}=    Post Request     CardScan    ${channel_url}    headers=${request_header}    data=${CARDSCAN}
#Log Response and Status Code Details
log to console    ${SAVE_Response.status_code}
log    ${SAVE_Response.headers}
log     ${SAVE_Response.text}

This is how I get it in robot framework

The response I should get back (this is how I got it from soapui.):

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <SOAP-ENV:Body>
   <ns:xxxxxxxxxxxLoyaltyMember_Output xmlns:ns="http://xxxx.com/xxxUI">
     <ns:MessageType>0250</ns:MessageType>
     <ns:MessageXML><![CDATA[<?xml version="1.0" encoding="UTF-8"?><PrivateData><LoyaltyMessageNumber2><Customer xxxxID="5563" xxxID="1" xxxID="1254" xxxType="2" BusinessDate="2005/02/16"><LoyaltyInfo FirstName="Chris" CardID="2600787879882" HomeStore="" CardStatus="00" ServerDate="2021/07/07" CardIDType="P" LastName="xxxxkoren"><EligibleOffers></EligibleOffers><Segments><xxxxID="4"></Seg><xxxx="4"></Seg></Segments><Accounts><xxxxID="1000" Value="181"></Acc></Accounts><Email>[email protected]</Email><EmailValidFlag>Y</EmailValidFlag><EReceiptFlag></EReceiptFlag></LoyaltyInfo></Customer></LoyaltyMessageNumber2><xxxxxxxCustomerInfo FreeCustomerInfo3="" FreeCustomerInfo4="" FreeCustomerInfo1="" FreeCustomerInfo5="" FreeCustomerInfo2=""></xxxxxCustomerInfo><xxxxxxInvoiceData Address2="" Address5="" CustomerName="Chris  Tester" VatNr="" CustomerNumber="111111111" Address1="" Address4="" CompanyName="" Address3=""></xxxxxInvoiceData></PrivateData>]]></ns:MessageXML>
     <ns:ResponseCode>00</ns:ResponseCode>
  </ns:xxxxxxxxLoyaltyMember_Output>
 </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

This is how I get it in Robot framework:

POST Response : url=https://xxxxxxvsbl.nl.xxxxxx.net:8113/xxi_anxx_xxu/xxxxxxt.swe?SWEExtSource=AnonWebService&SWEExtCmd=Execute 
 status=200, reason= 
 body=<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:SOAP- 
 ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema- 
 instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><SOAP-ENV:Body> 
 <ns:xxxxxInboundLoyaltyMember_Output xmlns:ns="http://xxxxx.com/xxxxxUI"> 
 <ns:xxxxxxType>0250</ns:xxxxxType><ns:MessageXML>&lt;?xml version=&quot;1.0&quot; 
 encoding=&quot;UTF-8&quot;?&gt;&lt;PrivateData&gt;&lt;xxxxxxNumber2&gt;&lt;Customer 
 xxxxxID=&quot;124&quot; xxxxxD=&quot;1&quot; xxxxxID=&quot;124&quot;xxxxxType=&quot;2&quot; 
 BusinessDate=&quot;2005/02/16&quot;&gt;&lt;LoyaltyInfo FirstName=&quot;Chris&quot; 
 CardID=&quot;211111111879882&quot; HomeStore=&quot;&quot; CardStatus=&quot;00&quot; 
 ServerDate=&quot;2021/07/07&quot; CardIDType=&quot;P&quot;LastName=&quot;xxxxxelkoren&quot;&gt;&lt;EligibleOffers&gt;&lt;/EligibleOffers&gt;&lt;Segments&gt;& 
 lt;Seg ID=&quot;4&quot;&gt;&lt;/Seg&gt;&lt;Seg ID=&quot;4&quot;&gt;&lt;/Seg&gt;&lt;/Segments&gt;&lt;Accounts&gt;&lt;Acc ID=&quot;1000&quot; Value=&quot;181&quot;&gt;&lt;/Acc&gt;&lt;/Accounts&gt;&lt;Email&gt;[email protected]&lt;/Email&gt;&lt;EmailValidFlag&gt;Y&lt;/EmailValidFlag&gt;&lt;EReceiptFlag&gt;&lt;/EReceiptFlag&gt;&lt;/LoyaltyInfo&gt;&lt;/Customer&gt;&lt;/xxxxxxMessageNumber2&gt;&lt;xxxxxxCustomerInfo FreeCustomerInfo3=&quot;&quot; FreeCustomerInfo4=&quot;&quot; FreeCustomerInfo1=&quot;&quot; FreeCustomerInfo5=&quot;&quot; FreeCustomerInfo2=&quot;&quot;&gt;&lt;/xxxxxxCustomerInfo&gt;&lt;xxxxxxxInvoiceData Address2=&quot;&quot; Address5=&quot;&quot; CustomerName=&quot;Chris  Tester&quot; VatNr=&quot;&quot; CustomerNumber=&quot;2600787879882&quot; Address1=&quot;&quot; Address4=&quot;&quot; CompanyName=&quot;&quot; Address3=&quot;&quot;&gt;&lt;/xxxxxxxxInvoiceData&gt;&lt;/PrivateData&gt;
 </ns:MessageXML>
 <ns:ResponseCode>00</ns:ResponseCode>
    </ns:xxxxxxInboundLoyaltyMember_Output>
    </SOAP-ENV:Body></SOAP-ENV:Envelope> 

Sorry, I struggle to get the robot response very readable, but I do hope that it is clear that the regular tags pose no problem. But that the CDATA tag and the double quotes within the cdata part are not readable. I hope someone has a suggestion to fix this.


Solution

  • With the xml library, the CDATA is automatically deleted and the corresponding part is encoded, cf https://www.freeformatter.com/xml-escape.html

    ' is replaced with &apos;
    " is replaced with &quot;
    & is replaced with &amp;
    < is replaced with &lt;
    > is replaced with &gt;
    

    If you want to make it nicer, you can treat the xml as a string and then replace these tags with :

    .replace("&lt;","<").replace("&gt;",">").replace("&amp;","&") etc...
    

    Otherwise, i think some method exists : https://wiki.python.org/moin/EscapingXml