我想用selenium验证是否调用了某些方法(带参数) JavaScript对象 - 一种期望用JMockit进行模拟,但是在Javascript和selenium中。
不幸的是,对象是严重不透明的不透明网站性能跟踪器,我无法访问其内部,所以嘲笑似乎是唯一的选择。或者我会错过一些明显的东西吗?
更新:在考虑之后,在我看来解决方案可能是: - 等待HTML完全加载 - 删除包含性能跟踪器的某些脚本标记 - 创建javascript模拟对象,表现得像跟踪器,但记录调用以供以后使用
答案 0 :(得分:3)
好的,终于明白了。模拟选择的框架是:jsmockito和jshamcrest(jsmockito需要它) - http://jsmockito.org/
这是和平的蛋糕。
监视现有对象:
<tr>
<td>storeEval</td>
<td>window.wwa = JsMockito.spy(window.wwa$); </td>
<td>mockedWipe</td>
......做任何必要的事情
并验证它:
<tr>
<td>storeEval</td>
<td>JsMockito.verify(window.wwa$).logAction('Trefferliste Webadresse');</td>
<td></td>
洞穴:
答案 1 :(得分:2)
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")
}
如果要运行的脚本位于<script>
标记中,并且您选择的浏览器是Firefox,则可以通过任何函数挂钩onafterscriptexecute
事件。它更短,但我认为你无法确定正确的论点被称为:
document.getElementById('script').onafterscriptexecute = function() {
window.wwaFired = true;
};
答案 2 :(得分:0)
你可以扩展函数调用另一个函数来处理selenium(IDK SELENIUM的工作方式)
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"