#reactjs #material-ui #cypress
#reactjs #материал-пользовательский интерфейс #кипарис
Вопрос:
Я пытаюсь запустить MUI Select с помощью Cypress, но я не могу заставить его работать.
Я прочитал источник MUI selectInput, и ясно, что они запускаются при событии «mousedown». Я профилировал клик и видел, что это правда. Однако вызов cy.find(input).trigger('mousedown', { force: true })
не вызывает всплывающего cy.find('label').trigger('mousedown', { force: true })
окна, равно как и захват любого из содержащих div
элементов и запуск наведения курсора мыши на них.
Если я перейду на страницу примера MUI: https://material-ui.com/components/selects / и я проверяю там DOM и смотрю на элементы, ни у одного из них нет обработчика onmousedown, и захват их как глобальных и вызов temp<n>.dispatchEvent(new MouseEvent('mousedown'))
не вызывает открытия всплывающего окна. Поэтому я не могу понять, где подключается обработчик наведения курсора мыши.
Что я упускаю из виду?
Заранее спасибо.
Комментарии:
1. В наших тестах Cypress мы используем
findByText
(из библиотеки тестирования Cypress) и делаемcy.findByText("Text of the Select label or current selected value").click().findByText("Text of option we want to select").click()
.2. Если это может кому-нибудь помочь, вот обходной путь, вдохновленный этой темой , чтобы выбрать первый элемент в выпадающем списке с помощью клавиатуры :
cy.get('div.MuiSelect-root').first().type('{downarrow}{enter}')
Ответ №1:
Для Cypress, чтобы заполнить компонент Material-UI React Select
, это сработало для меня:
cy.get('#fooID')
.parent()
.click()
.get('ul > li[data-value="FooBar"]')
.click();
Замена:
Foo
с помощью вашего компонента MUI SelectId
FooBar
с текстом, который вы хотите выделить в раскрывающемся списке.
Этот пост помог мне указать правильное направление.
В компоненте Material-UI React Select
идентификатор метки формы переносится / контролируется внешним div. So .get('#fooID')
захватывает внутреннюю метку по идентификатору, .parent().click()
щелкает корневой компонент div, чтобы открыть выпадающий список, и .get('ul > li[data-value="FooBar"]').click()
находит и щелкает правильный элемент в раскрывающемся списке.
Ответ №2:
это работает для меня, представьте, что текст по умолчанию находится Organization
на вашем выборе, и вы хотите выбрать SUN
из выпадающего списка
cy.findByText('Organization').type('SUN{enter}');
Ответ №3:
Документация Cypress рекомендует назначать уникальный data-cy
реквизит элементам, с которыми Cypress должен взаимодействовать, поэтому вы должны сделать это как для поля выбора, так и для его параметров.
Смотрите пример ниже (при условии, что вы все еще используете Material-UI v4):
Компонент выбора:
<TextField
select
data-cy={`input-fruits`}
defaultValue=''
>
{
[`apple`,`banana`,`orange`].map((fruit, index) => (
<MenuItem
key={`item-${index}`}
value={fruit}
data-cy={`select-option-${fruit}`}
>
{fruit}
</MenuItem>
))
}
</TextField>
Тест Cypress:
it("should change value of select box", () => {
/** Confirm that the select box is empty by default */
cy.get(`[data-cy = "input-fruits"]`).should(`have.value`, ``);
/** Click on the select box, then on the option */
cy.get(`[data-cy = "input-fruits"]`).click();
cy.get(`[data-cy = "select-option-orange"]`).click();
/** Assert the new value of the select box */
cy.get(`[data-cy = "input-fruits"]`).should(`have.value`, `orange`);
});