带有请求库的Roboframework CDATA xml



我正在尝试使用请求库自动测试soap/xml消息。如果我尝试过其他库,但遇到了问题(主要是缺乏使用URL访问WSDL的可能性(。我成功地使用了请求库,因为我设法发送了一条消息并得到了响应消息。到目前为止还不错,但我在日志中得到的响应有一个问题。响应中的标签之一具有<[!CDATA[]部分,该部分在响应中的格式不正确。这使得检索响应的内容非常麻烦,如果不是不可能的话。我试着看看解析成xml是否可行,但我得到了同样的结果。我希望有人能提出一个好的建议,以正确的格式回复。请参阅下面的机器人脚本以及我在机器人中得到的预期和实际响应(所有内容都经过编辑,不共享任何敏感数据(。

机器人脚本:

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

这就是我在机器人框架中获得它的方式

我应该得到的回复(这就是我从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>c.xxxxxxxxx22@eu.xxxxxx.com</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>

这就是我在机器人框架中获得它的方式:

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;c.xxxxxkoren22@eu.xxxxxx.com&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> 

对不起,我很难让机器人的响应非常可读,但我确实希望它清楚地表明,常规标签不会造成问题。但是CDATA标记和CDATA部分中的双引号是不可读的。我希望有人能提出解决这个问题的建议。

使用xml库,CDATA会自动删除,并对相应的部分进行编码,cfhttps://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;

如果你想让它变得更好,你可以把xml当作一个字符串,然后用替换这些标签

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

否则,我认为存在一些方法:https://wiki.python.org/moin/EscapingXml

最新更新