В TestCafe есть способ повторить навигацию по URL без особого ожидания - PullRequest
2 голосов
/ 11 апреля 2019

Наш проект использует TestCafe для тестов e2e. Из-за среды переход к URL периодически прерывается (Ping или другие проблемы). Режим карантина testCafe не является правильным решением, потому что один успех указывает на успех. Я пытаюсь написать решение для автоматического сценария, чтобы повторить попытку, когда правильный URL не загружается. Я хотел бы реализовать что-то вроде этого, ожидая утверждения, без «ожидания», вызывающего сбой теста или использующего жесткий .wait (30000)

await t.expect (getLocation ()). Содержит ('/ page', {timeout: 30000});

 test('Should login and navigate to desired URL', async t => {
     console.log('Login Page');
     await login.login('userName', 'password', '/page');

     for (let i = 0; i < 3; i++) {
         await t.wait(30000);
         url = await getUrl();
         if (!url.includes('/page')) {
             console.log('Retrying Login ' + (i + 1) + ' of 3');
             await login.login('userName', 'password', '/page);
             // there is a delay before the page loads
             // .wait(30000);  <== trying to avoid this if possible
             // await t.expect(getLocation()).contains('/page',  { timeout: 30000});  <== would prefer something like this without the causing a test failure
             url = await getUrl();
         } else {
             console.log('Login Valid');
             i = 3;
         }
     }

     console.log('Location Page');
     await t.expect(getLocation()).contains('/page',  { timeout: 30000});
     // ... script continues...

 //---------------------------

 export async function getUrl() {
     const getLocation = ClientFunction(() => document.location.href);
     const url = getLocation();
     return url;
 }

 async login(username: string, password: string, endpoint: string) {
         let url = await setUrl(environment);
         url = url + endpoint;
         console.log(url);
         await t
            .wait(5000)
            .navigateTo(url)
            .expect(this.userName.exists).ok('username field exists', {timeout: 20000})
            .expect(this.userName.hasAttribute( 'disabled')).notOk('username field enabled', {timeout: 20000})
            .hover(this.userName)
            .typeText(this.userName, username)
            // ----
            .expect(this.password.exists).ok('password field exists', {timeout: 2000})
            .expect(this.password.hasAttribute( 'disabled')).notOk('username field enabled', {timeout: 2000})
            .hover(this.password)
            .typeText(this.password, password)
            // ----
            .expect(this.submitBtn.exists).ok('submit button field exists', {timeout: 2000})
            .expect(this.submitBtn.hasAttribute( 'disabled')).notOk('username field enabled', {timeout: 2000})
            .hover(this.submitBtn)
            .click(this.submitBtn);
 }

Требуемое решение будет повторять функцию входа в систему 3 раза до сбоя.

1 Ответ

4 голосов
/ 12 апреля 2019

Чтобы избежать жесткого ожидания после вызова метода login, можно добавить следующие утверждения в методе login:

await t
  .expect(this.submitBtn.exists).notOk({timeout: 30000});

for (let i = 0; i < 30 ; i++) {
  await t.wait(1000);
  url = await getUrl();
  if (url.includes(endpoint)) {
    return;
  }
}

так что ваш основной цикл более прост:

for (let i = 0; i < 3; i++) {
  url = await getUrl();
  if (url.includes('/page')) {
    console.log(`Login Valid at step ${i}`);
    break;
  }
  console.log(`Login Invalid at step ${i}, retrying ...`);
  await login.login('userName', 'password', '/page);      
}
...