> OctoPerf load testing - XPath2 Variable Extractor documentation page. XPath2 Variable Extractors lets you extract variables from server responses using XPath2 queries.

Source: https://api.octoperf.com/doc/design/edit-virtual-user/action-types/post-processors/xpath2-variable-extractor/

# XPath2 Variable Extractor

XPath2 Variable Extractors lets you **extract variables from HTML/XML responses** using [XPath2 queries](https://www.w3schools.com/xml/xpath_syntax.asp).

Extracting variables from HTTP response helps you make your Virtual User have a dynamic behavior. Extracted variables can be injected in Logic Actions or HTTP Request Actions.

!!! warning
    The XPath2 extractor consumes more CPU than most [regex extractors](https://api.octoperf.com/doc/design/edit-virtual-user/action-types/post-processors/regexp-variable-extractor/), try to use it only when relevant. Especially if you need to extract a lot of values this way.

![XPath2 Extractor](https://api.octoperf.com/doc/design/edit-virtual-user/action-types/post-processors/img/xpath2.png "XPath2 Extractor")

| Field            | Description                                                  |
| ---------------- | ------------------------------------------------------------ |
| Name             | Name of the variable created by this processor. Can be used with the `${...}` syntax like any other variable. |
| From             | This is for information purpose since this processor can only extract from **Response body**. |
| Include XML Tags | This option will return the entire XPath fragment instead of the text. Use it when you're not simply extracting a single attribute. |
| Query            | The [XPath Query](https://www.w3schools.com/xml/xpath_syntax.asp) to be used. |
| Default value    | If no value is found, the variable will be equal to this. With match number **All**, you get the default value if you do not provide an index number. |
| Match number     | Lets you choose how to deal with the processor having several results (or occurrences). Selecting **All** will change the behavior of your processor, see [the dedicated section of the regex page](https://api.octoperf.com/doc/design/edit-virtual-user/action-types/post-processors/regexp-variable-extractor/#multiple-occurrences) for more details. |

## Namespace

In this section you must specify the [XML Namespace](https://www.w3.org/TR/REC-xml-names/) of your document:

![XPath2 Namespace](https://api.octoperf.com/doc/design/edit-virtual-user/action-types/post-processors/img/xpath2-namespace.png "XPath2 Namespace")

| Field                                  | Description                                                  |
| -------------------------------------- | ------------------------------------------------------------ |
| Prefix                                 | Prefix if required. Example: `<x xmlns:edi='http://ecommerce.example.org/schema'>` here the prefix is `edi`. |
| URI                                    | Namespace URI. Example: `<html xmlns="http://www.w3.org/1999/xhtml">` in this case the URI is `http://www.w3.org/1999/xhtml` with **no Prefix**. |
| ![add-line](https://api.octoperf.com/doc/design/edit-virtual-user/action-types/img/add-line.png){ .off-glb }       | Add a new namespace.                                         |
| ![remove-line](https://api.octoperf.com/doc/design/edit-virtual-user/action-types/img/remove-line.png){ .off-glb } | Remove an existing namespace.                                |

## Debug

In order to validate the results of your extraction, you can use the debug panel.

![debug-processor](https://api.octoperf.com/doc/design/edit-virtual-user/action-types/img/debug-processor.png)

The procedure is explained on the [regex extractor page](https://api.octoperf.com/doc/design/edit-virtual-user/action-types/post-processors/regexp-variable-extractor/#debug) for both simple and multiple occurrences.

## Example

### From a browser

In this example we will be using the [login page from our Petstore](https://petstore.octoperf.com/actions/Account.action?signonForm=) application. Make sure to import an HAR recording of this page.

The first step will be to navigate to this page and use the **Right-click + Inspect** menu of our browser to locate the element we want to extract:

![XPath Extractor check](https://api.octoperf.com/doc/design/edit-virtual-user/action-types/post-processors/img/xpath-copy-xpath.png "XPath Extractor check")

Using the **Copy XPath** function we can get:

```xquery
//*[@id="Catalog"]/form/div/input[1]
```

We can copy this directly in our **XPATH2 extractor** in OctoPerf, just adding on top of it that we want to extract the content of the **value** attribute with `/@value`:

```xquery
//*[@id="Catalog"]/form/div/input[1]/@value
```

!!! warning
    On top of that you can see that we filled the [namespace](#namespace) that was specified in the HTML element.

### Simpler expression

Alternatively we could also rework our XPath Query to something simpler like:

```xquery
//input[@name='_sourcePage']/@value
```

We would then pick only inputs named `_sourcePage` and this would be less dependent on the page structure. So provided the name is unique to this parameter we can get a more resilient expression if the application ever changes.

!!! tip
    You can use third party tools like [XPather](http://xpather.com/) to accelerate the design of your XPath expression. Just copy and paste the content of the response displayed on this page.
