6

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

不幸的是,对象是严重模糊的不透明网站性能跟踪器,我无法访问它的内部,所以在我看来,嘲笑是唯一的选择。还是我错过了一些明显的东西?

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

4

3 回答 3

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 或测试驱动程序中
于 2012-06-25T09:23:35.873 回答
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;
};
于 2012-06-26T11:33:45.920 回答
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"
于 2012-06-26T17:05:03.833 回答