How to solve the error: Failed: Error while waiting for Protractor to sync with the page

How to solve the error: Failed: Error while waiting for Protractor to sync with the page

我使用量角器进行端到端测试。我的测试涉及 angular 页面和非 angular 页面。我在非 angular 页面上测试没有问题。但是当测试在非 angular 页面完成并返回 angular 页面时出现错误。

我的测试从主页(angular 页面)开始,然后单击登录按钮。这将重定向到非 angular 页面。完成输入用户名和密码,然后再次重定向到 angular 页面。当测试返回 angular 页面时,我在最后一步遇到问题。

beforeAll(() => {
    page = new Abcflow();
});

fdescribe('step 1', () => {
   beforeEach(async () => await page.navigateToStart());

    fit('login as staff and come back to home page', async () => {
    //start from an angular page
    await page.clickButton('a', 'Login / Register');

    //now in a non-angular page
    browser.driver.findElement(by.id('Email')).sendKeys('email');
    browser.driver.findElement(by.id('Password')).sendKeys('password');
    browser.driver.findElement(by.name('button')).click();

    //navigate back to angular page
    await page.navigateToStart();

    expect(await page.getPageTitleText()).toEqual('abc title');
  });
});

我可以看到我的测试页从非 angular 页面返回到 angular 页面。然后我得到了像

这样的错误

我尝试添加以下行:

browser.ignoreSynchronization = true;
browser.waitForAngularEnabled(false);

然后我收到另一个错误 "No element found using locator"。有趣的是,如果我不测试登录页面而只检查最后一行,它将成功通过。从非 angular 页面导航后,angular 页面测试似乎停止工作。

如果您的代码如您所说的那样工作,可能只是添加了 browser.waitForAngularEnabled(false);

fdescribe('step 1', () => {
   beforeEach(async () => await page.navigateToStart());

    fit('login as staff and come back to home page', async () => {
    //start from an angular page
    await page.clickButton('a', 'Login / Register');

    //now in a non-angular page
    await browser.driver.findElement(by.id('Email')).sendKeys('email');
    await browser.driver.findElement(by.id('Password')).sendKeys('password');
    await browser.driver.findElement(by.name('button')).click();

    //Setting this before you navigate back to the Angular page will ensure it will wait 
    // wait for page to load correctly
    await browser.waitForAngularEnabled(false);

    //navigate back to angular page
    await page.navigateToStart();

    expect(await page.getPageTitleText()).toEqual('abc title');
  });
});

您收到的错误可能是一个真正的错误,并且您在 angular 页面上的定位器存在问题,但您需要 post 您的错误消息和一些 html.

添加后:

browser.ignoreSynchronization = true;
browser.waitForAngularEnabled(false);

你得到了:

No element found using locator

因为Protractor没有等到页面完全加载就开始搜索元素了。同步已禁用,因此您需要添加特定时间等待页面加载:

browser.ignoreSynchronization = true;
browser.sleep(3000);

ignoreSynchronization=true 用于非 Angular 页面或量角器无法将其识别为 Angular 页面时。默认情况下 Protractor 使用 ignoreSynchronization=false 并等待 Angular 站点完全加载。

此外,您不应同时使用 ignoreSynchronizationwaitForAngularEnabled,因为它们的作用相同 ()。