[Webtest] Reading values from an XML File

Matt Raible webtest@lists.canoo.com
Wed, 8 Oct 2003 12:38:29 -0600


I'm trying to implement this - exactly as you have below - and I'm 
getting a StackOverFlow on super.execute();

public void doExecute(final Context context) throws Exception {
         super.execute(context);

I tried removing it, and it seems to run, but now I get:

No match for xpath expression <//Menus/Menu[0]/@page>

My menu-config.xml looks like this:

<MenuConfig><Menus><Menu name="" page=""/></Menus></MenuConfig>

Thanks,

Matt

On Tuesday, October 7, 2003, at 09:34 PM, Daniel Potter wrote:

> Matt,
> Here is the code for a custom WebTest step that would do what I 
> mentioned in
> my previous email (I didn't try to compile it, but it should work).  
> Just drop
> it in the src/com/canoo/webtest/extension directory, run
> WebTest's "clean_compile" target, and add it to the 
> webtestTaskdefs.properties
> file.
>
> Then use it in your script like this:
>
>     <target name="displayMenus">
>     <testSpec name="">
>     <config ... />
>     <steps>
>       <loadXml file="${basedir}/defaultroot/WEB-INF/menu-config.xml"/>
>       <repeat count="<-- insert number of menus -->">
>         <storexpath
>             xpath="//Item[#{count}]/@page"
>             property="page" />
>         <invoke
>             url="#{page}"/>
>       </repeat>
>       ...
>     </steps>
>     </testSpec>
>     </target>
>
> Unfortunately, this requires you to know the number of menu items in 
> your xml
> file and hardcode it in the script.  You could modify the code below 
> to use an
> xml api to determine the number of items in the file and set it as a 
> WebTest
> dynamic property (using the Step class's setDynamicProperty() method) 
> to get
> around this.
>
> Hope that helps.  Good luck!
>
> Daniel
>
> =========================
> package com.canoo.webtest.extension;
>
> import java.net.HttpURLConnection;
> import java.net.URL;
> import java.io.*;
> import java.util.HashMap;
> import java.util.Map;
>
> import com.canoo.webtest.engine.Context;
> import com.canoo.webtest.engine.StepExecutionException;
> import com.canoo.webtest.self.WebResponseStub;
> import com.canoo.webtest.steps.Step;
> import com.meterware.httpunit.WebResponse;
>
> /**
>  * Custom WebTest (webtest.canoo.com) step that reads an XML file and 
> uses
>  * the result to set WebTest's last response so that the standard 
> WebTest
>  * tasks can be used to validate and/or utilize the contents of the 
> message.
>  */
> public class LoadXmlStep extends Step {
>
>     private static String DUMMY_URL = "http://dummyurl";
>     private static String FILE = "file";
>
>     private String file;
>
>     public LoadXmlStep() {
>         super();
>     }
>
>     public void doExecute(final Context context) throws Exception {
>         super.doExecute(context);
>         verifyParameters();
>
>         String line = null;
>         StringBuffer xml = new StringBuffer();
>         BufferedReader reader =
>             new BufferedReader(
>                 new FileReader(file));
>         while ((line = reader.readLine()) != null) {
>             sb.append(line);
>         }
>         reader.close();
>
>         WebResponse response =
>             new XmlWebResponseStub(
>                 xml.toString(),
>                 new URL(DUMMY_URL),
>                 HttpURLConnection.HTTP_OK);
>         context.setLastResponse(response);
>     }
>
>     protected void verifyParameters() {
>         if (file == null) {
>             throw new StepExecutionException(
>                 "Required parameter " + FILE + " not set!");
>         }
>     }
>
>     public void expandProperties() {
>         super.expandProperties();
>         file = expandDynamicProperties(file);
>     }
>
>     public Map getParameterDictionary() {
>         Map map = new HashMap();
>         map.put(FILE, file);
>         return map;
>     }
>
>     public void setFile(String file) {
>         this.file = file;
>     }
>
> }
>
> /**
>  * Stub for web responses containing XML.  Overrides default HTML 
> content-type
>  * that's hardcoded in WebResponseStub superclass and sets it to 
> indicate XML
>  * content.
>  */
> class XmlWebResponseStub extends WebResponseStub {
>
>     public static final String CONTENT_TYPE_HEADER = "Content-type";
>     public static final String XML_CONTENT_TYPE =
>         "application/xml; charset=utf-8";
>
>     /**
>      * Constructor for XmlWebResponseStub.
>      * @param content String containing the XML content of the web 
> response
>      * @param url URL associated with the original request (can be a 
> dummy URL
>      * since this is just a stub and not the result of a real web 
> request)
>      * @param returnCode HTTP status/error code
>      */
>     public XmlWebResponseStub(String content, URL url, int returnCode) 
> {
>         super(content, url, returnCode);
>         Map headers = getHeaders();
>         headers.put(CONTENT_TYPE_HEADER, XML_CONTENT_TYPE);
>     }
> }
> ============================
>
>
> -------------------------------------------------
> This mail sent through IMP: http://horde.org/imp/