【问题标题】:Handle Non-Angular pages in Protractor在 Protractor 中处理非 Angular 页面
【发布时间】:2015-08-31 06:03:56
【问题描述】:

我有一个应用程序,它导航到非 Angular 应用程序进行登录。基本登录是这样的。首先,加载 Angular 应用程序,然后单击页面上的按钮。然后导航到非 Angular 应用程序(使用 IdentityServer 实现的 STS)并登录,然后导航回 Angular 应用程序。

这是我为处理这个问题而编写的代码。

this.login = function (userId) { 
    browser.driver.get(browser.params.host.hostname);  
    browser.driver.findElement(by.id('continuebutton')).click();
    browser.driver.wait(function () {               
        browser.driver.findElement(by.xpath("//*[@id=\"body\"]/section/div[2]/div[3]/a")).click();
        browser.driver.findElement(by.id("UserName")).sendKeys(userId);
        browser.driver.findElement(by.id("Password")).sendKeys("flisdev");
        browser.driver.findElement(by.tagName("button")).click(); 
    }, 10000);
};

但这会引发“页面上未找到 Angular”错误,有时会为 XPath 引用的链接引发随机元素未找到错误。登录的基本流程类似于

Angular 应用 --> 非 Angular 应用 --> Angular 应用

我该如何处理这种登录?

【问题讨论】:

    标签: javascript angularjs protractor end-to-end


    【解决方案1】:

    在我的protractor_example github repo 中,我在页面级别使用browser.ignoreSynchronization = true; IE。在我的页面对象的顶部(看起来你正在使用它。这对我来说最有意义,也应该适用于你的情况,因为我的示例还包含a non-angular login page(看起来很常见)。

    另外,当使用browser.ignoreSynchronization = true 时,您不想使用browser.driver。只使用browser

    【讨论】:

      【解决方案2】:

      每当您转向非 Angular 应用程序时,请使用:

      browser.ignoreSynchronization = true 
      

      beforeAll()beforeEach() 函数中的代码,以便量角器知道它不应该在页面上检查 Angular 并且不会等待 Angular 稳定下来。如果这仍然不能解决您的问题,请尝试在您的 Angular 应用程序中提供browser.ignoreSynchronization = false 以及上述行。除此之外,它的最佳实践是在对其执行操作之前等待元素出现,以避免与元素存在相关的错误。希望这会有所帮助。

      【讨论】:

      • 在我发布问题之前我也尝试过这个。这仍然会在运行测试时给出 angular not found 错误。
      • @KasunKodagoda 您是否尝试在beforeAll()beforeEach() 函数中添加该行?还是在onPrepare() 函数中?
      猜你喜欢
      • 2020-06-11
      • 1970-01-01
      • 1970-01-01
      • 2012-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多