使用waitForAngularEnabled(false)的量角器是否与使用Selenium Webdriver一样好?

时间:2019-04-16 09:31:44

标签: angular selenium-webdriver protractor

我有一个需要自动化的有角度的网站。我计划使用Protractor,但是由于应用程序中有某些内容(不确定是否轮询,keepAlive或其他),protractor在第一个元素上测试了超时,但找不到它。但是,如果我使用waitforangularenabled(false),则可以正常工作。但是我几乎每个语句都必须使用await。

现在,我想知道在这种情况下它是否与在Java中使用硒一样好。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

If set to false, Protractor will not wait for Angular $http and $timeout tasks to complete before interacting with the browser. This can cause flaky tests, but should be used if, for instance, your app continuously polls an API with $timeout.

这是来自量角器文档中waitforangularenabled的官方文档。

But if I use waitforangularenabled(false), then it works fine.-因此,如果您遇到的问题是测试超时而未使用此标志,则表示在后台运行了一些摘要循环,这使量角器无法认为页面稳定足以测试。

I have to use await with almost every statement.-建议这样做,但不是强制性的。请再次查看说明此问题的文档。如果将承诺管理器标志(SELENIUM_PROMISE_MANAGER)设置为false,则只有它不会使用Promise管理器。如果您将Jasmine与Protractor一起使用,则可以在不使用async/await的情况下使用Protractor,因为Jasmine经过优化可处理此类与Promise相关的问题。请参阅here

Now, I wonder if its as good as using selenium in Java in this scenario.-IMO取决于您的选择和使用现有库的便利性。如果您能够使用Selenium和Java处理应用程序的异步行为,则应继续进行选择。

答案 1 :(得分:0)

angular的唯一问题是它等待特定的响应,但是仍然加载页面上的所有元素,因此执行失败。但是我已经在硒中创建了一些与量角器等待相同的方法。您可以使用这些。

public static void waitUntilAngular5Ready(){         尝试{             Object angular5Check = jsExec.executeScript(“返回getAllAngularRootElements()[0] .attributes ['ng-version']”);             如果(angular5Check!= null){                 Boolean angularPageLoaded =(Boolean)jsExec.executeScript(“ return window.getAllAngularTestabilities()。findIndex(x =>!x.isStable())=== -1”);                 System.out.println(angularPageLoaded +“ angularPageLoaded”);                 如果(!angularPageLoaded){                     poll(5);

                waitForAngular5Load();

                poll(5);
            }
        }
    } catch (WebDriverException ignored) {
    }
}

private static void waitForAngular5Load() {
    String angularReadyScript = "return window.getAllAngularTestabilities().findIndex(x=>!x.isStable()) === -1";
    angularLoads(angularReadyScript);
}

private static void angularLoads(String angularReadyScript) {
    try {
        ExpectedCondition<Boolean> angularLoad = driver -> Boolean.valueOf(((JavascriptExecutor) driver)
            .executeScript(angularReadyScript).toString());

        boolean angularReady = Boolean.valueOf(jsExec.executeScript(angularReadyScript).toString());

        if (!angularReady) {
            jsWait.until(angularLoad);
        }
    } catch (WebDriverException ignored) {
    }
}