如何验证是否使用Selenium在javascript对象上调用了某些方法?

如何验证是否使用Selenium在javascript对象上调用了某些方法?,javascript,testing,selenium,mocking,assertion,Javascript,Testing,Selenium,Mocking,Assertion,我想用selenium验证是否调用了某些方法(带有参数) JavaScript对象—一种使用JMockit的期望模拟,但使用JavaScript和selenium 不幸的是,这个对象是非常不透明的网站性能跟踪器,我无法访问它的内部,所以对我来说,模仿似乎是唯一的选择。还是我错过了一些明显的东西 更新:经过思考,我认为解决方案可能是: -等待HTML完全加载 -删除包含performance tracker的特定脚本标记 -创建javascript模拟对象,其行为类似于跟踪器,但记录调用以供以后使

我想用selenium验证是否调用了某些方法(带有参数) JavaScript对象—一种使用JMockit的期望模拟,但使用JavaScript和selenium

不幸的是,这个对象是非常不透明的网站性能跟踪器,我无法访问它的内部,所以对我来说,模仿似乎是唯一的选择。还是我错过了一些明显的东西

更新:经过思考,我认为解决方案可能是: -等待HTML完全加载 -删除包含performance tracker的特定脚本标记
-创建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"