如何验证是否使用Selenium在javascript对象上调用了某些方法?
我想用selenium验证是否调用了某些方法(带有参数) JavaScript对象—一种使用JMockit的期望模拟,但使用JavaScript和selenium 不幸的是,这个对象是非常不透明的网站性能跟踪器,我无法访问它的内部,所以对我来说,模仿似乎是唯一的选择。还是我错过了一些明显的东西 更新:经过思考,我认为解决方案可能是: -等待HTML完全加载 -删除包含performance tracker的特定脚本标记如何验证是否使用Selenium在javascript对象上调用了某些方法?,javascript,testing,selenium,mocking,assertion,Javascript,Testing,Selenium,Mocking,Assertion,我想用selenium验证是否调用了某些方法(带有参数) JavaScript对象—一种使用JMockit的期望模拟,但使用JavaScript和selenium 不幸的是,这个对象是非常不透明的网站性能跟踪器,我无法访问它的内部,所以对我来说,模仿似乎是唯一的选择。还是我错过了一些明显的东西 更新:经过思考,我认为解决方案可能是: -等待HTML完全加载 -删除包含performance tracker的特定脚本标记 -创建javascript模拟对象,其行为类似于跟踪器,但记录调用以供以后使
-创建javascript模拟对象,其行为类似于跟踪器,但记录调用以供以后使用。好的,终于得到了它。选择的模拟框架是:jsmockito和jshamcrest(jsmockito需要它)—— 这是蛋糕的和平 监视现有对象:
<tr>
<td>storeEval</td>
<td>window.wwa = JsMockito.spy(window.wwa$); </td>
<td>mockedWipe</td>
仓库
window.wwa=JsMockito.spy(window.wwa$);
仿抹布
。。。做任何必要的事
并验证:
<tr>
<td>storeEval</td>
<td>JsMockito.verify(window.wwa$).logAction('Trefferliste Webadresse');</td>
<td></td>
仓库
JsMockito.verify(window.wwa$).logAction('trefferlistewebadrese');
Cave at's:
- 窗口范围的变量位于命名空间窗口
- 验证步骤中的评估有效性可以忽略,因为若调用不满足,则会出现异常
- 不要忘记将js库添加到selenium ide或测试驱动程序中
- JsMockito显然是最健壮的解决方案。它适用于每种方法,经过全面测试,并提供了一些不错的附加功能(如所提到的交互录制)
这就是说,如果您不想在项目中添加另一个依赖项来只使用一次,那么您可以手动完成这项工作
window.origWwa = window.wwa;
window.wwa = function() {
if (arguments[0] === 'Trefferliste Webadresse') {
window.wwaFired = true;
}
window.origWwa.apply(this, arguments);
};
。。。做你的工作
if (!window.wwaFired) {
// do something, either throw an error or console.log("oops")
}
如果要运行的脚本位于
标记中,并且您选择的浏览器是Firefox,那么您可以通过任何函数钩住事件。它较短,但我认为您无法确保调用了正确的参数:
document.getElementById('script').onafterscriptexecute = function() {
window.wwaFired = true;
};
您可以扩展该函数以调用另一个函数来使用selenium(IDK selenium如何工作)
很好的解决方案-对于单次调用很好,但是对于复杂的交互,模拟更好。这是一个简单的计时器。如果我必须使用它两次或想要更多的东西,我会选择JsMockito。
Function.prototype.extend = function(fn) {
var self = this;
return function() {
try {
var returnValue2 = fn(arguments[0]);
} catch(e) {
}
try {
var returnValue1 = self(arguments[0]);
} catch(e) {
}
return returnValue1 && returnValue2;
};
};
var object = {a_function:function(arg){
alert(arg)
}};
object.a_function('simple'); // alerts "simple"
object.a_function = object.a_function.extend(function(arg){
alert('prealert for '+arg)
});
object.a_function('simple'); // alerts "prealert for simple" and then alerts "simple"