【问题标题】:How do I verify that certain method was called on javascript object with Selenium?如何验证是否使用 Selenium 在 javascript 对象上调用了某些方法?
【发布时间】:2012-06-21 14:54:14
【问题描述】:

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

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

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

【问题讨论】:

    标签: javascript testing selenium mocking assertion


    【解决方案1】:

    好的,终于明白了。选择的模拟框架是: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>
    

    注意事项:

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

    【讨论】:

      【解决方案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")
      }
      

      如果要运行的脚本在&lt;script&gt; 标记中并且您选择的浏览器是Firefox,您可以通过任何函数挂钩onafterscriptexecute 事件。它更短,但我认为您无法确保调用了正确的参数:

      document.getElementById('script').onafterscriptexecute = function() {
          window.wwaFired = true;
      };
      

      【讨论】:

      • 不错的解决方案 - 对于单次调用可以正常工作,但对于复杂的交互,模拟效果更好
      • 当然。这是一个简单的一次性计时器。如果我必须使用它两次或想要更多的东西,我会使用 JsMockito。
      【解决方案3】:

      您可以扩展该函数以调用另一个函数来使用 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"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-16
        • 2012-04-08
        • 2016-06-12
        • 1970-01-01
        • 2017-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多