Aim:
How to generate a dynamic element locator when element's ids are dynamically changing. In this example, we will demonstrate how to randomly select a post entry.
What you will learn?
Difficulty Level:
High
Tips
Related Entries
Javascript Extension File
Helpful Video
How to generate a dynamic element locator when element's ids are dynamically changing. In this example, we will demonstrate how to randomly select a post entry.
What you will learn?
- xpaths
- random variables
- variables
- screenshot command
- Usage of the GOTO javascript extension
Difficulty Level:
High
Tips
- ensure the blog page has many entries
- the xpath is already generated in this example, see if you can establish the xpath yourself
- Firefox browser with Selenium IDE installed
- Access to wordpress.com
- copy and paste the example below into Selenium IDE and also install the Javascript extension
- open up browser and goto the wordpress test site
- randomly select a blog entry
- take a screenshot of the resul
Conclusions
- View the screenshot after execution
- Run the script again and view the screenshot
- notice that the screenshots are different which means that the random selection script worked
- maybe run the script many times in case you find that the two screenshots are the same
Related Entries
- none
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head profile="http://selenium-ide.openqa.org/profiles/test-case">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="selenium.base" href="http://localhost" />
<title>selectRandomBlogEntry</title>
</head>
<body>
<table cellpadding="1" cellspacing="1" border="1">
<thead>
<tr><td rowspan="1" colspan="3">selectRandomBlogEntry</td></tr>
</thead><tbody>
<tr>
<td>open</td>
<td>/wordpress/</td>
<td></td>
</tr>
<tr>
<td>storeXpathCount</td>
<td>//h2</td>
<td>countId</td>
</tr>
<tr>
<td>echo</td>
<td>javascript{"xpath count " + storedVars['countId'];}</td>
<td></td>
</tr>
<tr>
<td>label</td>
<td>againGenrateRandom</td>
<td></td>
</tr>
<tr>
<td>store</td>
<td>javascript{ var mycountId = storedVars['countId'];Math.ceil( Math.random()*(100)); }</td>
<td>RandomBlogEntryId</td>
</tr>
<tr>
<td>gotoIf</td>
<td>${RandomBlogEntryId}<10</td>
<td>againGenrateRandom</td>
</tr>
<tr>
<td>echo</td>
<td>javascript{"randomBlogEntryId=" + storedVars['RandomBlogEntryId'];}</td>
<td></td>
</tr>
<tr>
<td>storeEval</td>
<td>"/html/body/div[@id='wrapper']/div[@id='main']/div[@id='container']/div[@id='content']/div[@id='post-${RandomBlogEntryId}']/h2/a"</td>
<td>myxpath</td>
</tr>
<tr>
<td>storeHtmlSource</td>
<td>sourceValue</td>
<td></td>
</tr>
<tr>
<td>store</td>
<td>${sourceValue}</td>
<td>aa</td>
</tr>
<tr>
<td>echo</td>
<td>javascript{storedVars['sourceValue'];}</td>
<td></td>
</tr>
<tr>
<td>storeEval</td>
<td>storedVars['sourceValue'].length</td>
<td>q</td>
</tr>
<tr>
<td>echo</td>
<td>javascript{"Source code Length =" + storedVars['q'];}</td>
<td></td>
</tr>
<tr>
<td>storeEval</td>
<td>storedVars['sourceValue'].search("post-"+storedVars['RandomBlogEntryId'])</td>
<td>value</td>
</tr>
<tr>
<td>echo</td>
<td>javascript{"match if greater than -1:: " + storedVars['value'];}</td>
<td></td>
</tr>
<tr>
<td>echo</td>
<td>${value}</td>
<td></td>
</tr>
<tr>
<td>gotoIf</td>
<td>${value}==-1</td>
<td>label1</td>
</tr>
<tr>
<td>echo</td>
<td>javascript{"myxpath=" + storedVars['myxpath'];}</td>
<td></td>
</tr>
<tr>
<td>clickAtAndWait</td>
<td>xpath=${myxpath}</td>
<td></td>
</tr>
<tr>
<td>captureEntirePageScreenshot</td>
<td>C:SelectRandomBlogEntry.jpg</td>
<td></td>
</tr>
<tr>
<td>goto</td>
<td>end</td>
<td></td>
</tr>
<tr>
<td>label</td>
<td>label1</td>
<td></td>
</tr>
<tr>
<td>getEval</td>
<td>alert("Post is not available...Click 'OK' for LogOut");</td>
<td></td>
</tr>
<tr>
<td>label</td>
<td>end</td>
<td></td>
</tr>
</tbody></table>
</body>
</html>
Javascript Extension File
var gotoLabels= {};
var whileLabels = {};
// overload the original Selenium reset function
Selenium.prototype.reset = function() {
// reset the labels
this.initialiseLabels();
// proceed with original reset code
this.defaultTimeout = Selenium.DEFAULT_TIMEOUT;
this.browserbot.selectWindow("null");
this.browserbot.resetPopups();
}
Selenium.prototype.initialiseLabels = function()
{
gotoLabels = {};
whileLabels = { ends: {}, whiles: {} };
var command_rows = [];
var numCommands = testCase.commands.length;
for (var i = 0; i < numCommands; ++i) {
var x = testCase.commands[i];
command_rows.push(x);
}
var cycles = [];
for( var i = 0; i < command_rows.length; i++ ) {
if (command_rows[i].type == 'command')
switch( command_rows[i].command.toLowerCase() ) {
case "label":
gotoLabels[ command_rows[i].target ] = i;
break;
case "while":
case "endwhile":
cycles.push( [command_rows[i].command.toLowerCase(), i] )
break;
}
}
var i = 0;
while( cycles.length ) {
if( i >= cycles.length ) {
throw new Error( "non-matching while/endWhile found" );
}
switch( cycles[i][0] ) {
case "while":
if( ( i+1 < cycles.length ) && ( "endwhile" == cycles[i+1][0] ) ) {
// pair found
whileLabels.ends[ cycles[i+1][1] ] = cycles[i][1];
whileLabels.whiles[ cycles[i][1] ] = cycles[i+1][1];
cycles.splice( i, 2 );
i = 0;
} else ++i;
break;
case "endwhile":
++i;
break;
}
}
}
Selenium.prototype.continueFromRow = function( row_num )
{
if(row_num == undefined || row_num == null || row_num < 0) {
throw new Error( "Invalid row_num specified." );
}
testCase.debugContext.debugIndex = row_num;
}
// do nothing. simple label
Selenium.prototype.doLabel = function(){};
Selenium.prototype.doGotolabel = function( label )
{
if( undefined == gotoLabels[label] ) {
throw new Error( "Specified label '" + label + "' is not found." );
}
this.continueFromRow( gotoLabels[ label ] );
};
Selenium.prototype.doGoto = Selenium.prototype.doGotolabel;
Selenium.prototype.doGotoIf = function( condition, label )
{
if( eval(condition) ) this.doGotolabel( label );
}
Selenium.prototype.doWhile = function( condition )
{
if( !eval(condition) ) {
var last_row = testCase.debugContext.debugIndex;
var end_while_row = whileLabels.whiles[ last_row ];
if( undefined == end_while_row ) throw new Error( "Corresponding 'endWhile' is not found." );
this.continueFromRow( end_while_row );
}
}
Selenium.prototype.doEndWhile = function()
{
var last_row = testCase.debugContext.debugIndex;
var while_row = whileLabels.ends[ last_row ] - 1;
if( undefined == while_row ) throw new Error( "Corresponding 'While' is not found." );
this.continueFromRow( while_row );
}
Helpful Video
I have put only solutions here, it's under todo, so please review first.
ReplyDeleteI also haven't made any changes in existing one.
ReplyDelete