package com.canoo.webtest.extension;
import com.canoo.webtest.engine.StepFailedException;
import com.canoo.webtest.steps.store.BaseStoreStep;
import com.gargoylesoftware.htmlunit.ElementNotFoundException;
import com.gargoylesoftware.htmlunit.html.HtmlAnchor;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
/**
* Extracts the value of the specified parameter from the URL for a link and stores it as a property.<p>
*
* Ex: permits to retrieve "123" or "plouf" in a link
* with href="toto.jsp?titi=123&tutu=plouf".
*
* @author Marc Guillemot
* @webtest.step
* category="Extension"
* name="storeLinkParameter"
* alias="extractlinkparameter"
* description="Extracts the value of the specified parameter in the link and stores it as a property."
*/
public class StoreLinkParameter extends BaseStoreStep {
private String fHtmlId;
private String fParameter;
/* (non-Javadoc)
* @see com.canoo.webtest.steps.Step#doExecute(com.canoo.webtest.engine.Context)
*/
public void doExecute() throws Exception {
HtmlElement elt = null;
try {
elt = ((HtmlPage) getContext().getCurrentResponse()).getHtmlElementById(fHtmlId);
} catch (final ElementNotFoundException e) {
//ignore
}
if (elt == null || !(elt instanceof HtmlAnchor)) {
throw new StepFailedException("No link found with id >" + getHtmlId() + "<", this);
}
final HtmlAnchor webLink = (HtmlAnchor) elt;
final String value = extractParameterValue(webLink.getHrefAttribute(), getParameter());
if (value == null) {
throw new StepFailedException("No parameter >" + getParameter() + "< found in link >"
+ webLink.getHrefAttribute() + "<", this);
}
storeProperty(value, getParameter());
}
/**
* Extracts the first value of the query parameter in the url
* @param url the url string
* @param parameterName
* @return <code>null</code> if no parameter found with the given name
*/
public static String extractParameterValue(final String url, final String parameterName) {
int iQueryStart = url.indexOf('?');
if (iQueryStart == -1) {
return null;
}
final String strQuery = url.substring(iQueryStart + 1);
final String[] tabParamValues = strQuery.split("&");
for (int i = 0; i < tabParamValues.length; ++i) {
final String strTmp = tabParamValues[i];
if (strTmp.startsWith(parameterName + "=")) {
return strTmp.substring(parameterName.length() + 1);
}
}
return null;
}
/**
* @param string
* @webtest.parameter
* required="yes"
* description="The id of the html link to extract from."
*/
public void setHtmlId(final String string) {
fHtmlId = string;
}
public String getHtmlId() {
return fHtmlId;
}
/**
* @param string
* @webtest.parameter
* required="yes"
* description="The name of the parameter whose value should be extracted.
* If the property name is not specified, the parameter name is used as key to store the value found."
*/
public void setParameter(final String string) {
fParameter = string;
}
public String getParameter() {
return fParameter;
}
/**
* Checks that required parameters are set
*/
protected void verifyParameters() {
super.verifyParameters();
nullParamCheck(fHtmlId, "htmlid");
nullParamCheck(fParameter, "parameter");
nullResponseCheck();
}
}