Доступ к p-раскрывающимся элементам с помощью индекса в Cypress

#javascript #cypress #primeng #angular-e2e

Вопрос:

У меня есть p-dropdown :

HTML:

 <span>
  <p-dropdown formControlName="theatreGroup" [options]="theatreGroupsList">
  </p-dropdown>
</span>
 

тс:

   theatreGroupsList: any[] = [
    { label: 'Hamlet', value: 100 },
    { label: 'Dutchman', value: 351 },
    { label: 'King Lear', value: 180 },
    { label: 'Candida', value: 211 },
    { label: 'Twelfth Night', value: 133 }
  ];
 

Мне нужно иметь возможность получить список театральных групп и выбрать элемент. Я могу сделать это, проверив значение элементов в массиве:

 cy.get('p-dropdown[formControlName="theatreGroup"]').click().contains('Candida').click();
 

Но проблема в том, что список групп театров динамичен. Поэтому мне нужно иметь возможность в любое время получить список и получить доступ к его элементам, используя индекс (т. Е. Не значение или метку).
Вы можете мне в этом помочь?

Комментарии:

1. Вы можете легко получить параметры по индексу, но что вы хотите протестировать? Пожалуйста, проясните этот вопрос подробнее.

2. Я уже объяснял в вопросе. Мне нужно получить доступ к элементам по индексу. Например, я должен быть в состоянии получить элемент с индексом 3 в любое время.

Ответ №1:

Я вдохновился комментариями Стива Зодиака и ответом КХана и разработал это решение, которое работает для меня:

 cy.get('p-dropdown[formControlName="theatreGroup"]').click().then(x => {
  cy.get('p-dropdown[formControlName="theatreGroup"]>div>div>div>ul>p-dropdownitem').then(groups => {
    
    // Assume we need to access item at index 3, then select in the dropdown
    let group3 = groups[3]['innerText'];        

    // An extra click to prevent error about detached element from the DOM.
    cy.get('p-dropdown[formControlName="theatreGroup"]').click();

    cy.get('p-dropdown[formControlName="theatreGroup"]').click().get('div').contains(group3).click();
  });
});
 

Ответ №2:

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

Вот несколько идей

 cy.get('p-dropdown[formControlName="theatreGroup"]').click() //open

cy.get('ul.p-dropdown-items li span')    
  .should('have.length', 'gt', 0);     // list is animated on open, 
                                       // so wait for a populated list 

cy.get('ul.p-dropdown-items li span')  
  .then(($items, index) => {
    const texts = [...$items].map(item => item.innerText)
    ...  // take a look at the texts

cy.get('ul.p-dropdown-items li span')  
  .eq(1)
  .should('have.text', 'Candida')
 

Комментарии:

1. Цель теста-получение элементов массива по индексу (а не по метке или значению). Таким образом, ваше решение мне не помогло. Также: 1) Не существует имен классов «p-выпадающие элементы». 2) Неправильные праматери отправляются в «тогда». «затем» принимает либо функцию обратного вызова, либо массив опций и функцию обратного вызова. … Спасибо за ваши усилия 🙂

2. ABC — HTML, который вы показываете, является исходным кодом, а не HTML, который видит Cypress. На странице runtime PrimeNG действительно есть .p-dropdown-items имена классов, которые можно использовать для получения параметров.