#reactjs #radio-button #cypress
Вопрос:
Я столкнулся с проблемой с Кипарисом. Я просто не мог проверить переключатель.
У меня есть 7 вопросов с переключателями » Да » или «Нет». По умолчанию все кнопки помечены как «НЕТ». Мне нужно проверить параметры «ДА», он отправит вызов API на серверную часть и продолжит творить чудеса.
HTML — код для YES выглядит следующим образом:
lt;input type="radio" id="options[0]radiovalue-true" class="form-control is-action-field form-check-input" value="true" style="opacity: 0; cursor: pointer; height: 0px; width: 0px;"gt;
HTML — код для NO выглядит следующим образом:
lt;input type="radio" id="options[0]radiovalue-false" class="form-control is-action-field form-check-input" value="false" checked="" style="opacity: 0; cursor: pointer; height: 0px; width: 0px;"gt;
По умолчанию переключатель » НЕТ «имеет свойство: checked: true
, переключатель» ДА » имеет свойство: checked: false
Это мои попытки:
cy.get('[class="sc-fzoJMP"]') .find('.list-group-item') .then((item) =gt; { cy.wrap(item) .eq(0) .should('contain', 'Is this opportunity?') .find('input[type="radio"]') .then((radioButtons) =gt; { cy.wrap(radioButtons).eq(0).check({ force: true }).should('be.checked'); });
Я использовал разные локаторы, пробовал ('[type="radio"]'), (':radio')
, ('#options[0]radiovalue-true')
Я использовал разные методы проверки: cy.get(':radio').click({force: true})
, cy.get(':radio').check('true', {force: true})
и попытался вывести код с помощью переключателей проверки из цикла, но это что-то другое. Он не проверяет переключатель, но может убедиться, что он не установлен. Я нашел одно решение для использования свойства invoke:
cy.wrap(radioButtons).eq(0).invoke('prop', 'checked', true).should('be.checked'); cy.wrap(radioButtons).eq(1).invoke('prop', 'checked', false).should('not.be.checked');
Но он проверяет переключатель «ДА», но не снимает флажок «НЕТ», и он не отправляет вызов API на серверную часть, как это должно быть.
This is full HTML code for YES and NO radio buttons:
lt;div class="d-flex "gt; lt;div class="mr-4" style="position: relative;"gt; lt;div class="form-check"gt; lt;input type="radio" id="options[0]radiovalue-true" class="form-control is-action-field form-check-input" value="true" style="opacity: 0; cursor: pointer; height: 0px; width: 0px;"gt; lt;label for="options[0]radiovalue-true" class="ml-0 form-check__radio form-check-label"gt; lt;svg viewBox="0 0 24 24" style="height: 20px; min-height: 20px; width: 20px; min-width: 20px; opacity: 1;"gt; lt;titlegt;Select Optionlt;/titlegt; lt;circle cx="12" cy="12" r="9" stroke="#666666" stroke-width="2" fill="white"gt;lt;/circlegt; lt;/svggt; lt;p class="sc-fznyAO hdDwJr ml-1 typography-body "gt;Yeslt;/pgt; lt;/labelgt; lt;/divgt; lt;/divgt; lt;div class="mr-4" style="position: relative;"gt; lt;div class="form-check"gt; lt;input type="radio" id="options[0]radiovalue-false" class="form-control is-action-field form-check-input" value="false" checked="" style="opacity: 0; cursor: pointer; height: 0px; width: 0px;"gt; lt;label for="options[0]radiovalue-false" class="ml-0 form-check__radio form-check-label"gt; lt;svg viewBox="0 0 24 24" style="height: 20px; min-height: 20px; width: 20px; min-width: 20px; opacity: 1;"gt; lt;titlegt;Selected Optionlt;/titlegt; lt;circle cx="12" cy="12" r="9" stroke="var(--dcp-color-primary)" stroke-width="2" fill="none"gt;lt;/circlegt; lt;circle cx="12" cy="12" r="5" fill="var(--dcp-color-primary)"gt;lt;/circlegt; lt;/svggt; lt;p class="sc-fznyAO hdDwJr ml-1 typography-body "gt;Nolt;/pgt; lt;/labelgt; lt;/divgt; lt;div class="action-field-wrapper is-action-field"gt;lt;/divgt; lt;/divgt; lt;/divgt;
Ответ №1:
Присвоенные идентификаторы содержат символы, которые не работают с #
обозначениями, но вы можете использовать обозначения атрибутов
cy.get('.list-group-item') .eq(0) .find('[id="options[0]radiovalue-true"]') // query id as an attribute .click() cy.get('.list-group-item') .eq(0) .find('[id="options[0]radiovalue-false"]') .click()
В частности, []
в идентификаторах перестает '#options[0]radiovalue-true'
работать.
С расширенным фрагментом это работает
cy.get('input[id="options[0]radiovalue-true"]') .click({force:true}) .should('be.checked')
Вам нужно force:true
из-за непрозрачности стиля:0 и ширины и высоты 0.
Это означает, что ввод эффективно скрыт, и, вероятно, есть лучший способ проверить это — возможно, щелкнуть по значкам SVG.
Комментарии:
1. Я тоже пробовал это! Это не работает (((
2. Вам понадобится больше HTML-кода, чтобы разобраться в этом, пожалуйста. Это сработало с фрагментом, который вы уже опубликовали.
3. Я просто добавил это.
4. Спасибо за комментарий! Я изменил его, чтобы нажать на SVG, и это, наконец, сработало! Он также отправил вызов API, как я и хотел!
5. Отличная, хорошая работа.
Ответ №2:
Вы можете использовать идентификаторы и нажать, чтобы выбрать переключатели » Да » или «Нет».
cy.get('.list-group-item') .eq(0) .find('#options[0]radiovalue-true') .click() //Clicks Yes cy.get('.list-group-item') .eq(0) .find('#options[0]radiovalue-false') .click() //Clicks No
Комментарии:
1. К сожалению, это не работает
2. Вы получаете какие-либо ошибки? Можете ли вы попробовать
click({force: true})
? Также было бы здорово, если бы вы могли добавить HTML всей строки, содержащей текст, и две переключатели.3. Да, я пытался « нажать({ force: true})»». Это не щелчок или проверка этого переключателя ошибка в утверждении ` должно («должно быть.проверено») «
4. Пожалуйста, поделитесь HTML-кодом всей строки, содержащей текст и две переключатели.
5. Я просто добавил это