【问题标题】:How to revert override browser.waitforAngular in protractor如何在量角器中恢复覆盖 browser.waitforAngular
【发布时间】:2020-10-29 16:39:58
【问题描述】:

我有一个使用 Protractor 和 Jasmine 自动化的回归套件。正在测试的应用程序最近变成了混合应用程序,使用NgUpgrade 引导。 升级后,脚本在访问某些元素时会超时。我添加了下面的脚本来覆盖 waitforAngular 函数,这是超时问题的修复。但是,这不适用于登录(非角度页面)我需要为非角度页面恢复此覆盖。想知道是否有人可以提供任何帮助

**var script = "var callback = arguments[arguments.length - 1];" +
"angular.element(document.querySelector(\"body\")).injector()" +
".get(\"$browser\").notifyWhenNoOutstandingRequests(callback)";
browser.waitForAngular =  ()=> {
return browser.executeAsyncScript(script);
}**

【问题讨论】:

    标签: javascript angular protractor


    【解决方案1】:

    要覆盖 Protractor 等待 Angular 调用的默认行为,您可以通过以下方式禁用 Angular 等待: browser.waitForAngularEnabled(false)

    但是,Protractor 的文档建议直接使用封装的驱动程序,而不是切换可能导致脚本不稳定的 waitForAngularEnabled 属性。

    另一种方法是使用browser.driver.<whatever> 而不是browser.<whatever>

    例子:

    • browser.get当网页有Angular组件时
    • browser.driver.get当网页没有Angular组件时

    【讨论】:

    • 试过 'browser.waitForAngularEnabled(false)' 但没有运气。this.specStarted = function (result) { browser.executeScript("return !!(window.angular || window.ng);" ) .then(function(isAngular){ if(isAngular) { var script = "var callback = arguments[arguments.length - 1];" + "angular.element(document.querySelector(\"body\")).injector ()" + ".get(\"$browser\").notifyWhenNoOutstandingRequests(callback)"; browser.waitForAngular = (test)=> { if(test){ return browser.executeAsyncScript(script);}}} else { browser.waitForAngularEnabled(false); } });};
    • 也添加了 browser.driver.get,但仍然无法正常工作
    【解决方案2】:

    我在下面的非角度页面上尝试了解决方案 browser.waitForAngularEnabled(false),但它仍然进入 browser.executeAsyncScript(script) 并抛出错误“角度未定义”

     this.specStarted = function (result) {
          browser.executeScript("return !!(window.angular || window.ng);")
            .then(function(isAngular){
              if(isAngular) {
                console.log('angular page ');
                var script = "var callback = arguments[arguments.length - 1];" +
                  "angular.element(document.querySelector(\"body\")).injector()" +
                  ".get(\"$browser\").notifyWhenNoOutstandingRequests(callback)";
                browser.waitForAngular =  (test)=> {
                  if(test){
                    return browser.executeAsyncScript(script);
                  }
                }
              }
              else {
                browser.waitForAngularEnabled(false);
                console.log('not an angular page');
              }
            });
        };
    

    【讨论】:

      【解决方案3】:

      一种解决方案可以是修改默认的 angularEnabled 行为。默认情况下,waitForAngularEnabledtrue。您需要使用waitForAngularEnabled(false) 修改此默认行为。但请记住,它完全取决于脚本运行的顺序。即如果您在应用程序中登录并且现在想要导航到登录页面(非角度页面),您需要禁用此默认行为,并且每当您进入另一个页面(即 Angular 页面)时,您应该默认启用它行为。

      如果有帮助请告诉我!!!

      【讨论】:

        【解决方案4】:

        谢谢大家,下面的代码解决了这个问题

        browser.waitForAngular = function(){var script = "var callback = arguments[arguments.length -1]" +"angular.element(document.querySelector(\"body\")).injector()" +".get(\"$browser\").notifyWhenNoOutstandingRequests(callback)";
          if (!this.ignoreSynchronization) {
            return browser.executeAsyncScript(script);
          }
            else
          {
            return this.driver.controlFlow().execute(() => {
              return true;
            }, 
            'Ignore Synchronization Protractor.waitForAngular()')
          }
        };

        【讨论】:

          猜你喜欢
          • 2015-09-02
          • 2021-12-08
          • 1970-01-01
          • 1970-01-01
          • 2014-04-07
          • 2013-04-27
          • 1970-01-01
          • 1970-01-01
          • 2023-03-17
          相关资源
          最近更新 更多