未验证 提交 50ea19aa 编写于 作者: B Boris Sekachev 提交者: GitHub

Minor Cypress tests refactoring (#6693)

<!-- Raise an issue to propose your change
(https://github.com/opencv/cvat/issues).
It helps to avoid duplication of efforts from multiple independent
contributors.
Discuss your ideas with maintainers to be sure that changes will be
approved and merged.
Read the [Contribution
guide](https://opencv.github.io/cvat/docs/contributing/). -->

<!-- Provide a general summary of your changes in the Title above -->

### Motivation and context
<!-- Why is this change required? What problem does it solve? If it
fixes an open
issue, please link to the issue here. Describe your changes in detail,
add
screenshots. -->

### How has this been tested?
<!-- Please describe in detail how you tested your changes.
Include details of your testing environment, and the tests you ran to
see how your change affects other areas of the code, etc. -->

### Checklist
<!-- Go over all the following points, and put an `x` in all the boxes
that apply.
If an item isn't applicable for some reason, then ~~explicitly
strikethrough~~ the whole
line. If you don't do that, GitHub will show incorrect progress for the
pull request.
If you're unsure about any of these, don't hesitate to ask. We're here
to help! -->
- [x] I submit my changes into the `develop` branch
- [ ] I have added a description of my changes into the
[CHANGELOG](https://github.com/opencv/cvat/blob/develop/CHANGELOG.md)
file
- [ ] I have updated the documentation accordingly
- [ ] I have added tests to cover my changes
- [ ] I have linked related issues (see [GitHub docs](

https://help.github.com/en/github/managing-your-work-on-github/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword))
- [ ] I have increased versions of npm packages if it is necessary

([cvat-canvas](https://github.com/opencv/cvat/tree/develop/cvat-canvas#versioning),

[cvat-core](https://github.com/opencv/cvat/tree/develop/cvat-core#versioning),

[cvat-data](https://github.com/opencv/cvat/tree/develop/cvat-data#versioning)
and

[cvat-ui](https://github.com/opencv/cvat/tree/develop/cvat-ui#versioning))

### License

- [x] I submit _my code changes_ under the same [MIT License](
https://github.com/opencv/cvat/blob/develop/LICENSE) that covers the
project.
  Feel free to contact the maintainers if that's a concern.
上级 036b6245
......@@ -109,13 +109,7 @@ context('Ground truth jobs', () => {
}
function openQualityTab() {
cy.get('.cvat-task-page-actions-button').click();
cy.get('.cvat-actions-menu')
.should('be.visible')
.find('[role="menuitem"]')
.filter(':contains("View analytics")')
.last()
.click();
cy.clickInTaskMenu('View analytics', true);
cy.get('.cvat-task-analytics-tabs')
.within(() => {
cy.contains('span', 'Quality').click();
......
......@@ -23,8 +23,7 @@ context('List of export formats for a project without tasks is not empty', () =>
describe(`Testing issue "${issueId}"`, () => {
it('Export formats list is not empty for empty project', () => {
cy.projectActions(project.name);
cy.get('.cvat-project-actions-menu').contains('Export dataset').click();
cy.clickInProjectMenu('Export dataset', false, project.name);
cy.get('.cvat-modal-export-project').should('be.visible').find('.cvat-modal-export-select').click();
cy.get('.cvat-modal-export-option-item').should('have.length.above', 0);
});
......
......@@ -33,9 +33,7 @@ Cypress.Commands.add('login', (username = Cypress.env('user'), password = Cypres
});
Cypress.Commands.add('logout', () => {
cy.get('.cvat-right-header').within(() => {
cy.get('.cvat-header-menu-user-dropdown-user').trigger('mouseover');
});
cy.get('.cvat-header-menu-user-dropdown-user').trigger('mouseover');
cy.get('span[aria-label="logout"]').click();
cy.url().should('include', '/auth/login');
cy.visit('/auth/login');
......@@ -334,7 +332,8 @@ Cypress.Commands.add('openTask', (taskName, projectSubsetFieldValue) => {
Cypress.Commands.add('saveJob', (method = 'PATCH', status = 200, as = 'saveJob') => {
cy.intercept(method, '/api/jobs/**').as(as);
cy.get('button').contains('Save').click({ force: true }).trigger('mouseout');
cy.get('button').contains('Save').click({ force: true });
cy.get('button').contains('Save').trigger('mouseout');
cy.wait(`@${as}`).its('response.statusCode').should('equal', status);
});
......@@ -414,12 +413,12 @@ Cypress.Commands.add('createRectangle', (createRectangleParams) => {
cy.contains('.ant-radio-wrapper', createRectangleParams.points).click();
cy.contains('button', createRectangleParams.type).click();
});
cy.get('.cvat-canvas-container')
.click(createRectangleParams.firstX, createRectangleParams.firstY)
.click(createRectangleParams.secondX, createRectangleParams.secondY);
cy.get('.cvat-canvas-container').click(createRectangleParams.firstX, createRectangleParams.firstY);
cy.get('.cvat-canvas-container').click(createRectangleParams.secondX, createRectangleParams.secondY);
if (createRectangleParams.points === 'By 4 Points') {
cy.get('.cvat-canvas-container')
.click(createRectangleParams.thirdX, createRectangleParams.thirdY)
.click(createRectangleParams.thirdX, createRectangleParams.thirdY);
cy.get('.cvat-canvas-container')
.click(createRectangleParams.fourthX, createRectangleParams.fourthY);
}
cy.checkPopoverHidden('draw-rectangle');
......@@ -464,7 +463,8 @@ Cypress.Commands.add('createPoint', (createPointParams) => {
selectedValueGlobal = $labelValue.text();
});
if (createPointParams.numberOfPoints) {
cy.get('.ant-input-number-input').clear().type(createPointParams.numberOfPoints);
cy.get('.ant-input-number-input').clear();
cy.get('.ant-input-number-input').type(createPointParams.numberOfPoints);
}
cy.contains('button', createPointParams.type).click();
});
......@@ -476,7 +476,8 @@ Cypress.Commands.add('createPoint', (createPointParams) => {
} else if (!createPointParams.numberOfPoints) {
const keyCodeN = 78;
cy.get('.cvat-canvas-container')
.trigger('keydown', { keyCode: keyCodeN, code: 'KeyN' })
.trigger('keydown', { keyCode: keyCodeN, code: 'KeyN' });
cy.get('.cvat-canvas-container')
.trigger('keyup', { keyCode: keyCodeN, code: 'KeyN' });
}
cy.checkPopoverHidden('draw-points');
......@@ -493,7 +494,8 @@ Cypress.Commands.add('createEllipse', (createEllipseParams) => {
cy.contains('button', createEllipseParams.type).click();
});
cy.get('.cvat-canvas-container')
.click(createEllipseParams.firstX, createEllipseParams.firstY)
.click(createEllipseParams.firstX, createEllipseParams.firstY);
cy.get('.cvat-canvas-container')
.click(createEllipseParams.secondX, createEllipseParams.secondY);
cy.checkPopoverHidden('draw-ellipse');
cy.checkObjectParameters(createEllipseParams, 'ELLIPSE');
......@@ -509,7 +511,8 @@ Cypress.Commands.add('createSkeleton', (skeletonParameters) => {
cy.contains('button', skeletonParameters.type).click();
});
cy.get('.cvat-canvas-container')
.click(skeletonParameters.xtl, skeletonParameters.ytl)
.click(skeletonParameters.xtl, skeletonParameters.ytl);
cy.get('.cvat-canvas-container')
.click(skeletonParameters.xbr, skeletonParameters.ybr);
cy.checkPopoverHidden('draw-skeleton');
cy.checkObjectParameters(skeletonParameters, 'SKELETON');
......@@ -524,12 +527,18 @@ Cypress.Commands.add('changeAppearance', (colorBy) => {
Cypress.Commands.add('shapeGrouping', (firstX, firstY, lastX, lastY) => {
const keyCodeG = 71;
cy.get('.cvat-canvas-container')
.trigger('keydown', { keyCode: keyCodeG, code: 'KeyG' })
.trigger('keyup', { keyCode: keyCodeG, code: 'KeyG' })
.trigger('mousedown', firstX, firstY, { which: 1 })
.trigger('mousemove', lastX, lastY)
.trigger('mouseup', lastX, lastY)
.trigger('keydown', { keyCode: keyCodeG, code: 'KeyG' })
.trigger('keydown', { keyCode: keyCodeG, code: 'KeyG' });
cy.get('.cvat-canvas-container')
.trigger('keyup', { keyCode: keyCodeG, code: 'KeyG' });
cy.get('.cvat-canvas-container')
.trigger('mousedown', firstX, firstY, { which: 1 });
cy.get('.cvat-canvas-container')
.trigger('mousemove', lastX, lastY);
cy.get('.cvat-canvas-container')
.trigger('mouseup', lastX, lastY);
cy.get('.cvat-canvas-container')
.trigger('keydown', { keyCode: keyCodeG, code: 'KeyG' });
cy.get('.cvat-canvas-container')
.trigger('keyup', { keyCode: keyCodeG, code: 'KeyG' });
});
......@@ -542,7 +551,8 @@ Cypress.Commands.add('createPolygon', (createPolygonParams) => {
selectedValueGlobal = $labelValue.text();
});
if (createPolygonParams.numberOfPoints) {
cy.get('.ant-input-number-input').clear().type(createPolygonParams.numberOfPoints);
cy.get('.ant-input-number-input').clear();
cy.get('.ant-input-number-input').type(createPolygonParams.numberOfPoints);
}
cy.contains('button', createPolygonParams.type).click();
});
......@@ -555,7 +565,8 @@ Cypress.Commands.add('createPolygon', (createPolygonParams) => {
} else if (!createPolygonParams.numberOfPoints) {
const keyCodeN = 78;
cy.get('.cvat-canvas-container')
.trigger('keydown', { keyCode: keyCodeN, code: 'KeyN' })
.trigger('keydown', { keyCode: keyCodeN, code: 'KeyN' });
cy.get('.cvat-canvas-container')
.trigger('keyup', { keyCode: keyCodeN, code: 'KeyN' });
}
cy.checkPopoverHidden('draw-polygon');
......@@ -563,7 +574,7 @@ Cypress.Commands.add('createPolygon', (createPolygonParams) => {
});
Cypress.Commands.add('openSettings', () => {
cy.get('.cvat-right-header').find('.cvat-header-menu-user-dropdown').trigger('mouseover', { which: 1 });
cy.get('.cvat-header-menu-user-dropdown').trigger('mouseover');
cy.get('.anticon-setting').should('exist').and('be.visible').click();
cy.get('.cvat-settings-modal').should('be.visible');
});
......@@ -684,7 +695,9 @@ Cypress.Commands.add('updateAttributes', (attributes) => {
cy.get('.cvat-attribute-mutable-checkbox')
.find('[type="checkbox"]')
.should('not.be.checked')
.check()
.check();
cy.get('.cvat-attribute-mutable-checkbox')
.find('[type="checkbox"]')
.should('be.checked');
}
});
......@@ -698,7 +711,8 @@ Cypress.Commands.add('createPolyline', (createPolylineParams) => {
selectedValueGlobal = $labelValue.text();
});
if (createPolylineParams.numberOfPoints) {
cy.get('.ant-input-number-input').clear().type(createPolylineParams.numberOfPoints);
cy.get('.ant-input-number-input').clear();
cy.get('.ant-input-number-input').type(createPolylineParams.numberOfPoints);
}
cy.contains('button', createPolylineParams.type).click();
});
......@@ -710,13 +724,32 @@ Cypress.Commands.add('createPolyline', (createPolylineParams) => {
} else if (!createPolylineParams.numberOfPoints) {
const keyCodeN = 78;
cy.get('.cvat-canvas-container')
.trigger('keydown', { keyCode: keyCodeN, code: 'KeyN' })
.trigger('keydown', { keyCode: keyCodeN, code: 'KeyN' });
cy.get('.cvat-canvas-container')
.trigger('keyup', { keyCode: keyCodeN, code: 'KeyN' });
}
cy.checkPopoverHidden('draw-polyline');
cy.checkObjectParameters(createPolylineParams, 'POLYLINE');
});
Cypress.Commands.add('openTaskMenu', (taskName, fromTaskPage) => {
if (fromTaskPage) {
cy.contains('.cvat-text-color', 'Actions').click();
} else {
cy.contains('strong', taskName).parents('.cvat-tasks-list-item').find('.cvat-menu-icon').click();
}
});
Cypress.Commands.add('clickInTaskMenu', (item, fromTaskPage, taskName = '') => {
cy.openTaskMenu(taskName, fromTaskPage);
cy.get('.cvat-actions-menu')
.should('be.visible')
.find('[role="menuitem"]')
.filter(`:contains("${item}")`)
.last()
.click();
});
Cypress.Commands.add('deleteTask', (taskName) => {
let taskId = '';
cy.contains('.cvat-item-task-name', new RegExp(`^${taskName}$`))
......@@ -724,22 +757,12 @@ Cypress.Commands.add('deleteTask', (taskName) => {
.find('.cvat-item-task-id')
.then(($taskId) => {
taskId = $taskId.text().replace(/[^\d]/g, '');
cy.contains('.cvat-item-task-name', new RegExp(`^${taskName}$`))
.parents('.cvat-tasks-list-item')
.find('.cvat-menu-icon')
.trigger('mouseover');
cy.get('.cvat-actions-menu')
.should('be.visible')
.find('[role="menuitem"]')
.filter(':contains("Delete")')
.last()
.click();
cy.clickInTaskMenu('Delete', false, taskName);
cy.get('.cvat-modal-confirm-delete-task')
.should('contain', `The task ${taskId} will be deleted`)
.within(() => {
cy.contains('button', 'Delete').click();
});
cy.get('.cvat-actions-menu').should('be.hidden');
});
cy.contains('.cvat-item-task-name', new RegExp(`^${taskName}$`))
.parents('.cvat-tasks-list-item')
......@@ -873,7 +896,8 @@ Cypress.Commands.add('changeColorViaBadge', (labelColor) => {
.should('be.visible')
.first()
.within(() => {
cy.contains('hex').prev().clear().type(labelColor);
cy.contains('hex').prev().clear();
cy.contains('hex').prev().type(labelColor);
cy.contains('button', 'Ok').click();
});
cy.get('.cvat-label-color-picker').should('be.hidden');
......@@ -957,7 +981,8 @@ Cypress.Commands.add('addNewSkeletonLabel', ({ name, points }) => {
}));
});
cy.get('.ant-radio-button-wrapper:nth-child(3)').click().within(() => {
cy.get('.ant-radio-button-wrapper:nth-child(3)').click();
cy.get('.ant-radio-button-wrapper:nth-child(3)').within(() => {
cy.get('.ant-radio-button-input').should('have.attr', 'value', 'join');
});
......@@ -981,8 +1006,10 @@ Cypress.Commands.add('addNewSkeletonLabel', ({ name, points }) => {
});
});
cy.contains('Continue').scrollIntoView().click();
cy.contains('Continue').scrollIntoView().click();
cy.contains('Continue').scrollIntoView();
cy.contains('Continue').click();
cy.contains('Continue').scrollIntoView();
cy.contains('Continue').click();
});
});
......@@ -1036,10 +1063,9 @@ Cypress.Commands.add('getScaleValue', () => {
Cypress.Commands.add('goCheckFrameNumber', (frameNum) => {
cy.get('.cvat-player-frame-selector').within(() => {
cy.get('input[role="spinbutton"]')
.clear({ force: true })
.type(`${frameNum}{Enter}`, { force: true })
.should('have.value', frameNum);
cy.get('input[role="spinbutton"]').clear({ force: true });
cy.get('input[role="spinbutton"]').type(`${frameNum}{Enter}`, { force: true });
cy.get('input[role="spinbutton"]').should('have.value', frameNum);
});
});
......@@ -1050,12 +1076,14 @@ Cypress.Commands.add('checkFrameNum', (frameNum) => {
});
Cypress.Commands.add('goToNextFrame', (expectedFrameNum) => {
cy.get('.cvat-player-next-button').click().trigger('mouseout');
cy.get('.cvat-player-next-button').click();
cy.get('.cvat-player-next-button').trigger('mouseout');
cy.checkFrameNum(expectedFrameNum);
});
Cypress.Commands.add('goToPreviousFrame', (expectedFrameNum) => {
cy.get('.cvat-player-previous-button').click().trigger('mouseout');
cy.get('.cvat-player-previous-button').click();
cy.get('.cvat-player-previous-button').trigger('mouseout');
cy.checkFrameNum(expectedFrameNum);
});
......@@ -1186,10 +1214,9 @@ Cypress.Commands.add('renameTask', (oldName, newName) => {
});
Cypress.Commands.add('shapeRotate', (shape, expectedRotateDeg, pressShift = false) => {
cy.get(shape)
.trigger('mousemove')
.trigger('mouseover')
.should('have.class', 'cvat_canvas_shape_activated');
cy.get(shape).trigger('mousemove');
cy.get(shape).trigger('mouseover');
cy.get(shape).should('have.class', 'cvat_canvas_shape_activated');
cy.get('.svg_select_points_rot').then(($el) => {
const rect = $el[0].getBoundingClientRect();
let { x, y } = rect;
......@@ -1197,9 +1224,8 @@ Cypress.Commands.add('shapeRotate', (shape, expectedRotateDeg, pressShift = fals
x += width / 2;
y += height / 2;
cy.get('#root')
.trigger('mousemove', x, y)
.trigger('mouseenter', x, y);
cy.get('#root').trigger('mousemove', x, y);
cy.get('#root').trigger('mouseenter', x, y);
cy.get('.svg_select_points_rot').should('have.class', 'cvat_canvas_selected_point');
cy.get('#root').trigger('mousedown', x, y, { button: 0 });
if (pressShift) {
......@@ -1242,7 +1268,8 @@ Cypress.Commands.add('goToCloudStoragesPage', () => {
});
Cypress.Commands.add('deleteCloudStorage', (displayName) => {
cy.get('.cvat-cloud-storage-item-menu-button').trigger('mousemove').trigger('mouseover');
cy.get('.cvat-cloud-storage-item-menu-button').trigger('mousemove');
cy.get('.cvat-cloud-storage-item-menu-button').trigger('mouseover');
cy.get('.ant-dropdown')
.not('.ant-dropdown-hidden')
.within(() => {
......@@ -1294,13 +1321,16 @@ Cypress.Commands.add('createJob', (options = {
});
if (quantity) {
cy.get('.cvat-input-frame-quantity').clear().type(quantity);
cy.get('.cvat-input-frame-quantity').clear();
cy.get('.cvat-input-frame-quantity').type(quantity);
} else if (frameCount) {
cy.get('.cvat-input-frame-count').clear().type(frameCount);
cy.get('.cvat-input-frame-count').clear();
cy.get('.cvat-input-frame-count').type(frameCount);
}
if (seed) {
cy.get('.cvat-input-seed').clear().type(seed);
cy.get('.cvat-input-seed').clear();
cy.get('.cvat-input-seed').type(seed);
}
cy.contains('button', 'Submit').click();
......
......@@ -78,7 +78,7 @@ Cypress.Commands.add('openProject', (projectName) => {
cy.get('.cvat-project-details').should('exist');
});
Cypress.Commands.add('projectActions', (projectName) => {
Cypress.Commands.add('openProjectActions', (projectName) => {
cy.contains('.cvat-projects-project-item-title', projectName)
.parents('.cvat-projects-project-item-card')
.within(() => {
......@@ -88,9 +88,22 @@ Cypress.Commands.add('projectActions', (projectName) => {
});
});
Cypress.Commands.add('clickInProjectMenu', (item, fromProjectPage, projectName = '') => {
if (fromProjectPage) {
cy.get('.cvat-project-top-bar-actions').trigger('mouseover');
} else {
cy.openProjectActions(projectName);
}
cy.get('.cvat-project-actions-menu')
.should('exist')
.and('be.visible')
.contains(item)
.click();
});
Cypress.Commands.add('deleteProject', (projectName, projectID, expectedResult = 'success') => {
cy.projectActions(projectName);
cy.get('.cvat-project-actions-menu').contains('Delete').click();
cy.clickInProjectMenu('Delete', false, projectName);
cy.get('.cvat-modal-confirm-remove-project')
.should('contain', `The project ${projectID} will be deleted`)
.within(() => {
......@@ -106,8 +119,7 @@ Cypress.Commands.add('deleteProject', (projectName, projectID, expectedResult =
Cypress.Commands.add('exportProject', ({
projectName, type, dumpType, archiveCustomName,
}) => {
cy.projectActions(projectName);
cy.get('.cvat-project-actions-menu').contains('Export dataset').click();
cy.clickInProjectMenu('Export dataset', false, projectName);
cy.get('.cvat-modal-export-project').should('be.visible').find('.cvat-modal-export-select').click();
cy.contains('.cvat-modal-export-option-item', dumpType).should('be.visible').click();
cy.get('.cvat-modal-export-select').should('contain.text', dumpType);
......@@ -125,8 +137,7 @@ Cypress.Commands.add('exportProject', ({
Cypress.Commands.add('importProject', ({
projectName, format, archive,
}) => {
cy.projectActions(projectName);
cy.get('.cvat-project-actions-menu').contains('Import dataset').click();
cy.clickInProjectMenu('Import dataset', false, projectName);
cy.get('.cvat-modal-import-dataset').find('.cvat-modal-import-select').click();
if (format === 'Sly Point Cloud Format') {
cy.get('.ant-select-dropdown')
......@@ -152,8 +163,7 @@ Cypress.Commands.add(
targetStorage = null,
useDefaultLocation = true,
) => {
cy.projectActions(projectName);
cy.get('.cvat-project-actions-menu').contains('Backup Project').click();
cy.clickInProjectMenu('Backup Project', false, projectName);
cy.get('.cvat-modal-export-project').should('be.visible');
if (backupFileName) {
cy.get('.cvat-modal-export-project').find('.cvat-modal-export-filename-input').type(backupFileName);
......@@ -254,10 +264,7 @@ Cypress.Commands.add('waitForDownload', () => {
});
Cypress.Commands.add('deleteProjectViaActions', (projectName) => {
cy.get('.cvat-project-top-bar-actions').trigger('mouseover');
cy.get('.cvat-project-actions-menu').within(() => {
cy.contains('[role="menuitem"]', 'Delete').click();
});
cy.clickInProjectMenu('Delete', true);
cy.get('.cvat-modal-confirm-remove-project').within(() => {
cy.contains('button', 'Delete').click();
});
......@@ -266,7 +273,8 @@ Cypress.Commands.add('deleteProjectViaActions', (projectName) => {
Cypress.Commands.add('assignProjectToUser', (user) => {
cy.get('.cvat-project-details').within(() => {
cy.get('.cvat-user-search-field').click().type(user);
cy.get('.cvat-user-search-field').click();
cy.get('.cvat-user-search-field').type(user);
});
cy.get('.ant-select-dropdown')
.not('.ant-select-dropdown-hidden')
......@@ -280,18 +288,8 @@ Cypress.Commands.add('closeNotification', (className) => {
cy.get(className).should('not.exist');
});
Cypress.Commands.add('movingTask', (taskName, projectName, labelMappingFrom, labelMappingTo, fromTask) => {
if (fromTask) {
cy.contains('.cvat-text-color', 'Actions').click();
} else {
cy.contains('strong', taskName).parents('.cvat-tasks-list-item').find('.cvat-menu-icon').click();
}
cy.get('.cvat-actions-menu')
.should('be.visible')
.find('[role="menuitem"]')
.filter(':contains("Move to project")')
.last()
.click();
Cypress.Commands.add('movingTask', (taskName, projectName, labelMappingFrom, labelMappingTo, fromTaskPage) => {
cy.clickInTaskMenu('Move to project', fromTaskPage, taskName);
cy.get('.cvat-task-move-modal').find('.cvat-project-search-field').click();
cy.get('.ant-select-dropdown')
.last()
......
......@@ -37,9 +37,12 @@ Cypress.Commands.add('deleteWebhook', (description) => {
});
Cypress.Commands.add('setUpWebhook', (webhookData) => {
cy.get('#targetURL').clear().type(webhookData.targetURL);
cy.get('#description').clear().type(webhookData.description);
cy.get('#secret').clear().type(webhookData.secret);
cy.get('#targetURL').clear();
cy.get('#targetURL').type(webhookData.targetURL);
cy.get('#description').clear();
cy.get('#description').type(webhookData.description);
cy.get('#secret').clear();
cy.get('#secret').type(webhookData.secret);
if (!webhookData.enableSSL) cy.get('#enableSSL').uncheck();
if (!webhookData.isActive) cy.get('#isActive').uncheck();
......@@ -72,10 +75,7 @@ Cypress.Commands.add('openOrganizationWebhooks', () => {
});
Cypress.Commands.add('openProjectWebhooks', () => {
cy.get('.cvat-project-page-actions-button').trigger('mouseover');
cy.get('.cvat-project-actions-menu').within(() => {
cy.contains('[role="menuitem"]', 'Setup webhooks').click();
});
cy.clickInProjectMenu('Setup webhooks', true);
cy.get('.cvat-spinner').should('not.exist');
cy.get('.cvat-webhooks-page').should('exist');
});
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册