PromucFlow_constructor/app/client/cypress/locators/WidgetLocators.ts
Sagar Khalasi 1cf043c40a
fix: Inline editing flaky test fix (#36366)
## Description

EE PR: [Appsmith EE Pull Request
#5158](https://github.com/appsmithorg/appsmith-ee/pull/5158)

Root Cause Analysis (RCA):
The `updateCodeInput` function was identified as a source of flakiness
due to improper execution. Additionally, the `SaveLocalStorageCache`
caused issues by retaining the reset button after the 6th test case,
resulting in a duplicate button in the 7th test case, which led to test
failures.

Solution:
Replaced `updateCodeInput` with `EnterJSContext` from `agHelper` for
more reliable execution. For the second flaky step, a new page was
created, and a table with relevant data was added. This resolved the
issue without requiring significant changes to the test case or
workflow.

Fixes #`36365`  

## Automation

/ok-to-test tags="@tag.ImportExport"

### 🔍 Cypress test results
<!-- This is an auto-generated comment: Cypress test results  -->
> [!TIP]
> 🟢 🟢 🟢 All cypress tests have passed! 🎉 🎉 🎉
> Workflow run:
<https://github.com/appsmithorg/appsmith/actions/runs/10940196158>
> Commit: 32d1be4c3dfe54bf8a0f8e9f54b20d2845c86407
> <a
href="https://internal.appsmith.com/app/cypress-dashboard/rundetails-65890b3c81d7400d08fa9ee5?branch=master&workflowId=10940196158&attempt=1"
target="_blank">Cypress dashboard</a>.
> Tags: `@tag.ImportExport`
> Spec:
> <hr>Thu, 19 Sep 2024 12:01:32 UTC
<!-- end of auto-generated comment: Cypress test results  -->


## Communication
Should the DevRel and Marketing teams inform users about this change?
- [ ] Yes
- [x] No


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

## Summary by CodeRabbit

- **Bug Fixes**
- Adjusted the inline editing test suite for the table widget to improve
state management between tests.

- **New Features**
- Updated the limited tests to focus on inline editing functionality,
enhancing testing priorities for the Table V2 widget.
- Introduced new properties in the widget locators to enhance UI
interactions, including selectors for various controls and elements
within the property pane and cell editing functionalities.
- Added a new JavaScript toggle selector to facilitate interactions in
tests.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2024-09-20 12:44:14 +05:30

184 lines
7.4 KiB
TypeScript

export const WIDGET = {
INPUT_V2: "inputwidgetv2",
TEXT: "textwidget",
TEXTNAME: (index: string) => `Text${index}`,
PHONE_INPUT: "phoneinputwidget",
CURRENCY_INPUT: "currencyinputwidget",
BUTTON: "buttonwidget",
BUTTONNAME: (index: string) => `Button${index}`,
CODESCANNER: "codescannerwidget",
CONTAINER: "containerwidget",
MULTISELECT: "multiselectwidgetv2",
BUTTON_GROUP: "buttongroupwidget",
TREESELECT: "singleselecttreewidget",
TAB: "tabswidget",
TABLE_V1: "tablewidget",
TABLE: "tablewidgetv2",
SWITCHGROUP: "switchgroupwidget",
SWITCH: "switchwidget",
SELECT: "selectwidget",
MULTITREESELECT: "multiselecttreewidget",
RADIO_GROUP: "radiogroupwidget",
LIST: "listwidget",
LIST_V2: "listwidgetv2",
RATING: "ratewidget",
CHECKBOXGROUP: "checkboxgroupwidget",
CHECKBOX: "checkboxwidget",
CHART: "chartwidget",
AUDIO: "audiowidget",
AUDIORECORDER: "audiorecorderwidget",
CAMERA: "camerawidget",
FILEPICKER: "filepickerwidgetv2",
DOCUMENT_VIEWER: "documentviewerwidget",
VIDEO: "videowidget",
CATEGORY_SLIDER: "categorysliderwidget",
NUMBER_SLIDER: "numbersliderwidget",
RANGE_SLIDER: "rangesliderwidget",
IFRAME: "iframewidget",
DIVIDER: "dividerwidget",
PROGRESS: "progresswidget",
MODAL: "modalwidget",
FORM: "formwidget",
ICONBUTTON: "iconbuttonwidget",
IMAGE: "imagewidget",
STATBOX: "statboxwidget",
JSONFORM: "jsonformwidget",
MENUBUTTON: "menubuttonwidget",
DATEPICKER: "datepickerwidget2",
MAP: "mapwidget",
MAPCHART: "mapchartwidget",
} as const;
// property pane element selector are maintained here
export const PROPERTY_SELECTOR = {
// input
onClick: ".t--property-control-onclick",
onSubmit: ".t--property-control-onsubmit",
text: ".t--property-control-text",
defaultValue: ".t--property-control-defaultselectedvalues",
propertyName: ".t--property-control-propertyname",
onClickFieldName: "onClick",
TextFieldName: "Text",
tableData: ".t--property-control-tabledata",
tableColumnNames: '[data-rbd-draggable-id] input[type="text"]',
jsToggle : '.t--js-toggle',
};
export const WIDGETSKIT = {
recorderPrompt: "//button[@status='PERMISSION_PROMPT']",
recorderStart: "//button[@status='DEFAULT']",
recorderComplete: "//button[@status='COMPLETE']",
recorderStop: ".bp3-minimal",
video: "video",
iFrame: "iframe",
videoWidgetYoutubeMuteBtn: ".ytp-mute-button",
videoWidgetYoutubeLargePlayBtn: ".ytp-large-play-button",
videoWidgetYoutubePlayBtn: ".ytp-play-button",
videoWidgetYoutubeVolumeBtn: ".ytp-volume-panel",
image: "div[data-testid=styledImage]",
imageDownloadBtn: "//a[@data-testid='t--image-download']",
imageRotateAntiClockwiseBtn:
"//div[contains(@class, 't--widget-imagewidget')]//a[1]",
imageRotateClockwiseBtn:
"//div[contains(@class, 't--widget-imagewidget')]//a[2]",
styleResetBtn: ".reset-button",
styleOrangeIcon: ".rounded-full",
dividerVertical: "[data-testid=dividerVertical]",
dividerHorizontal: "[data-testid=dividerHorizontal]",
selectWidgetBtn: ".select-button",
selectWidgetLabel: '//label[contains(@class,"select-label")]',
selectWidgetLabelContainer:
'//label[contains(@class,"select-label")]//parent::span/parent::span/parent::div',
widgetNameTag: "span.t--widget-name",
selectWidgetFilter: ".select-popover-wrapper .bp3-input-group input",
selectWidgetClear: "[data-testid='selectbutton.btn.cancel']",
selectWidgetWidthPlusBtn: ".ads-v2-input__input-section-icon-end",
selectWidgetPlaceholder: (value: string) =>
`//span[contains(@title,'${value}')]`,
textWidgetLink: (link: string) => `//a[@href='${link}']`,
textWidgetContainer: ".t--text-widget-container",
inputWidgetLabel: ".t--input-widget-label",
inputWidgetUnMaskPassword: '[name="eye-on"]',
inputWidgetMaskPassword: '[name="eye-off"]',
inputWidgetWrapper: ".text-input-wrapper",
inputWidgetStepUp:
"//*[contains(@class, 'bp3-icon-chevron-up')]//parent::button",
inputWidgetStepDown:
"//*[contains(@class, 'bp3-icon-chevron-down')]//parent::button",
radioWidgetContainer: "[data-testid='radiogroup-container']",
radioBtn: ".bp3-radio",
radioWidgetLabel: ".radiogroup-label",
radioWidgetLabelContainer:
"[data-testid='radiogroup-container'] .label-container",
};
type ValueOf<T> = T[keyof T];
export const getWidgetSelector = (widget: ValueOf<typeof WIDGET>) =>
`.t--widget-${widget}`;
export const getWidgetInputSelector = (widget: ValueOf<typeof WIDGET>) =>
`.t--widget-${widget} input`;
export const modalWidgetSelector = ".t--modal-widget";
// export data-testid with user input
export const progressWidgetProgress = (input: any) =>
`[data-testid='${input}']`;
//switch widget locators
export const switchlocators = {
switchGroupLabel: ".switchgroup-label",
switchTooltip:
"//*[@data-testid='switchgroup-container']//*[@class='bp3-popover-target']",
switchWidget: "//*[@data-testid='switchgroup-container']",
switchWidgetHeight: (height: string) =>
`//*[@data-testid='switchgroup-container']//div[@height="${height}"]`,
switchGroupToggleChecked: (value: string) =>
`//*[text()='${value}']//input[@type="checkbox"]`,
};
export const checkboxlocators = {
checkBoxLabel: (value: string) =>
`//*[contains(@class,'t--checkbox-widget-label') and text()='${value}']`,
};
export const datePickerlocators = {
options: `//*[contains(@id,'rc_select_') and @role='option']`,
input: `//*[@class='bp3-input-group']//input`,
dayPick: `//*[contains(@class,'DayPicker-Day')]`,
selectYear: `//*[contains(@class,'bp3-datepicker-year-select')]//select//option`,
selectMonth: `//*[contains(@class,'bp3-datepicker-month-select')]//select//option`,
yearCaret: `//*[contains(@class,'bp3-datepicker-year-select')]//*[contains(@class,'bp3-icon-double-caret-vertical')]`,
monthCaret: `//*[contains(@class,'bp3-datepicker-month-select')]//*[contains(@class,'bp3-icon-double-caret-vertical')]`,
yearInDropdown: (year: string) =>
datePickerlocators.selectYear + `[@value='${year}']`,
monthInDropdown: (month: string) =>
datePickerlocators.selectMonth + `[@label='${month}']`,
inputHour: `.bp3-timepicker-hour`,
inputMinute: `.bp3-timepicker-minute`,
inputSecond: `.bp3-timepicker-second`,
weekDay: `//*[@class='DayPicker-Weekday']//*[@title]`,
calendarHeader: `//*[contains(@class,'datepicker__calender-header')]//*[@type='button']`,
year: (yearToSelect: string) => `//*[@data-value='${yearToSelect}']`,
date: (dateToSelect: string) =>
`//*[contains(@class,'datepicker__day--${dateToSelect}')]`,
};
export const buttongroupwidgetlocators = {
buttongroup: ".t--buttongroup-widget",
buttonSettingInPropPane: ".t--property-control-buttons .t--edit-column-btn",
menuSettingInPropPane: ".t--edit-column-btn",
newButton: "//*[text()='Add button']",
groupButtonValue: "//input[contains(@value,'Group Button')]",
buttonText: (value: string) =>
`//*[@class="bp3-button-text" and text()='${value}']`,
menu: "[data-value='MENU']",
buttonMenuOptions: (text: string) =>
`//*[contains(@class,'bp3-menu-item')]//*[text()='${text}']`,
button: "//*[contains(@class,'t--widget-buttongroupwidget')]//button",
};
export const multiSelectWidgetLocators = {
multiSelectWidgetTrigger: ".t--widget-multiselectwidgetv2 .rc-select-selector",
multiSelectWidgetSelectedOptionContent: ".rc-select-selection-item > .rc-select-selection-item-content",
multiSelectWidgetDropdownOptionCheckbox: ".multi-select-dropdown .rc-select-item-option-selected .bp3-control-indicator"
};