Введите на cypress после того, как тип не введет значение

#dom #cypress

Вопрос:

Я только что сделал кипарисовое проклятие на Удеми и пытаюсь узнать немного больше. Я использую эту простую строку кода, чтобы получить поле и ввести значение внутри с помощью type и enter, однако я не получаю никаких ошибок, и значение не отображается внутри поля. вот строка кода cy.get('[class="multiselect__tags"]').eq('10').type('2,000,000{enter}') , как я новичок, я использую индекс, чтобы получить поле, так как на странице более 18 полей с атрибутами.

 cy.get('[class="multiselect__tags"]').eq('10').type('2,000,000{enter}')
    cy.get('[class="multiselect__tags"]').eq('11').type('2,000,000{enter}')
    cy.get('[class="multiselect__tags"]').eq('12').type('1,500{enter}')
 

Вот ДОМ

вот как это показано в тесте введите описание изображения здесь

введите описание изображения здесь

то же самое относится и к другим 2 коробкам

Ответ №1:

Элемент управления Vue-множественный выбор позволяет пользователю выбирать элементы из списка или вводить значение и нажимать клавишу ввод, чтобы выбрать его.

В результате в поле ввода добавляется «тег» для каждого из выбранных элементов.

Чтобы выбрать, набрав, вот как это можно сделать на демонстрационной странице

 it('selects from vue-multiselect by typing', () => {

  cy.viewport(1000,1000)
  cy.visit('https://vue-multiselect.js.org/')

  cy.get('div.multiselect').eq(0)       // there is no id to work with so just get 1st
    .type('NO Dependencies{enter}');    // select an item

  cy.get('div.multiselect').eq(0)     // same parent as above 
    .within(() => {                   // now work within that select

      cy.get('span.multiselect__tag')          // check the tags
        .should('have.length', 1)              // only one selected
        .invoke('text')              
        .should('contain', 'NO Dependencies')  // has the expected text
    })

  cy.get('div.multiselect').eq(0)       // same select
    .type('GitHub Stars{enter}');       // select another item

  cy.get('div.multiselect').eq(0)
    .within(() => {
      cy.get('span.multiselect__tag')          // check the tags
        .should('have.length', 2)              // now two selected
        .invoke('text')              
        .should('contain', 'GitHub Stars')  // has the expected text
    })
})
 

Чтобы выбрать, щелкните раскрывающийся список

 it('selects from vue-multiselect by clicking', () => {

  cy.viewport(1000,1000)
  cy.visit('https://vue-multiselect.js.org/')

  cy.get('div.multiselect').eq(0)
    .within(() => {
      cy.get('div.multiselect__select').click()  // open the dropdown
      cy.get('li.multiselect__element')
        .contains('NO Dependencies')
        .click()                                 // select an item
    })

  cy.get('div.multiselect').eq(0)     // same parent as above
    .within(() => {                   // now work within that select

      cy.get('span.multiselect__tag')          // check the tags
        .should('have.length', 1)              // only one selected
        .invoke('text')              
        .should('contain', 'NO Dependencies')  // has the expected text
    })
})
 

На вашей веб-странице у множественного выбора есть data-vv-name атрибут, который должен точно указать конкретный элемент управления, который мы хотим,

 const controlSelector = 'div.multiselect[data-vv-name="data.eoConditions.liability"]';

cy.get(controlSelector)      
  .type('2,000,000{enter}');    // select an item

cy.get(controlSelector)         // same parent as above
  .within(() => {               // work within that control

    cy.get('span.multiselect__tag')          // check the tags
      .should('have.length', 1)              // only one selected
      .invoke('text')              
      .should('contain', '2,000,000')        // has the expected text
    })

})
 

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

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

1. спасибо за ответ, к сожалению, это не работает. Я получаю сообщение об ошибке cy.type() может быть вызван только для одного элемента, и у меня есть 4. (это повторное отображение выпадающего списка валюта) Я добавлю лучший ДОМ.

2. можно ли было бы использовать более 1 атрибута, может быть, это сработает? Я пытаюсь, но все еще безуспешно.

3. возможно ли использовать ‘<ul ?

4. в вашем первом примере cy.get('[name*="liability"]') выбрана валюта dropbox, и там есть 4 элемента (мне не нужно ее менять). второй пример cy.get('[name$="liability]"]')' действительно запускает тест, но просто говорит, что есть 2 совпадения, совпадающие элементы не видны. Спасибо за страницу, которую я прочитаю, чтобы узнать о ней в будущем. как вы думаете, можно ли было бы открыть раскрывающийся список, а затем выбрать значение? Я добавляю изображение выпадающего списка

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