如何验证使用Selenium在javascript对象上调用某个方法?

时间:2012-06-21 14:54:14

标签: javascript testing selenium mocking assertion

我想用selenium验证是否调用了某些方法(带参数) JavaScript对象 - 一种期望用JMockit进行模拟,但是在Javascript和selenium中。

不幸的是,对象是严重不透明的不透明网站性能跟踪器,我无法访问其内部,所以嘲笑似乎是唯一的选择。或者我会错过一些明显的东西吗?

更新:在考虑之后,在我看来解决方案可能是:   - 等待HTML完全加载   - 删除包含性能跟踪器的某些脚本标记   - 创建javascript模拟对象,表现得像跟踪器,但记录调用以供以后使用

3 个答案:

答案 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>

洞穴:

  • 窗口范围变量位于命名空间窗口
  • 来自验证步骤的评估值可以忽略,因为如果不满足调用则会出现异常
  • 不要忘记将js库添加到selenium ide或测试驱动程序

答案 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"