Selenium IDE is a standalone 3rd party tool for creating Selenium test cases. These test cases can be imported as script files into ASM and used within Browser Checks to collect performance metrics for the scenario. In some cases, users must make changes to their Selenium IDE script before it can be used within ASM as a Scenario. This article explains how ASM handles Selenium IDE scripts so you can easily understand how to convert your scripts into Scenarios.
Supported Selenium IDE Commands
Use the following table as a reference when determining whether a certain Selenium IDE command is compatible with your ASM Scenario.
Actions | Keyboard & Mouse interaction | Verification and Assertion | Waits | Scenario Flow | JS Execution | Stored Variables | Custom (ASM Specific) Commands |
---|---|---|---|---|---|---|---|
open | keyDown | assertElementPresent | waitForVisible | gotoIf | fireEvent | storeTitle | setPageBreak |
clickAndWait | keyDownAndWait | assertTitle | waitForText | goto | runScript | storeXpathCount | insertPageBreak |
clickAtAndWait | keyUp | assertLocation | waitForValue | label | getEval | storeCssCount | takeScreenshot |
click | keyUpAndWait | assertVisible | waitForAttribute | close | runScriptAndWait | storeValue | startRecording |
clickAt | keyPress | assertElementNotPresent | waitForNotText | pause | storeText | clearRecording | |
type | keyPressAndWait | assertNotVisible | waitForNotValue | setSpeed | storeLocation | stopRecording | |
sendKeys | mouseOver | assertAttribute | waitForNotAttribute | setTimeout | storeExpression | getDictionary | |
typeKeys | assertNotAttribute | waitForTextPresent | echo | storeEval | |||
select | assertValue | waitForTextNotPresent | storeAttribute | ||||
selectAndWait | assertNotValue | waitForElementPresent | storeElementPresent | ||||
selectFrame | assertText | waitForEditable | store | ||||
selectWindow | assertTextNotPresent | waitForElementNotPresent | |||||
submit | assertTextPresent | waitForNotVisible | |||||
assertExpression | waitForTitle | ||||||
assertNextConfirmation | waitForLocation | ||||||
assertNextAlert | waitForAlert | ||||||
assertAlert | waitForConfirmation | ||||||
assertConfirmation | |||||||
assertEval | |||||||
verifyTitle | |||||||
verifyLocation | |||||||
verifyElementPresent | |||||||
verifyVisible | |||||||
verifyElementNotPresent | |||||||
verifyNotVisible | |||||||
verifyAttribute | |||||||
verifyNotAttribute | |||||||
verifyValue | |||||||
verifyNotValue | |||||||
verifyText | |||||||
verifyTextNotPresent | |||||||
verifyTextPresent | |||||||
verifyExpression |
Usage Assertion Modes
In order to assert a command within Selenium IDE, you can use the assert
, verify
, or waitFor
commands; the assert
command will stop the Selenium IDE script if the expected condition is not met, while the verify
command will log an error message but not stop the script. ASM scenarios, by contrast, treat the assert
and verify
commands the same way - if the expected condition is not met, both commands will result in a failure of the scenario.
By contrast, the behavior of the waitFor
command is the same within Selenium IDE and ASM Scenarios. Within both tools, the waitFor
command will wait for a specified element and will result in a script failure if the element is not found within the specified timeframe. The default timeframe is 30 seconds and can be changed with “setTimeout”.
Custom ASM Commands
ASM supports several commands which are not utilized in native Selenium IDE: insertPageBreak, takeScreenshot, and getDictionary.
insertPageBreak
ASM scenarios support a custom command called insertPageBreak
. This command creates a new Page Break that separates different pages (which typically consist of multiple URL calls) from each other. The command expects one argument, the name/title of the page break, which will be shown on the Result Details page in ASM. Page breaks can be entered manually into scripts or automatically generated when recording web sessions. For example, If the login portion of a web page sequence takes place over two or three HTML pages, the Page break could organize the set of HTML pages into a single group before the next logical page navigation - another Page Break. insertPageBreak
is typically only necessary if you need to set a custom title or if requests which are triggered as a result of executing multiple different commands all end up as part of the same step, and you wish to split these requests into multiple steps.
takeScreenshot
The command takeScreenshot
takes a screenshot that will be visible in the Check Details. The command will insert an additional screenshot onto the page in addition to whatever screenshots have been added in the Edit Check settings. This command is helpful when troubleshooting scripts as it gives a snapshot of what exactly happens at a particular step.
getDictionary
An ASM “Dictionary” is a repository for storing user names, passwords, internal access URLs, and other sensitive data. Dictionaries can be used to reuse data in multiple environments or to hide access information during monitoring. This allows users to utilize passwords in scenarios without displaying them in cleartext or to reuse a single URL in several different scenarios without manually coding it.
The Apica custom Selenium scripting command getDictionary
allows users to access a user-defined dictionary from inside a check scenario script. The getDictionary
fetches the entire Dictionary (with all key/value pairs) and stores it locally for when the script executes.
Using the getDictionary Command
Step 1: Create the Dictionary
Create/Add a Dictionary using an API POST command
Name the Dictionary Key that will be used to access this dictionary:
"dictionary_key": "ExampleApicaKey","dictionary" {Name:value pairs}
"dictionary_key": "ApicaKey","dictionary" {Name:value pairs}
You will also provide string-pair values in the form of
“targetstring1”: “targetvalue1”
that will form the Keys that access the values needed:“firstname”: “Doug”
“lastname”: “Smith”
“cardnumber”: “1234-1234-1234-1234”
“expdate”: “12/25”
You must also provide a Description:
e.g.
"description": "Test Dictionary"
In this example, the POST command is:
POST scenarios/proxysniffer/dictionaries
The POST body for one of the examples above is:
{ "dictionary_key": "DougApicaKey", "dictionary": { “firstname”: “Doug”, "lastname”: “Smith”, "cardnumber”: “1234-1234-1234-1234" }, "description": "Test Dictionary" }
Step 2: Retrieve the Dictionary
Once the above dictionary has been defined, the Selenium scripting command getDictionary
allows access to the dictionary information from inside a check scenario script. The getDictionary
command fetches the entire Dictionary (with all key/value pairs) and stores it locally for when the script executes. It uses the Apica Dictionaries GET API to get these dictionary values. The GET call will be in the form of
https://api-wpm.apicasystem.com/v3/scenarios/proxysniffer/dictionaries/{dictionary_key}?auth_ticket={auth ticket value}
The getDictionary
command then turns these key values into ASM variable names for use in the ASM script.
Using the getDictionary Command within a Selenium Scenario
The getDictionary
command expects two arguments when it fetches predefined variables from a dictionary:
Target: The user’s API Token/Authorization Ticket
Value: The dictionary URL
https://api-wpm.apicasystem.com/v3/scenarios/proxysniffer/dictionaries/{dictionary_key}
The following screenshot provides an example of getDictionary
usage within a Selenium script:
Command | Target | Value |
---|---|---|
|
|
|
The API token is masked for privileged users.
Step | Screenshot |
---|---|
This screenshot provides an example of the API GET command for the dictionary “DougApicaKey”. | |
This screenshot provides another example of the API GET command for the dictionary “ApicaKey”. Note how each dictionary has different defined key-value pairs. | |
Selenium Example 1: The Dictionary Key "DougApicaKey" has 3 key values (excluding the sample value) that are used in the scenario. | |
Selenium Example 2: The Dictionary Key "Apicakey" has 2 key values (excluding the sampleKey value) that are used in this scenario. In this case, the username and password values, from the dictionary will be used in the Selenium scenario. These values will not be hard-coded into the script. |
Encrypting Selenium Variables
This feature must be enabled per customer account. If you are interested in encrypting Selenium variables within your Scenarios, please contact your Technical Account Manager or Support.
ASM offers the option to encrypt sensitive Scenario data as an alternative to storing and fetching sensitive data from a Dictionary. Any data stored in an encrypted variable is only accessible when the script is being run. To add an encrypted variable to your scenario, add a variable using the Selenium "store" command, and start the name of the sensitive variable with “encryptapica". You can use that stored variable anywhere in the scenario:
It is possible to specify any string in the “Value” field for variable encryption as long as it starts with the string “encryptapica”. This string invokes the crypto service which is responsible for encrypting the provided value.
Step | Screenshot |
---|---|
Step 1: Edit a Check which contains a Scenario and click the Debug Scenario icon. | |
Step 2: Identify the sensitive information to be encrypted. | |
Step 3: Store the value as an encrypted value by adding a new variable which will hold the encrypted value.
| |
Step 4: Enter the original Target value.
Make sure a backup of the value exists elsewhere; Apica does not have the ability to retrieve this value! | |
Step 5: After the encryption has been completed, the green lock will appear, and the words “[ENCRYPTED BY APICA]” will be present in the Target field. | |
Step 6: In the step where the password originally appeared, replace the plaintext password with the stored variable name specified earlier. In this case, in step 25, the variable ‘encryptapicapassword’ will be entered as $(variable_name) or $(encryptapicapassword). | |
Step 7: Test the scenario to ensure it passes the encrypted values to the intended application and click “Save scenario”. |
The below video tutorial provides a visual demonstration of the process of encrypting and adding a scenario.
Masking Selenium Variables
Command values can be masked using an Apica-specific prefix when they contain sensitive information. This prevents the value from being displayed in results. Assume a scenario contains the following commands:
Command | Target | Value |
---|---|---|
open |
| |
selectWindow |
| |
type |
|
|
type |
|
|
clickAndWait |
|
It is possible to mask the value secretPa$$word
in the Check Result page by adding the Store
command to store the password as a variable with the prefix maskapica
and using that variable in the actual command which uses the password. The scenario will contain the following commands after the value secretPa$$word
is masked:
Command | Target | Value |
---|---|---|
store |
|
|
open |
| |
selectWindow |
| |
type |
|
|
type |
|
|
clickAndWait |
|
The command’s target will be masked on the Check Results page when the check is run:
Command | Target | Value |
---|---|---|
store |
|
|
open |
| |
selectWindow |
| |
type |
|
|
type |
|
|
clickAndWait |
|
Prefixes
Synthetic Monitoring supports custom security prefixes for use in select scenario values where information may need more security.
‘apica’ to store information
Store a result with “apica”
Synthetic Monitoring will store the command result for later display when the "apica" prefix is used in a command value.
Display
The command value is shown in Details in the Details Result Scenario in the Value column.
Example
Command | Target | Value |
---|---|---|
|
|
|
This example will store the ServerID
cookie value and show it as apicaServerID
Extracted Value.
This prefix will work with any command that starts with “store
."
Limitations of Selenium IDE within ASM Scenarios
Key Codes
When using sendKeys in Selenium IDE, the key codes ${KEY_ENTER}
, ${KEY_SHIFT}
, and ${KEY_LEFT}
are not valid commands within Selenium IDE. Instead use keyPress
with the respective ascii values for the key you want to be pressed. For example, return/enter is \13
.
JavaScript Execution
WebDriver’s JavascriptExecutor
will wrap all JS and evaluate it as an anonymous expression.
Impact on JavaScript execution
This means that you need to use the “return” keyword:
browserbot.getCurrentWindow().document.title
becomes
return document.title;
The same is true when evaluation expressions using storeEval or assertEval:
Selenium IDE
| \{\{${stored_var} > 0\}\} |
|
WebDriver
| \{\{return ${stored_var} > 0\}\} |
|
Note that there are multiple commands that will result in javascript evaluation: gotoIf
, assertEval
, getEval
, storeEval
Key Strokes
If you need to simulate a keypress input event, such as pressing the enter key, you must use keyPress
or keyPressAndWait
(if the keystroke triggers a new page load), with the ASCII as an argument.
Overview
Example: Press enter key and wait for new page load
| | |
Response Times
Agents running Microsoft Windows may handle very short report times incorrectly.
Waterfall graph
Agents running Microsoft Windows sometimes report 0ms for URL calls with very quick response times (0-20ms).
Return Required
For Selenium commmands that execute javascript snippets, the command expects a returned value
Return Command In Scripts
The following commands result in javascript evaluation/expects a javascript snippet as argument, which must include the 'return' keyword:
Type & sendKeys
Even though the "type" command should work in most cases, we strongly recommend that you use "sendKeys" instead. This is because type
edits the HTML format of the code, while sendKeys
sends it more humanlike which is able to trigger javascript code in fields.
Script Variables
It is currently not possible to change the value of a variable from within a javascript.
##
This Selenium IDE code will change the value of $counter
:
|
|
|
However the following example won't affect the value of $counter
|
|