1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    juillet 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juillet 2012
    Messages : 44
    Points : 20
    Points
    20

    Par défaut SOAP UI : récupérer des données qui sont dans les balises Réponse d'un requete WebService

    Bonjour,

    Je galère un peu sur un projet SOAP UI,
    j'ai un projet en 2 phases :

    Phases 1 :
    Je dois envoyé des données en entrée (provenant d'un fichier (tableau excel)) à SOAP UI, afin que lorsque je lance une requete (WebService) ils récupèrent les données de mon fichiers les insère dans sa requete.

    => Cette partie là j'ai pu trouver une solution, n integran tun dataSource dans mon testCase et en variabilisant mes données dans ma requête (un dataLoop pour automatiser tout ca)

    Phase 2 :
    Je dois récupérer des infos (sur un fichier excel) provenant du XML de la réponse et j'insère les infos dans un fichier
    => Cette partie est à moitié faite et je galère dessus. Pour le moment je sais comment écupérer des données dont je suis sur de leur emplacement avec un XPATH et la dataSink
    Mais pour que vous comprenier mon prob c'est mieux que j'illustre un peu :

    Ma requete a cette forme là :

    <soapenv : Enveloppe url>

    <soapenv : Header/>

    <soapenv : Body>

    <con : getData>

    <NumClient>${dtaSource#NC}</CustNumber>

    </con...>

    </...>


    ...

    Et ma reponse a cette forme là :

    <soapenv : Envelope url>

    <Soapnv : Body>

    <ser-root:getDataResponse url>

    <PivotFichClient>

    <CodePtf>Ptf</CodePtf>

    </PivotFichClient>

    <PivotContrat>

    <NumContrat>NumContrat1</NumContrat>

    </PivotContrat>

    <PivotContrat>

    <NumContrat>NumContrat2</NumContrat>

    </PivotContrat>

    <tns3:GetFonds>....</tns3:GetFonds>


    J'aimerais récupére le numéro des contrats, or le nombre d econtrats qui vont sortir dans ma réponse dépend de mon NumClient, le client peut avoir 1 contrat, 2, 3, 6,...

    Je sais récupérer le CodePtf parce qu'il y en a tojorus un et qu'il et bien enadré dans sa balise, avec un XPATH assertion :

    Je le déclare :
    declare namespace con='http://DVSSNEIP01.ppmail.ppservices.a xa-tech.intraxa/ConnaissanceClient';
    //con:getDataResponse[1]/PivotFicheClient[1]/CodePtf[1]


    Et là c'est sa valeur que je récupère dans le dataSink
    ${getDataRequest#Response#decl are namespace ser-root='http://DVSSNEIP01.ppmail.ppservices.a xa-tech.intraxa/ConnaissanceClient';
    //ser-root:getDataResponse[1]/PivotFicheClient[1]/CodePtf[1]}


    Mais comment je peux récupérer la liste des contrats pour chaque client ?


    Bien cordialement.

  2. #2
    Membre chevronné
    Inscrit en
    octobre 2011
    Messages
    1 043
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 1 043
    Points : 1 813
    Points
    1 813

    Par défaut

    <soapenv : Enveloppe url>
    D'abord et presque hors du sujet, étant xml, il n'y a pas de liberté d'insérer espace blanc dans un nom qualifié de balise: soapenv:Envelope (étant correct) ne peut pas s'écrire comme soapenv : Envelope (étant tout à fait faux). Il faut y faire attention.

    Bref, je trouve partout où il y a de préfixe il y a de confusion: con, ser-root ... C'est pour ça, je veux bien présenter des pistes de solution sans; et heureusement c'est possible si on ne s'intéresse que PivotContrat.

    Supposons la variable response au-dessous soit la réponse reçue étant du type de org.w3c.dom.Document, on peut faire comme ça avec et je suppose aussi que vous utilisez Groovy vu que SOAP UI soit mentionné - il faut d'ailleurs préciser le langage dans la question malgré tout et avant tout.
    Code groovy : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //response - soit donné et du type org.w3c.dom.Document
     
    XPath xpath=XPathFactory.newInstance().newXPath()
     
    String query="//PivotContrat/NumContrat"
     
    NodeList nodelist=xpath.evaluate(query, response, XPathConstants.NODESET)
    List<String> list=nodelist.collect{node->node.textContent}
     
    for (String s:list) {
        //faire travailler s comme vous voulez
        //et au titre d'exemple seulement
        println("<x>${s}</x>")
    }
    Voilà l'essentiel, il faut s'adapter un peu à partir de ça.

  3. #3
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    juillet 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juillet 2012
    Messages : 44
    Points : 20
    Points
    20

    Par défaut

    Bonjour,

    Déjà merci pour la réponse :
    J'ai essayé de reproduire votre code, mais il me retourne une erreur, en voici un extrait :
    Script1.groovy: 1: unable to resolve class XPath
    @ line 1, column 7. XPath xpath=XPathFactory.newInstance().newXPath() ^ org.codehaus.groovy.syntax.SyntaxException: unable to resolve class XPath
    @ line 1, column 7. at org.codehaus.groovy.ast.ClassCodeVisitorSupport.addError(ClassCodeVisitorSupport.java:146)

    Je ne maîtrise pas trop la programmation sur soap ui, je me disais bien qu'il fallait que je rajoute un étape groovy à mon test case et je pensais qu'il faudrait que je fasse une boucle. J'ai l'impression qu'il ne reconnait pas les objets XPATH, est ce qu'il y a une librairie à ouvri avant?

    Bien cordialment.

  4. #4
    Membre chevronné
    Inscrit en
    octobre 2011
    Messages
    1 043
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 1 043
    Points : 1 813
    Points
    1 813

    Par défaut

    Je dirais mettre des expressions nécessaires d'import au début du script si c'est pas encore fait.
    Code groovy : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import javax.xml.parsers.*;
    import javax.xml.xpath.*;
    import org.w3c.dom.*;

  5. #5
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    juillet 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juillet 2012
    Messages : 44
    Points : 20
    Points
    20

    Par défaut

    Merci,

    Effectivement cette ligne de commande passe.
    Par contre je ne sais pas pouquoi il bloque toujours.
    Pour moi le retour qui se fait s'apelle Response, mais il semble ne pas el reconnaitre, et mem quand je mt GetDataResponse il rejette j'ai voulu faire un screenshot pour envoyer pour montrer comment son nommer mes fichies mais imposible de charger.
    je vais donc essayer de décrire l'arborescence.
    Dans mon projet Soap UI :
    Projet Soap UI
    WSDL qui s'appelle ConnaissanceClient
    getDate
    Request1
    TestSuite
    TestCase
    Test Steps
    jddCCEV : DataSource qui récupère les donnes d'entrée qui seront ensuit eintégréer à ma requete getDataRequest
    getDataRequest : Là se trouve ma requete et lorsque j'execute j'ai une reponse
    CCEV3Sortie : là se trouve ma sortie
    Groovy Script : là se trouve le script

    Mais el script me renvoie le message d'erreur suivant :
    groovy.lang.MissingPropertyException: No such property: Respobse dor class Script12 error at line: 11

    J'ai essayé en mettant getDataResponse à l'imae du GetDataRequest, mais j'ai toujurs la même erreur c'est comme si il ne retrouvait pas la réponse.
    En soap pourtant le rtour d'une Request c'est Response?

    Bien ordialement.

  6. #6
    Membre chevronné
    Inscrit en
    octobre 2011
    Messages
    1 043
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 1 043
    Points : 1 813
    Points
    1 813

    Par défaut

    Et ma reponse a cette forme là :
    Supposons la variable qui détient la réponse s'appelle response (elle peut être appelée reponse, réponse, ou je ne sais quoi...): mettons response pour être définitive. Qu'est-ce que ça donne ?
    Code groovy : Sélectionner tout - Visualiser dans une fenêtre à part
    println response.getClass()

  7. #7
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    juillet 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juillet 2012
    Messages : 44
    Points : 20
    Points
    20

    Par défaut

    Citation Envoyé par tsuji Voir le message
    Supposons la variable qui détient la réponse s'appelle response (elle peut être appelée reponse, réponse, ou je ne sais quoi...): mettons response pour être définitive. Qu'est-ce que ça donne ?
    Code groovy : Sélectionner tout - Visualiser dans une fenêtre à part
    println response.getClass()
    Excuse moi, mais je n'ai pas cmpris,
    en fait le problème c'est qu eje ne sais pas comment il l'appell la réponse à ma requet j'tais persuadr que c'était getDataResponse, puique qd je delarais un Xpath quicorrespondait à une variable de m aréponse c'est ce qu'il utilisait pour désigner ma réponse.
    Maintenant quoique je dise il me dit toujour la meme choses :

    No such property: getDataResponse(ou response ou Reponse,...) for class: Script22 error at line 9

  8. #8
    Membre chevronné
    Inscrit en
    octobre 2011
    Messages
    1 043
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 1 043
    Points : 1 813
    Points
    1 813

    Par défaut

    Ça aide si on montre le script en question?

  9. #9
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    juillet 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juillet 2012
    Messages : 44
    Points : 20
    Points
    20

    Par défaut

    Citation Envoyé par tsuji Voir le message
    Ça aide si on montre le script en question?
    Bonjour,

    j'ai vraiment repris le script tel quel :

    import javax.xml.parsers.*;
    import javax.xml.xpath.*;
    import org.w3c.dom.*;

    XPath xpath=XPathFactory.newInstance().newXPath()

    String query="//PivotContrat/NumContrat"

    NodeList nodelist=xpath.evaluate(query, response, XPathConstants.NODESET)

  10. #10
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    juillet 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juillet 2012
    Messages : 44
    Points : 20
    Points
    20

    Par défaut

    je rajoute des PJ

    Nom : ProjetSoap.jpg
Affichages : 565
Taille : 369,8 Ko
    Nom : ProjetSoap2.png
Affichages : 576
Taille : 1,93 Mo
    Nom : ProjetSoap3.png
Affichages : 580
Taille : 1,92 Mo

  11. #11
    Membre chevronné
    Inscrit en
    octobre 2011
    Messages
    1 043
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 1 043
    Points : 1 813
    Points
    1 813

    Par défaut

    Dans le "Test Steps (n)" où se trouve le Groovy Script genre (je ne sais quel nom ou quel indice, peu importe), c'est impossible de ne pas préparer pour réussir à retenir la réponse ! Forcément, copié mon démo script-là comme tel, ça ne peut pas réussir. (Il faut consulter, même étudier, la documentation pour y arriver, la préparation.)

    Une approche pourrait paraître comme ça... (mais ça dépend encore de beaucoup ce que vous avez concrètement)
    Code groovy : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def groovyUtils=new com.eviware.soapui.support.GroovyUtils(context)
    //là "getData" est supposé d'être le nom de l'étape pour faire la requête; verifiez-la !
    def holder = groovyUtils.getXmlHolder(
        testRunner
        .testCase.testSteps["getData"]
        .testRequest.response.getContentAsXml()
    );
    List<String> list=holder.getDomNodes("//PivotContrat/NumContrat").collect{node->node.getFirstChild().nodeValue}
    for (String s: list) {
        log.info s
    }
    Ici, je crois je tends plutôt vers le style, comme dire, de com.eviware.soapui Groovy et bien moins java-centric Groovy, et c'est pour ça que l'emploi de xpath puisse paraître très différent... mais au fond c'est la même, grâce aux standards w3c encore bien respectés, sinon c'est le chaos.

  12. #12
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    juillet 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juillet 2012
    Messages : 44
    Points : 20
    Points
    20

    Par défaut

    Citation Envoyé par tsuji Voir le message
    Dans le "Test Steps (n)" où se trouve le Groovy Script genre (je ne sais quel nom ou quel indice, peu importe), c'est impossible de ne pas préparer pour réussir à retenir la réponse ! Forcément, copié mon démo script-là comme tel, ça ne peut pas réussir. (Il faut consulter, même étudier, la documentation pour y arriver, la préparation.)

    Une approche pourrait paraître comme ça... (mais ça dépend encore de beaucoup ce que vous avez concrètement)
    Code groovy : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def groovyUtils=new com.eviware.soapui.support.GroovyUtils(context)
    //là "getData" est supposé d'être le nom de l'étape pour faire la requête; verifiez-la !
    def holder = groovyUtils.getXmlHolder(
        testRunner
        .testCase.testSteps["getData"]
        .testRequest.response.getContentAsXml()
    );
    List<String> list=holder.getDomNodes("//PivotContrat/NumContrat").collect{node->node.getFirstChild().nodeValue}
    for (String s: list) {
        log.info s
    }
    Ici, je crois je tends plutôt vers le style, comme dire, de com.eviware.soapui Groovy et bien moins java-centric Groovy, et c'est pour ça que l'emploi de xpath puisse paraître très différent... mais au fond c'est la même, grâce aux standards w3c encore bien respectés, sinon c'est le chaos.

    Bonjour,

    alors en m'inspirant de ton code et e cherchan taussi sur le net pour comprendre les fonctions pour adapter à mon code j'ai modifié le script comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    import javax.xml.parsers.*;
    import javax.xml.xpath.*;
    import org.w3c.dom.*;
    import java.util.*
     
    //  Aide developpez.net
     
    XPath xpath=XPathFactory.newInstance().newXPath()
     
    def groovyUtils=new com.eviware.soapui.support.GroovyUtils(context)
     
    def reponseHolder = groovyUtils.getXmlHolder( testRunner.testCase.testSteps["getDataRequest"].testRequest.response.getContentAsXml());
     
    reponseHolder.namespaces["ser-root"]="http://url/ConnaissanceClient"
    String monXML = reponseHolder.getNodeValue["ser-root:getDataResponse/ser-root:PivotContrat"];
     
     
    List<String> list=reponseHolder.getDomNodes("//PivotContrat/NumContrat").collect{node->node.getFirstChild().nodeValue}
    for (String s: list) {
        log.info s
    }
    Par contre le script ne me renvoie rien (pas d'erreur mais pas de xml).

    Je ne comprend pas pourquoi il ne trouve pas mon noeud

  13. #13
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    juillet 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juillet 2012
    Messages : 44
    Points : 20
    Points
    20

    Par défaut

    Je commence un peu à comprendre le langage,
    jai essayé de modifier un peu du coup le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    import javax.xml.parsers.*;
    import javax.xml.xpath.*;
    import org.w3c.dom.*;
    import java.util.*
     
    //  Aide developpez.net
     
    XPath xpath=XPathFactory.newInstance().newXPath()
     
    def groovyUtils=new com.eviware.soapui.support.GroovyUtils(context)
     
    /*def reponseHolder = groovyUtils.getXmlHolder( testRunner.testCase.testSteps["getDataRequest"].testRequest.response.getContentAsXml());
     
    reponseHolder.namespaces["ser-root"]="url"
    List<String> monXML = reponseHolder.getNodeValue("//*:ser-root/*:PivotContrat");
     
    if( reponseHolder != null)
    {
    	//log.info("Response : ("Reponse : ${monXML}")
    }
     
    else
    {
    	log.info("Response returning null")
     
    }
    */
     
     
    def holder = groovyUtils.getXmlHolder(
        testRunner
        .testCase.testSteps["getDataRequest"]
        .testRequest.response.getContentAsXml())
     
    List<String> list=holder.getDomNodes("//PivotContrat").collect{node->node.getFirstChild().nodeValue}
     
    log.info("La liste est :${list}")
    par contre il me renvoit une liste avec des champs vide :

    Log Output :

    Wed Nov 30 12:17:01 CET 2016:INFO:La liste est :[ , , , ]


    avant il me renvoyait :

    Wed Nov 30 12:06:01 CET 2016:INFO:La liste est :[]

  14. #14
    Membre chevronné
    Inscrit en
    octobre 2011
    Messages
    1 043
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 1 043
    Points : 1 813
    Points
    1 813

    Par défaut

    Je regards un peu plus près l'image no1 et ce n'est pas étonnant le script montré ne donne rien. La notion de namespace vous écharpe encore largement pour le moment mais vous pouvez toujours rattraper plus tard. Et il y a d'erreurs, à part de namespace, de simple précision sur le nom (NumeroContrat et non pas NumContrat dit auparavant), getNodeValue comme fonction () plutôt que du genre map [] etc... comme c'est fâcheux!

    Voici une version qui peut donner quelque chose au lieu de rien, contournant l'issue de namespace pour plus tard si nécessaire. Simple copier et coller devrait marcher, sans import, san rien d'autres.
    Code groovy : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def groovyUtils=new com.eviware.soapui.support.GroovyUtils(context)
    def reponseHolder = groovyUtils.getXmlHolder( testRunner.testCase.testSteps["getDataRequest"].testRequest.response.getContentAsXml())
    List<String> list=reponseHolder.getDomNodes("//*:PivotContrat/*:NumeroContrat").collect{node->node.getFirstChild().nodeValue}
    for (String s: list) {
        log.info s
    }

  15. #15
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    juillet 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juillet 2012
    Messages : 44
    Points : 20
    Points
    20

    Par défaut

    Super ,
    Merci bien ca marche, mais pourquoi il me le met pas sous forme de liste,
    Il ressort comme ca dans les logs :

    Wed Nov 30 13:57:02 CET 2016:INFO:0000000071482717
    Wed Nov 30 13:57:02 CET 2016:INFO:0000000075563517
    Wed Nov 30 13:57:02 CET 2016:INFO:0000000097625417
    Wed Nov 30 13:57:02 CET 2016:INFO:0000015200687280


    Donc effectivement il m'a bien récupérer le numero de mes contrats.
    Et il me les a bien affiché.
    Je voudrais bien envoyer par exemple pour chaque test le résultat dans un fichier excel de préférence, dans un autre fichier csv ou txt au pire.
    J'aimerais que sur une ligne il mette :
    Numclient1, Contrat1, FamilleProduit
    Numclient1, Contrat2, FamilleProduit
    Numclient1, Contrat3, FamilleProduit
    Numclient1, Contrat4, FamilleProduit

    Vous connaisez une fonction qui écris dans un fchier sur Groovy? Je susi en train d'essayé d'avoir aussi un autre format d'affichage

  16. #16
    Membre chevronné
    Inscrit en
    octobre 2011
    Messages
    1 043
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 1 043
    Points : 1 813
    Points
    1 813

    Par défaut

    Un simple google est facilement à trouver des trucs pour dépouiller ce genre de besoin, par exemple ceci:
    http://docs.groovy-lang.org/latest/h...g-with-io.html
    ou bien d'autres.

    Je ne sais pas quoi l'histoire de Numclientx, FamilleProduitx etc. mais en principe c'est pas trop difficile à concevoir des formatages alternatifs plutôt que log.info s ou faire sortir plus d'information via une requête xpath plus élaborée. Je vous laisse à faire la libre pédale de créativité.

Discussions similaires

  1. [PHP 5.4] récupérer des données qui se trouvent dans un fichier JSON
    Par aspkiddy dans le forum Langage
    Réponses: 12
    Dernier message: 28/04/2015, 15h43
  2. Réponses: 5
    Dernier message: 18/08/2014, 18h00
  3. Comment récupérer des données qui se trouve dans un intranet
    Par mea4502 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 05/02/2013, 13h58
  4. Réponses: 3
    Dernier message: 07/04/2010, 18h27
  5. Comment éviter que google répete des mots qui sont dans la description du meta tag
    Par tese84 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 18/09/2006, 07h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo