您的位置:首页 > 其它

Selenium Core and IDE extension

2012-07-20 13:08 302 查看
最近发现要使用ExtJs测试其实很麻烦,因为ExtJs的id是变化的,而Selenium IDE录制完后,ExtJs的下次打开页面,就无法进行回放了。因此很麻烦,不过通过一些网友进行交流得到如下一些测试方法:

引用

1. 使用Xpath进行定位

2. 适当使用selenium..runScript()方法

3.应用Selenium IDE的extensions

下面我只针对第3种方法进行总结。

如果你想知道第三种方法的原理:请你在你的firefox浏览器上

输入

引用

chrome://selenium-ide/content/recorder-handlers.js

chrome://selenium-ide/content/locatorBuilders.js

通过上面两个js你大致可以了解Selenium IDE录制的原理。

要用Selen现在我ium IDE的extensions。

步骤:在Selenium IDE的Options进入,在点击Options显示如下一个节目



在该页面你要注意:

Selenium Core extensions(user-extensions.js)

Selenium IDE extensions

下面我们准备两个脚本来进行extesions。

Js代码






Selenium.prototype.assertExtEqual = function(expression, text) {
/**

* the euqal assertion of ext
* @param expression ext expression , just like "button1.text" or "text1.getValue()"
* @param String target value
*/
var result = this.extEval(expression)
if (result != text) {
Assert.fail("the value of [" + result + "] " + expression
+ " is not equal with " + text);
}
};

Selenium.prototype.assertExtGreaterThan = function(expression, text) {
/**

* the greater than assertion of ext
* @param expression ext expression , just like "button1.text" or "text1.getValue()"
* @param String target value
*/
var result = this.extEval(expression)
if (result <= text) {
Assert.fail("the value of [" + result + "] " + expression
+ " is not greater than " + text);
}
}

Selenium.prototype.assertExtGreaterEqualThan = function(expression, text) {
/**

* the greater and equal than assertion of ext
* @param expression ext expression , just like "button1.text" or "text1.getValue()"
* @param String target value
*/
var result = this.extEval(expression)
if (result < text) {
Assert.fail("the value of [" + result + "] " + expression
+ " is not greater equal than " + text);
}
}

Selenium.prototype.assertExtLessThan = function(expression, text) {
/**

* the less than assertion of ext
* @param expression ext expression , just like "button1.text" or "text1.getValue()"
* @param String target value
*/
var result = this.extEval(expression)
if (result >= text) {
Assert.fail("the value of [" + result + "] " + expression
+ " is not less than " + text);
}
}

Selenium.prototype.assertExtLessEqualThan = function(expression, text) {
/**

* the less and equal than assertion of ext
* @param expression ext expression , just like "button1.text" or "text1.getValue()"
* @param String target value
*/
var result = this.extEval(expression)
if (result > text) {
Assert.fail("the value of [" + result + "] " + expression
+ " is not less equal than " + text);
}
}

Selenium.prototype.doExecuteExtFunction = function(expression, text) {
/**

* do ext function ,if the expression end with ")" ,the params is not useful
* @param expression ext expression return a ext function, just like "button1.getText" or "text1.getValue()"
* @param String params ,just like "a,b,c"
*/
if (expression.lastIndexOf(")") == expression.length - 1) {
this.extEval(expression);
} else {
var scopeObj = this.extEval(expression.substring(0, expression

.lastIndexOf(".")));
var func = this.extEval(expression);
if (typeof(func) != "function") {

Assert.fail("the value of [" + func + "] " + expression
+ " is not a function");
}
var params = [];
if (text) {
params = text.split(",");
}
try {
func.apply(scopeObj, params);
} catch (e) {
Assert.fail("error execute function [" + func + "] " + expression);
}
}
}

Selenium.prototype.assertExtTrue = function(expression) {
/**

* the true assertion of ext
* @param expression ext expression , just like "button1.hidden"
*/
var result = this.extEval(expression);
if (result !== true) {
Assert.fail("the value of [" + result + "] " + expression
+ " is not true");
}
}

Selenium.prototype.assertExtFalse = function(expression) {
/**

* the false assertion of ext
* @param expression ext expression , just like "button1.hidden"
*/
var result = this.extEval(expression);
if (result !== true) {
Assert.fail("the value of [" + result + "] " + expression
+ " is not false");
}
}

Selenium.prototype.assertExtNull = function(expression, text) {
/**

* the null assertion of ext
* @param expression ext expression , just like "button1.text"
*/
var result = this.extEval(expression);
if (result !== null) {
Assert.fail("the value of [" + result + "] " + expression
+ " is not null");
}
}

Selenium.prototype.assertExtNotNull = function(expression, text) {
/**

* the not null assertion of ext
* @param expression ext expression , just like "button1.text"
*/
var result = this.extEval(expression);
if (result === null) {
Assert.fail("the value of [" + result + "] " + expression + " is null");

}
}

Selenium.prototype.assertExtUndefined = function(expression, text) {
/**

* the undefined assertion of ext
* @param expression ext expression , just like "button1"
*/
var result = this.extEval(expression);
if (result !== undefined) {
Assert.fail("the value of [" + result + "] " + expression
+ " is not undefined");
}
}

Selenium.prototype.assertExtNotUndefined = function(expression, text) {
/**

* the not undefined assertion of ext
* @param expression ext expression , just like "button1"
*/
var result = this.extEval(expression);
if (result === undefined) {
Assert.fail("the value of [" + result + "] " + expression
+ " is undefined");
}
}

Selenium.prototype.assertExtPresent = function(expression, text) {
/**

* the present assertion of ext
* @param expression ext expression , just like "button1"
*/
var result = this.extEval(expression);
if (result == null || result == undefined) {
Assert.fail("the value of [" + result + "] " + expression
+ " is not present");
}
}

Selenium.prototype.assertExtNotPresent = function(expression, text) {
/**

* the not present assertion of ext
* @param expression ext expression , just like "button1"
*/
var result = this.extEval(expression);
if (result != null || result != undefined) {
Assert.fail("the value of [" + result + "] " + expression
+ " is present");
}
}

Selenium.prototype.assertExtMatches = function(expression, text) {
/**

* the matches assertion of ext
* @param expression ext expression , just like "button1.text" or "text1.getValue()"
* @param String target value
*/
var result = this.extEval(expression);
var reg = new RegExp(text);
if (!reg.test(result)) {
Assert.fail("the value of [" + result + "] " + expression
+ " is not match " + text);
}
}

Selenium.prototype.assertExtContains = function(expression, text) {
/**

* the contains assertion of ext
* @param expression ext expression , just like "button1.text" or "text1.getValue()"
* @param String target value
*/
var result = this.extEval(expression);
if (typeof(result) == "undefined" || result == null) {

Assert.fail("the value of " + expression + " dos not contains " + text);
} else if (result.indexOf) {
if (result.indexOf(text) < 0) {
Assert.fail("the value of [" + result + "] " + expression
+ " dos not contains " + text);
}
} else {
Assert.fail("the value of [" + result + "] " + expression
+ " is not a String or Array");
}
}

Selenium.prototype.assertExtTypeof = function(expression, text) {
/**

* the typeof assertion of ext
* @param expression ext expression , just like "button1.text" or "text1.getValue()"
* @param String target value
*/
var type = typeof(this.extEval(expression));

if (type != text) {
Assert.fail("the type of [" + type + "] " + expression + " is not "
+ text);
}
}

PageBot.prototype.getWrappedWindow = function(extpath) {
var win = this.getCurrentWindow() || {};
return win.wrappedJSObject;
}

Selenium.prototype.getWrappedWindow = function(extpath) {
return this.browserbot.getWrappedWindow();
}

Selenium.prototype.extEval = function(expression) {
var script = expression;
if (expression) {
var expArr = expression.split(".");
expArr[0] = "(window.Ext.getCmp('" + expArr[0] + "')||window.Ext.get('"
+ expArr[0] + "')||window.Ext.StoreMgr.lookup('" + expArr[0]
+ "'))";
expression = expArr.join(".");
}
try {
return this.doEval(expression);
} catch (e) {
throw new SeleniumError("the expression " + script

+ " is not a Ext expression !");
}
};
// I have to rewrite the eval function to get the context of window
Selenium.prototype.doEval = function(expression) {
/**

* execute js ecpression
*
* @param {Object}
* expression js expression
*/
try {
var win = this.getWrappedWindow();
var result = eval(expression, win);
return result;
} catch (e) {
throw new SeleniumError("the expression " + expression

+ " is not a Ext expression !");
}
}

Selenium.prototype.assertExtEqual = function(expression, text) {
/**
* the euqal assertion of ext
* @param expression ext expression , just like "button1.text" or "text1.getValue()"
* @param String target value
*/
var result = this.extEval(expression)
if (result != text) {
Assert.fail("the value of [" + result + "] " + expression
+ " is not equal with " + text);
}
};

Selenium.prototype.assertExtGreaterThan = function(expression, text) {
/**
* the greater than assertion of ext
* @param expression ext expression , just like "button1.text" or "text1.getValue()"
* @param String target value
*/
var result = this.extEval(expression)
if (result <= text) {
Assert.fail("the value of [" + result + "] " + expression
+ " is not greater than " + text);
}
}

Selenium.prototype.assertExtGreaterEqualThan = function(expression, text) {
/**
* the greater and equal than assertion of ext
* @param expression ext expression , just like "button1.text" or "text1.getValue()"
* @param String target value
*/
var result = this.extEval(expression)
if (result < text) {
Assert.fail("the value of [" + result + "] " + expression
+ " is not greater equal than " + text);
}
}

Selenium.prototype.assertExtLessThan = function(expression, text) {
/**
* the less than assertion of ext
* @param expression ext expression , just like "button1.text" or "text1.getValue()"
* @param String target value
*/
var result = this.extEval(expression)
if (result >= text) {
Assert.fail("the value of [" + result + "] " + expression
+ " is not less than " + text);
}
}

Selenium.prototype.assertExtLessEqualThan = function(expression, text) {
/**
* the less and equal than assertion of ext
* @param expression ext expression , just like "button1.text" or "text1.getValue()"
* @param String target value
*/
var result = this.extEval(expression)
if (result > text) {
Assert.fail("the value of [" + result + "] " + expression
+ " is not less equal than " + text);
}
}

Selenium.prototype.doExecuteExtFunction = function(expression, text) {
/**
* do ext function ,if the expression end with ")" ,the params is not useful
* @param expression ext expression return a ext function, just like "button1.getText" or "text1.getValue()"
* @param String params ,just like "a,b,c"
*/
if (expression.lastIndexOf(")") == expression.length - 1) {
this.extEval(expression);
} else {
var scopeObj = this.extEval(expression.substring(0, expression
.lastIndexOf(".")));
var func = this.extEval(expression);
if (typeof(func) != "function") {
Assert.fail("the value of [" + func + "] " + expression
+ " is not a function");
}
var params = [];
if (text) {
params = text.split(",");
}
try {
func.apply(scopeObj, params);
} catch (e) {
Assert.fail("error execute function [" + func + "] " + expression);
}
}
}

Selenium.prototype.assertExtTrue = function(expression) {
/**
* the true assertion of ext
* @param expression ext expression , just like "button1.hidden"
*/
var result = this.extEval(expression);
if (result !== true) {
Assert.fail("the value of [" + result + "] " + expression
+ " is not true");
}
}

Selenium.prototype.assertExtFalse = function(expression) {
/**
* the false assertion of ext
* @param expression ext expression , just like "button1.hidden"
*/
var result = this.extEval(expression);
if (result !== true) {
Assert.fail("the value of [" + result + "] " + expression
+ " is not false");
}
}

Selenium.prototype.assertExtNull = function(expression, text) {
/**
* the null assertion of ext
* @param expression ext expression , just like "button1.text"
*/
var result = this.extEval(expression);
if (result !== null) {
Assert.fail("the value of [" + result + "] " + expression
+ " is not null");
}
}

Selenium.prototype.assertExtNotNull = function(expression, text) {
/**
* the not null assertion of ext
* @param expression ext expression , just like "button1.text"
*/
var result = this.extEval(expression);
if (result === null) {
Assert.fail("the value of [" + result + "] " + expression + " is null");
}
}

Selenium.prototype.assertExtUndefined = function(expression, text) {
/**
* the undefined assertion of ext
* @param expression ext expression , just like "button1"
*/
var result = this.extEval(expression);
if (result !== undefined) {
Assert.fail("the value of [" + result + "] " + expression
+ " is not undefined");
}
}

Selenium.prototype.assertExtNotUndefined = function(expression, text) {
/**
* the not undefined assertion of ext
* @param expression ext expression , just like "button1"
*/
var result = this.extEval(expression);
if (result === undefined) {
Assert.fail("the value of [" + result + "] " + expression
+ " is undefined");
}
}

Selenium.prototype.assertExtPresent = function(expression, text) {
/**
* the present assertion of ext
* @param expression ext expression , just like "button1"
*/
var result = this.extEval(expression);
if (result == null || result == undefined) {
Assert.fail("the value of [" + result + "] " + expression
+ " is not present");
}
}

Selenium.prototype.assertExtNotPresent = function(expression, text) {
/**
* the not present assertion of ext
* @param expression ext expression , just like "button1"
*/
var result = this.extEval(expression);
if (result != null || result != undefined) {
Assert.fail("the value of [" + result + "] " + expression
+ " is present");
}
}

Selenium.prototype.assertExtMatches = function(expression, text) {
/**
* the matches assertion of ext
* @param expression ext expression , just like "button1.text" or "text1.getValue()"
* @param String target value
*/
var result = this.extEval(expression);
var reg = new RegExp(text);
if (!reg.test(result)) {
Assert.fail("the value of [" + result + "] " + expression
+ " is not match " + text);
}
}

Selenium.prototype.assertExtContains = function(expression, text) {
/**
* the contains assertion of ext
* @param expression ext expression , just like "button1.text" or "text1.getValue()"
* @param String target value
*/
var result = this.extEval(expression);
if (typeof(result) == "undefined" || result == null) {
Assert.fail("the value of " + expression + " dos not contains " + text);
} else if (result.indexOf) {
if (result.indexOf(text) < 0) {
Assert.fail("the value of [" + result + "] " + expression
+ " dos not contains " + text);
}
} else {
Assert.fail("the value of [" + result + "] " + expression
+ " is not a String or Array");
}
}

Selenium.prototype.assertExtTypeof = function(expression, text) {
/**
* the typeof assertion of ext
* @param expression ext expression , just like "button1.text" or "text1.getValue()"
* @param String target value
*/
var type = typeof(this.extEval(expression));
if (type != text) {
Assert.fail("the type of [" + type + "] " + expression + " is not "
+ text);
}
}

PageBot.prototype.getWrappedWindow = function(extpath) {
var win = this.getCurrentWindow() || {};
return win.wrappedJSObject;
}

Selenium.prototype.getWrappedWindow = function(extpath) {
return this.browserbot.getWrappedWindow();
}

Selenium.prototype.extEval = function(expression) {
var script = expression;
if (expression) {
var expArr = expression.split(".");
expArr[0] = "(window.Ext.getCmp('" + expArr[0] + "')||window.Ext.get('"
+ expArr[0] + "')||window.Ext.StoreMgr.lookup('" + expArr[0]
+ "'))";
expression = expArr.join(".");
}
try {
return this.doEval(expression);
} catch (e) {
throw new SeleniumError("the expression " + script
+ " is not a Ext expression !");
}
};
// I have to rewrite the eval function to get the context of window
Selenium.prototype.doEval = function(expression) {
/**
* execute js ecpression
*
* @param {Object}
*            expression js expression
*/
try {
var win = this.getWrappedWindow();
var result = eval(expression, win);
return result;
} catch (e) {
throw new SeleniumError("the expression " + expression
+ " is not a Ext expression !");
}
}


该代码命名为user-extensions.js通过Selenium Core extensions(user-extensions.js)后的Browser选择中自己写的user-extensions.js.或者也可以不要改js但是下面这个js是一定要的(放入Selenium IDE extensions)。

Js代码






var EXT_PREFIX = "ext-gen";
function findExtLocator(e) {
function getElementIndex(el, p) {
var childs = p.childNodes;
for (var i = 0; i < childs.length; i++) {
var curr = childs[i];
if (curr == el) {
return "[" + (i + 1) + "]";

}
}
}
if (e.id) {
var elId = e.id;
if (elId.indexOf(EXT_PREFIX) == 0) {
var currNode = e;
var locator = "";
while (currNode && currNode.tagName.toLowerCase() != "body") {
parentNode = currNode.parentNode;
locator = this.relativeXPathFromParent(currNode) + locator;//
if (parentNode.id && parentNode.id.length > 0
&& parentNode.id.indexOf(EXT_PREFIX) != 0) {
locator = "//" + parentNode.tagName + "[@id='"
+ parentNode.id + "']" + locator;
return locator;
}
currNode = currNode.parentNode;
}
}
}
return null;
}
LocatorBuilders.add('ext', findExtLocator);
// You can change the priority of builders by setting LocatorBuilders.order.
LocatorBuilders.order = ['ext', 'id', 'link', 'name', 'dom:name', 'xpath:link',

'xpath:img', 'xpath:attributes', 'xpath:href', 'dom:index',

'xpath:position'];

var EXT_PREFIX = "ext-gen";
function findExtLocator(e) {
function getElementIndex(el, p) {
var childs = p.childNodes;
for (var i = 0; i < childs.length; i++) {
var curr = childs[i];
if (curr == el) {
return "[" + (i + 1) + "]";
}
}
}
if (e.id) {
var elId = e.id;
if (elId.indexOf(EXT_PREFIX) == 0) {
var currNode = e;
var locator = "";
while (currNode && currNode.tagName.toLowerCase() != "body") {
parentNode = currNode.parentNode;
locator = this.relativeXPathFromParent(currNode) + locator;//
if (parentNode.id && parentNode.id.length > 0
&& parentNode.id.indexOf(EXT_PREFIX) != 0) {
locator = "//" + parentNode.tagName + "[@id='"
+ parentNode.id + "']" + locator;
return locator;
}
currNode = currNode.parentNode;
}
}
}
return null;
}
LocatorBuilders.add('ext', findExtLocator);
// You can change the priority of builders by setting LocatorBuilders.order.
LocatorBuilders.order = ['ext', 'id', 'link', 'name', 'dom:name', 'xpath:link',
'xpath:img', 'xpath:attributes', 'xpath:href', 'dom:index',
'xpath:position'];


该段代码是必须的。产生的效果是让Selenium IDE在录制Extjs的时候能够回放成功。

总结下使用步骤:

引用

第一:将第一段js代码放入Selenium Core extensions(user-extensions.js)

第二:将第二段js代码放入Selenium IDE extensions 这是必须的。

现在你可以使用Selenium IDE来测试ExtJs了。你可以看看是不是可以正常进行录制和回放。ExtJs没有ZK厚道,ZK官网提供了一个接口来实现Selenium IDE的测试。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: