Cypress.io: Как отправить триггер из функции cy.then или cy.each? - PullRequest
0 голосов
/ 19 сентября 2019

Я пытаюсь проверить погоду, если между элементами страниц есть нужное ключевое слово store.

Например:

store keyword = "apple"

частьструктура страницы:

<tbody>
  <tr>
    <td class="store">
      <img class="offer-store" ... alt="amazon store" .../></td>
    <td ...
    ...</td>
  </tr>
  ...
  <tr>
    <td class="store">
      <img class="offer-store" ... alt="apple store" .../></td>
    <td ...
    ...</td>
  </tr>
</tbody>

У меня есть 3 товара, необходимо убедиться, что в каждом товаре есть магазин, содержащий ключевое слово магазина.

Один товар может иметь 10 страниц и иметь 10 магазинов в каждом.page.

Перейдите на страницу продукта и начните находить ключевое слово магазина.

Если я найду ключевое слово магазина во втором магазине на третьей странице, перейдите на другую страницу товара.

Моя стратегия:

for(var i = 0; i < 3; i++) // three product
{
  //assume I can go to store page of a product here(using var i)
  for(var j = 1; j < 10; j++) //search 10 store pages of the product
  { 
    cy.get(".offer-store").each(($item)=>{  
    cy.get($item).its('context').invoke('attr','alt').then((store)=>{
      if(store.indexOf('apple')!=-1)
        cy.log("found store!!")
        //send trigger to break cy.then, cy.each and a for loop
      })
    })
    cy.get('.btn-group').contains('>').click({force: true}) 
    //go to next page if not found in this page
  }
}

Сначала я использую переменную в качестве триггера для выполнения команды прерывания.

Позже я знаю, что вы не можете изменить внешнюю переменную в качестве триггера.Мне нужно использовать cy.then () в конце cy.then () или cy.each () для выполнения дальнейших операций.

Я пытался использовать кроме () для проверки вместо if (), но он получит ошибку утверждения, когда не найдет ключевое слово в первом элементе (но я хочу найти следующий).И я также попытался сделать uncaught: исключение, чтобы игнорировать ошибку:

Cypress.on('uncaught:exception', (err, runnable) => {
    return false
})

Я поместил этот код в cypress / support / commands.js, и он не работал.

Другойя попытался, чтобы вернуть значение как триггер в cy.then () / cy.each (), и я получил

CypressError: cy.then() failed because you are mixing up async and sync code.

Мой вопрос:

1.Как отправитьтриггер для прерывания цикла cy.then, cy.each и for в этом случае?

2.Как игнорировать ошибку подтверждения?

1 Ответ

0 голосов
/ 21 сентября 2019

То, что вам нужно, вероятно, лучше всего решить с помощью рекурсивной команды / помощника, который сканирует страницы до тех пор, пока не будет найдено хранилище или пока не останется другой страницы / хранилищ.

Ниже findStore - этофункция, которая вызывает _walkStores, которая является рекурсивной.Он сканирует текущую страницу и пытается загрузить следующую страницу, если ничего не найдено.

describe('test', () => {
    function _walkStores ( store ) {
        let found = false;
        return cy.get('.store').each( elem => {
            if ( Cypress.$(elem).find(`[data-store="${store}"]`).length ) {
                found = true;
                return false; // exit early (not required)
            }
        }).then(() => {
            if ( found ) {
                return true;
            } else {
                if ( Cypress.$('.nextPage').length ) {
                    cy.get('.nextPage').click();

                    // if your `.nextPage` button doesn't immediately repaint 
                    //  DOM as my mock helper does, you should assert url
                    //  change or something similar, before calling _walkStores,
                    //  so as to ensure the _walkStores doesn't retrieve the
                    //  same old DOM nodes
                    return _walkStores(store);
                }
                return false;
            }
        });
    }

    function findStore ( store ) {
        return _walkStores(store).then( found => {
            expect(found, `store "${store}"`).to.true;
        });
    }

    function loadProduct ( name ) {
        cy.window().then(win => {
            const pages = [
                `
                    <div class="store">
                        <div class="offer-store" data-store="apple">Apple</div>
                    </div>
                    <div class="store">
                        <div class="offer-store" data-store="amazon">Amazon</div>
                    </div>
                    <button class="nextPage" onclick="nextPage()">next</button>
                `,
                `
                    <div class="store">
                        <div class="offer-store" data-store="microsoft">Microsoft</div>
                    </div>
                    <div class="store">
                        <div class="offer-store" data-store="dell">Dell</div>
                    </div>
                    <button class="nextPage" onclick="nextPage()">next</button>
                `,
                `
                    <div class="store">
                        <div class="offer-store" data-store="ibm">IBM</div>
                    </div>
                    <div class="store">
                        <div class="offer-store" data-store="lenovo">Lenovo</div>
                    </div>
                `,
            ];

            const doc = win.document;

            win.nextPage = () => {
                const page = pages.shift();
                if ( !page ) return;
                doc.querySelector('.content').innerHTML = 'loading...';
                setTimeout(() => {
                    doc.querySelector('.content').innerHTML = page;
                }, 1000 );
            };
            doc.body.innerHTML = `
                <h1>${name}</h1>
                <div class="content">
                    ${pages.shift()}
                </div>
            `;
        });
    }

    it('test', () => {
        ['Laptop A', 'Laptop B'].forEach( name => {
            loadProduct(name);
            // will pass
            findStore('ibm');
        });

        // will fail
        findStore('xx');
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...