Skip to content

[Test] Automate rename workspace test#23838

Merged
dmytro-ndp merged 2 commits into
eclipse-che:mainfrom
SkorikSergey:renameWorkspace
May 20, 2026
Merged

[Test] Automate rename workspace test#23838
dmytro-ndp merged 2 commits into
eclipse-che:mainfrom
SkorikSergey:renameWorkspace

Conversation

@SkorikSergey
Copy link
Copy Markdown
Contributor

@SkorikSergey SkorikSergey commented May 7, 2026

What does this PR do?

Automate “Rename Workspace” test

Test scenario:

  1. Create workspace from sample.
  2. Wait on workspace being started and running.
  3. Go to workspace details page and ensure rename is not possible.
  4. Stop workspace.
  5. Go to workspace details page and rename it to the “new-ws”.
  6. Ensure workspace name has been changed to the “new-ws” all over User Dashboard
  7. Start workspace and ensure running workspace can be opened from the User Dashboard.
  8. Stop workspace.
  9. Go to workspace details page and ensure workspace name can’t be changed to the “new-ws”.
  10. Create new workspace.
  11. Go to workspace new workspace details page and rename it to the “new-ws” name.
  12. Observe error status and that it is not possible to rename workspace to “new-ws”.

Screenshot/screencast of this PR

What issues does this PR fix or reference?

https://redhat.atlassian.net/browse/CRW-10665

How to test this PR?

Test logs
          ▼ Dashboard.waitPage
            ‣ DriverHelper.waitVisibility - By(xpath, //div[@id="page-sidebar"]//a[contains(text(), "Workspaces (")])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
            ‣ DriverHelper.waitVisibility - By(xpath, //div[@id="page-sidebar"]//a[text()="Create Workspace"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ WorkspaceHandlingTests.createAndOpenWorkspace - fetching user kubernetes namespace, storing auth token by getting workspaces API URL.
          ▼ ApiUrlResolver.obtainUserNamespace
            ‣ ApiUrlResolver.obtainUserNamespace - USER_NAMESPACE.length = 0, calling kubernetes API
            ‣ DriverHelper.getDriver
(node:23598) Warning: Setting the NODE_TLS_REJECT_UNAUTHORIZED environment variable to '0' makes TLS connections and HTTPS requests insecure by disabling certificate verification.
(Use `node --trace-warnings ...` to show where the warning was created)
          ▼ ApiUrlResolver.obtainUserNamespace - kubeapi success: admin-devspaces
          ▼ Dashboard.clickCreateWorkspaceButton
            ‣ DriverHelper.waitAndClick - By(xpath, //div[@id="page-sidebar"]//a[text()="Create Workspace"])
            ‣ DriverHelper.waitVisibility - By(xpath, //div[@id="page-sidebar"]//a[text()="Create Workspace"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ CreateWorkspace.waitPage
          ▼ CreateWorkspace.waitTitleContains - text: "Create Workspace"
            ‣ DriverHelper.waitVisibility - By(xpath, //h1[contains(text(), 'Create Workspace')])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ CreateWorkspace.setCreateNewWorkspaceCheckbox - checked: true
          ▼ CreateWorkspace.isCreateNewWorkspaceCheckboxChecked
            ‣ DriverHelper.waitPresence - By(css selector, *[id="create-new-if-exist-switch"])
          ▼ CreateWorkspace.setCreateNewWorkspaceCheckbox - Checkbox is already set, no action needed
          ▼ BrowserTabsUtil.getCurrentWindowHandle
            ‣ DriverHelper.getDriver
          ▼ CreateWorkspace.clickOnSampleNoEditorSelection - sampleName: "Python"
            ‣ CreateWorkspace.getSampleLocator - sampleName: Python, used default editor
            ‣ DriverHelper.waitAndClick - By(xpath, //div[contains(@id, 'sample-card') and text()='Python'])
            ‣ DriverHelper.waitVisibility - By(xpath, //div[contains(@id, 'sample-card') and text()='Python'])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ BrowserTabsUtil.waitAndSwitchToAnotherWindow
            ‣ DriverHelper.waitUntilTrue
          ▼ BrowserTabsUtil.getAllWindowHandles
            ‣ DriverHelper.getDriver
          ▼ BrowserTabsUtil.getAllWindowHandles
            ‣ DriverHelper.getDriver
          ▼ BrowserTabsUtil.switchToWindow
            ‣ DriverHelper.getDriver
            ‣ DriverHelper.getDriver
            ‣ WorkspaceHandlingTests.obtainWorkspaceNameFromStartingPage - failed to obtain name from workspace start page, element not visible yet. Retrying.
            ‣ DriverHelper.wait - (1000 milliseconds)
            ‣ DriverHelper.getDriver
            ‣ WorkspaceHandlingTests.obtainWorkspaceNameFromStartingPage - failed to obtain name from workspace start page, element not visible yet. Retrying.
            ‣ DriverHelper.wait - (1000 milliseconds)
            ‣ DriverHelper.getDriver
            ‣ WorkspaceHandlingTests.obtainWorkspaceNameFromStartingPage - failed to obtain name from workspace start page, element not visible yet. Retrying.
            ‣ DriverHelper.wait - (1000 milliseconds)
            ‣ DriverHelper.getDriver
            ‣ WorkspaceHandlingTests.obtainWorkspaceNameFromStartingPage - failed to obtain name from workspace start page, element not visible yet. Retrying.
            ‣ DriverHelper.wait - (1000 milliseconds)
            ‣ DriverHelper.getDriver
            ‣ WorkspaceHandlingTests.obtainWorkspaceNameFromStartingPage - failed to obtain name from workspace start page, element not visible yet. Retrying.
            ‣ DriverHelper.wait - (1000 milliseconds)
            ‣ DriverHelper.getDriver
            ‣ WorkspaceHandlingTests.obtainWorkspaceNameFromStartingPage - obtained starting workspace getText():Starting workspace python-hello-world
            ‣ WorkspaceHandlingTests.obtainWorkspaceNameFromStartingPage - trimmed workspace name from getText():python-hello-world
      • WorkspaceHandlingTests.obtainWorkspaceNameFromStartingPage - obtained workspace name from workspace loader page: python-hello-world
          ▼ registerRunningWorkspace - with workspaceName:python-hello-world
          ▼ ProjectAndFileTests.waitWorkspaceReadinessForCheCodeEditor - waiting for editor.
            ‣ DriverHelper.waitVisibility - By(css selector, .monaco-workbench)
            ‣ DriverHelper.waitVisibility - polling timed out attempt #1, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #2, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #3, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #4, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #5, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #6, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #7, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #8, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #9, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #10, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #11, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #12, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #13, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #14, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #15, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #16, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #17, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #18, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #19, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #20, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #21, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #22, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #23, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ ProjectAndFileTests.waitWorkspaceReadinessForCheCodeEditor - editor was opened in 27430 seconds.
    ✔ Create workspace from sample (Python) (35019ms)
          ▼ Dashboard.openDashboard
            ‣ DriverHelper.navigateToUrl
            ‣ DriverHelper.getDriver
            ‣ DriverHelper.getDriver
          ▼ Dashboard.openDashboard - No alert detected
          ▼ Dashboard.waitPage
            ‣ DriverHelper.waitVisibility - By(xpath, //div[@id="page-sidebar"]//a[contains(text(), "Workspaces (")])
            ‣ DriverHelper.waitVisibility - polling timed out attempt #1, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - element is located and is visible.
            ‣ DriverHelper.waitVisibility - By(xpath, //div[@id="page-sidebar"]//a[text()="Create Workspace"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Dashboard.clickWorkspacesButton
            ‣ DriverHelper.waitAndClick - By(xpath, //div[@id="page-sidebar"]//a[contains(text(), "Workspaces (")])
            ‣ DriverHelper.waitVisibility - By(xpath, //div[@id="page-sidebar"]//a[contains(text(), "Workspaces (")])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.waitPage
            ‣ DriverHelper.waitVisibility - By(css selector, button[aria-label="Add Workspace"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.clickWorkspaceListItemLink - "python-hello-world"
            ‣ DriverHelper.waitAndClick - By(xpath, //tr[td//span[text()='python-hello-world']]//span[text()='python-hello-world'])
            ‣ DriverHelper.waitVisibility - By(xpath, //tr[td//span[text()='python-hello-world']]//span[text()='python-hello-world'])
          ▼ DriverHelper.waitVisibility - stale element error - {"name":"StaleElementReferenceError","remoteStacktrace":"#0 0x555853794afa <unknown>\n#1 0x555853196265 <unknown>\n#2 0x55585319d111 <unknown>\n#3 0x55585319fc5b <unknown>\n#4 0x555853232a99 <unknown>\n#5 0x555853231969 <unknown>\n#6 0x5558531dc5cf <unknown>\n#7 0x5558531dd391 <unknown>\n#8 0x555853759fdb <unknown>\n#9 0x55585375cf9d <unknown>\n#10 0x555853746798 <unknown>\n#11 0x55585375db30 <unknown>\n#12 0x55585372d210 <unknown>\n#13 0x555853781d48 <unknown>\n#14 0x555853781f18 <unknown>\n#15 0x55585379356e <unknown>\n#16 0x7fc7f38f3f34 start_thread\n#17 0x7fc7f397736c __clone3\n"}
            ‣ DriverHelper.wait - (1000 milliseconds)
            ‣ DriverHelper.waitAndClick - polling timed out attempt #1, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - By(xpath, //tr[td//span[text()='python-hello-world']]//span[text()='python-hello-world'])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ WorkspaceDetails.waitWorkspaceTitle - title: "python-hello-world"
            ‣ DriverHelper.waitVisibility - By(xpath, //h1[text()='python-hello-world'])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ WorkspaceDetails.waitLoaderDisappearance
            ‣ DriverHelper.waitDisappearance - By(css selector, workspace-details-overview md-progress-linear)
            ‣ DriverHelper.waitDisappearanceBoolean - By(css selector, workspace-details-overview md-progress-linear)
            ‣ DriverHelper.isVisible - By(css selector, workspace-details-overview md-progress-linear)
          ▼ WorkspaceDetails.waitRenameWorkspaceNotPossibleWhileWorkspaceRunning
            ‣ DriverHelper.waitDisappearance - By(xpath, //button[@title="Edit Workspace Name"])
            ‣ DriverHelper.waitDisappearanceBoolean - By(xpath, //button[@title="Edit Workspace Name"])
            ‣ DriverHelper.isVisible - By(xpath, //button[@title="Edit Workspace Name"])
    ✔ Workspace details: rename must not be available while the workspace is running
          ▼ Dashboard.openDashboard
            ‣ DriverHelper.navigateToUrl
            ‣ DriverHelper.getDriver
            ‣ DriverHelper.getDriver
          ▼ Dashboard.openDashboard - No alert detected
          ▼ Dashboard.waitPage
            ‣ DriverHelper.waitVisibility - By(xpath, //div[@id="page-sidebar"]//a[contains(text(), "Workspaces (")])
            ‣ DriverHelper.waitVisibility - polling timed out attempt #1, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - element is located and is visible.
            ‣ DriverHelper.waitVisibility - By(xpath, //div[@id="page-sidebar"]//a[text()="Create Workspace"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Dashboard.stopWorkspaceByUI - "python-hello-world"
          ▼ Dashboard.clickWorkspacesButton
            ‣ DriverHelper.waitAndClick - By(xpath, //div[@id="page-sidebar"]//a[contains(text(), "Workspaces (")])
            ‣ DriverHelper.waitVisibility - By(xpath, //div[@id="page-sidebar"]//a[contains(text(), "Workspaces (")])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.waitPage
            ‣ DriverHelper.waitVisibility - By(css selector, button[aria-label="Add Workspace"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.waitWorkspaceListItem - "python-hello-world"
            ‣ DriverHelper.waitVisibility - By(xpath, //tr[td//span[text()='python-hello-world']])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.stopWorkspaceByActionsButton
          ▼ Workspaces.waitWorkspaceListItem - "python-hello-world"
            ‣ DriverHelper.waitVisibility - By(xpath, //tr[td//span[text()='python-hello-world']])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.openActionsPopup - for the 'python-hello-world' list item
          ▼ Workspaces.clickActionsButton - of the 'python-hello-world' list item
            ‣ DriverHelper.waitAndClick - By(xpath, //tr[td//span[text()='python-hello-world']]/td/button[@aria-label='Actions for python-hello-world'])
            ‣ DriverHelper.waitVisibility - By(xpath, //tr[td//span[text()='python-hello-world']]/td/button[@aria-label='Actions for python-hello-world'])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.waitActionsPopup - of the 'python-hello-world' list item
            ‣ DriverHelper.waitVisibility - By(css selector, div[class*="workspaceActionSelector"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.clickActionsStopWorkspaceButton - for the 'python-hello-world' list item
            ‣ DriverHelper.waitAndClick - By(css selector, button[aria-label="Action: Stop Workspace"])
            ‣ DriverHelper.waitVisibility - By(css selector, button[aria-label="Action: Stop Workspace"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.waitWorkspaceWithStoppedStatus - "python-hello-world"
            ‣ DriverHelper.waitVisibility - By(xpath, //tr[td//span[text()='python-hello-world']]//span[@data-testid='workspace-status-indicator' and @aria-label='Workspace status is Stopped'])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
            ‣ BrowserTabsUtil.closeAllTabsExceptCurrent
          ▼ BrowserTabsUtil.getAllWindowHandles
            ‣ DriverHelper.getDriver
          ▼ BrowserTabsUtil.getCurrentWindowHandle
            ‣ DriverHelper.getDriver
          ▼ BrowserTabsUtil.switchToWindow
            ‣ DriverHelper.getDriver
            ‣ DriverHelper.getDriver
          ▼ BrowserTabsUtil.switchToWindow
            ‣ DriverHelper.getDriver
    ✔ Stop the first workspace from the dashboard
          ▼ Dashboard.openDashboard
            ‣ DriverHelper.navigateToUrl
            ‣ DriverHelper.getDriver
            ‣ DriverHelper.getDriver
          ▼ Dashboard.openDashboard - No alert detected
          ▼ Dashboard.waitPage
            ‣ DriverHelper.waitVisibility - By(xpath, //div[@id="page-sidebar"]//a[contains(text(), "Workspaces (")])
            ‣ DriverHelper.waitVisibility - polling timed out attempt #1, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - element is located and is visible.
            ‣ DriverHelper.waitVisibility - By(xpath, //div[@id="page-sidebar"]//a[text()="Create Workspace"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Dashboard.clickWorkspacesButton
            ‣ DriverHelper.waitAndClick - By(xpath, //div[@id="page-sidebar"]//a[contains(text(), "Workspaces (")])
            ‣ DriverHelper.waitVisibility - By(xpath, //div[@id="page-sidebar"]//a[contains(text(), "Workspaces (")])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.waitPage
            ‣ DriverHelper.waitVisibility - By(css selector, button[aria-label="Add Workspace"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.clickWorkspaceListItemLink - "python-hello-world"
            ‣ DriverHelper.waitAndClick - By(xpath, //tr[td//span[text()='python-hello-world']]//span[text()='python-hello-world'])
            ‣ DriverHelper.waitVisibility - By(xpath, //tr[td//span[text()='python-hello-world']]//span[text()='python-hello-world'])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ WorkspaceDetails.waitWorkspaceTitle - title: "python-hello-world"
            ‣ DriverHelper.waitVisibility - By(xpath, //h1[text()='python-hello-world'])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ WorkspaceDetails.waitLoaderDisappearance
            ‣ DriverHelper.waitDisappearance - By(css selector, workspace-details-overview md-progress-linear)
            ‣ DriverHelper.waitDisappearanceBoolean - By(css selector, workspace-details-overview md-progress-linear)
            ‣ DriverHelper.isVisible - By(css selector, workspace-details-overview md-progress-linear)
          ▼ WorkspaceDetails.renameStoppedWorkspaceTo - newDisplayName: "new-ws"
            ‣ DriverHelper.waitAndClick - By(xpath, //button[@title="Edit Workspace Name"])
            ‣ DriverHelper.waitVisibility - By(xpath, //button[@title="Edit Workspace Name"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
            ‣ DriverHelper.type - By(css selector, *[id="edit-workspace-name"]) text: new-ws
            ‣ DriverHelper.waitVisibility - By(css selector, *[id="edit-workspace-name"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
            ‣ DriverHelper.waitAndClick - By(xpath, //button[@data-testid="edit-workspace-name-save"])
            ‣ DriverHelper.waitVisibility - By(xpath, //button[@data-testid="edit-workspace-name-save"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ WorkspaceDetails.waitWorkspaceTitle - title: "new-ws"
            ‣ DriverHelper.waitVisibility - By(xpath, //h1[text()='new-ws'])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
    ✔ Rename stopped workspace to "new-ws" from workspace details
          ▼ Dashboard.openDashboard
            ‣ DriverHelper.navigateToUrl
            ‣ DriverHelper.getDriver
            ‣ DriverHelper.getDriver
          ▼ Dashboard.openDashboard - No alert detected
          ▼ Dashboard.waitPage
            ‣ DriverHelper.waitVisibility - By(xpath, //div[@id="page-sidebar"]//a[contains(text(), "Workspaces (")])
            ‣ DriverHelper.waitVisibility - polling timed out attempt #1, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - element is located and is visible.
            ‣ DriverHelper.waitVisibility - By(xpath, //div[@id="page-sidebar"]//a[text()="Create Workspace"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Dashboard.clickWorkspacesButton
            ‣ DriverHelper.waitAndClick - By(xpath, //div[@id="page-sidebar"]//a[contains(text(), "Workspaces (")])
            ‣ DriverHelper.waitVisibility - By(xpath, //div[@id="page-sidebar"]//a[contains(text(), "Workspaces (")])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.waitPage
            ‣ DriverHelper.waitVisibility - By(css selector, button[aria-label="Add Workspace"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.waitWorkspaceListItem - "new-ws"
            ‣ DriverHelper.waitVisibility - By(xpath, //tr[td//span[text()='new-ws']])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.clickWorkspaceListItemLink - "new-ws"
            ‣ DriverHelper.waitAndClick - By(xpath, //tr[td//span[text()='new-ws']]//span[text()='new-ws'])
            ‣ DriverHelper.waitVisibility - By(xpath, //tr[td//span[text()='new-ws']]//span[text()='new-ws'])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ DriverHelper.waitAndClick - By(xpath, //tr[td//span[text()='new-ws']]//span[text()='new-ws']) - {"name":"StaleElementReferenceError","remoteStacktrace":"#0 0x555853794afa <unknown>\n#1 0x555853196265 <unknown>\n#2 0x55585319d111 <unknown>\n#3 0x55585319f95b <unknown>\n#4 0x55585319fa03 <unknown>\n#5 0x5558531eacd0 <unknown>\n#6 0x5558531de437 <unknown>\n#7 0x5558531dde07 <unknown>\n#8 0x555853231969 <unknown>\n#9 0x5558531dc5cf <unknown>\n#10 0x5558531dd391 <unknown>\n#11 0x555853759fdb <unknown>\n#12 0x55585375cf9d <unknown>\n#13 0x555853746798 <unknown>\n#14 0x55585375db30 <unknown>\n#15 0x55585372d210 <unknown>\n#16 0x555853781d48 <unknown>\n#17 0x555853781f18 <unknown>\n#18 0x55585379356e <unknown>\n#19 0x7fc7f38f3f34 start_thread\n#20 0x7fc7f397736c __clone3\n"}
            ‣ DriverHelper.wait - (1000 milliseconds)
            ‣ DriverHelper.waitVisibility - By(xpath, //tr[td//span[text()='new-ws']]//span[text()='new-ws'])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ WorkspaceDetails.waitWorkspaceTitle - title: "new-ws"
            ‣ DriverHelper.waitVisibility - By(xpath, //h1[text()='new-ws'])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
    ✔ Dashboard lists and details show "new-ws"
          ▼ Dashboard.openDashboard
            ‣ DriverHelper.navigateToUrl
            ‣ DriverHelper.getDriver
            ‣ DriverHelper.getDriver
          ▼ Dashboard.openDashboard - No alert detected
          ▼ Dashboard.waitPage
            ‣ DriverHelper.waitVisibility - By(xpath, //div[@id="page-sidebar"]//a[contains(text(), "Workspaces (")])
            ‣ DriverHelper.waitVisibility - polling timed out attempt #1, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - element is located and is visible.
            ‣ DriverHelper.waitVisibility - By(xpath, //div[@id="page-sidebar"]//a[text()="Create Workspace"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Dashboard.clickWorkspacesButton
            ‣ DriverHelper.waitAndClick - By(xpath, //div[@id="page-sidebar"]//a[contains(text(), "Workspaces (")])
            ‣ DriverHelper.waitVisibility - By(xpath, //div[@id="page-sidebar"]//a[contains(text(), "Workspaces (")])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.waitPage
            ‣ DriverHelper.waitVisibility - By(css selector, button[aria-label="Add Workspace"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.clickOpenButton
            ‣ DriverHelper.waitAndClick - By(xpath, //tr[td//span[text()='new-ws']]//button/span[text()='Open'])
            ‣ DriverHelper.waitVisibility - By(xpath, //tr[td//span[text()='new-ws']]//button/span[text()='Open'])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ ApiUrlResolver.obtainUserNamespace - admin-devspaces
          ▼ BrowserTabsUtil.getCurrentWindowHandle
            ‣ DriverHelper.getDriver
          ▼ BrowserTabsUtil.waitAndSwitchToAnotherWindow
            ‣ DriverHelper.waitUntilTrue
          ▼ BrowserTabsUtil.getAllWindowHandles
            ‣ DriverHelper.getDriver
          ▼ BrowserTabsUtil.getAllWindowHandles
            ‣ DriverHelper.getDriver
          ▼ BrowserTabsUtil.switchToWindow
            ‣ DriverHelper.getDriver
            ‣ DriverHelper.getDriver
            ‣ WorkspaceHandlingTests.obtainWorkspaceNameFromStartingPage - failed to obtain name from workspace start page, element not visible yet. Retrying.
            ‣ DriverHelper.wait - (1000 milliseconds)
            ‣ DriverHelper.getDriver
            ‣ WorkspaceHandlingTests.obtainWorkspaceNameFromStartingPage - failed to obtain name from workspace start page, element not visible yet. Retrying.
            ‣ DriverHelper.wait - (1000 milliseconds)
            ‣ DriverHelper.getDriver
            ‣ WorkspaceHandlingTests.obtainWorkspaceNameFromStartingPage - obtained starting workspace getText():Starting workspace new-ws
            ‣ WorkspaceHandlingTests.obtainWorkspaceNameFromStartingPage - trimmed workspace name from getText():new-ws
      • WorkspaceHandlingTests.obtainWorkspaceNameFromStartingPage - obtained workspace name from workspace loader page: new-ws
          ▼ registerRunningWorkspace - with workspaceName:new-ws
          ▼ ProjectAndFileTests.waitWorkspaceReadinessForCheCodeEditor - waiting for editor.
            ‣ DriverHelper.waitVisibility - By(css selector, .monaco-workbench)
            ‣ DriverHelper.waitVisibility - polling timed out attempt #1, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #2, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #3, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #4, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #5, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #6, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #7, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #8, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #9, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #10, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #11, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #12, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #13, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #14, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #15, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #16, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #17, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ ProjectAndFileTests.waitWorkspaceReadinessForCheCodeEditor - editor was opened in 20908 seconds.
    ✔ Start "new-ws" and wait until it is Running
          ▼ Dashboard.openDashboard
            ‣ DriverHelper.navigateToUrl
            ‣ DriverHelper.getDriver
            ‣ DriverHelper.getDriver
          ▼ Dashboard.openDashboard - No alert detected
          ▼ Dashboard.waitPage
            ‣ DriverHelper.waitVisibility - By(xpath, //div[@id="page-sidebar"]//a[contains(text(), "Workspaces (")])
            ‣ DriverHelper.waitVisibility - polling timed out attempt #1, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - element is located and is visible.
            ‣ DriverHelper.waitVisibility - By(xpath, //div[@id="page-sidebar"]//a[text()="Create Workspace"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Dashboard.stopWorkspaceByUI - "new-ws"
          ▼ Dashboard.clickWorkspacesButton
            ‣ DriverHelper.waitAndClick - By(xpath, //div[@id="page-sidebar"]//a[contains(text(), "Workspaces (")])
            ‣ DriverHelper.waitVisibility - By(xpath, //div[@id="page-sidebar"]//a[contains(text(), "Workspaces (")])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.waitPage
            ‣ DriverHelper.waitVisibility - By(css selector, button[aria-label="Add Workspace"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.waitWorkspaceListItem - "new-ws"
            ‣ DriverHelper.waitVisibility - By(xpath, //tr[td//span[text()='new-ws']])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.stopWorkspaceByActionsButton
          ▼ Workspaces.waitWorkspaceListItem - "new-ws"
            ‣ DriverHelper.waitVisibility - By(xpath, //tr[td//span[text()='new-ws']])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.openActionsPopup - for the 'new-ws' list item
          ▼ Workspaces.clickActionsButton - of the 'new-ws' list item
            ‣ DriverHelper.waitAndClick - By(xpath, //tr[td//span[text()='new-ws']]/td/button[@aria-label='Actions for new-ws'])
            ‣ DriverHelper.waitVisibility - By(xpath, //tr[td//span[text()='new-ws']]/td/button[@aria-label='Actions for new-ws'])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.waitActionsPopup - of the 'new-ws' list item
            ‣ DriverHelper.waitVisibility - By(css selector, div[class*="workspaceActionSelector"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.clickActionsStopWorkspaceButton - for the 'new-ws' list item
            ‣ DriverHelper.waitAndClick - By(css selector, button[aria-label="Action: Stop Workspace"])
            ‣ DriverHelper.waitVisibility - By(css selector, button[aria-label="Action: Stop Workspace"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.waitWorkspaceWithStoppedStatus - "new-ws"
            ‣ DriverHelper.waitVisibility - By(xpath, //tr[td//span[text()='new-ws']]//span[@data-testid='workspace-status-indicator' and @aria-label='Workspace status is Stopped'])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
            ‣ BrowserTabsUtil.closeAllTabsExceptCurrent
          ▼ BrowserTabsUtil.getAllWindowHandles
            ‣ DriverHelper.getDriver
          ▼ BrowserTabsUtil.getCurrentWindowHandle
            ‣ DriverHelper.getDriver
          ▼ BrowserTabsUtil.switchToWindow
            ‣ DriverHelper.getDriver
            ‣ DriverHelper.getDriver
          ▼ BrowserTabsUtil.switchToWindow
            ‣ DriverHelper.getDriver
    ✔ Stop "new-ws" again
          ▼ Dashboard.openDashboard
            ‣ DriverHelper.navigateToUrl
            ‣ DriverHelper.getDriver
            ‣ DriverHelper.getDriver
          ▼ Dashboard.openDashboard - No alert detected
          ▼ Dashboard.waitPage
            ‣ DriverHelper.waitVisibility - By(xpath, //div[@id="page-sidebar"]//a[contains(text(), "Workspaces (")])
            ‣ DriverHelper.waitVisibility - polling timed out attempt #1, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - element is located and is visible.
            ‣ DriverHelper.waitVisibility - By(xpath, //div[@id="page-sidebar"]//a[text()="Create Workspace"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Dashboard.clickWorkspacesButton
            ‣ DriverHelper.waitAndClick - By(xpath, //div[@id="page-sidebar"]//a[contains(text(), "Workspaces (")])
            ‣ DriverHelper.waitVisibility - By(xpath, //div[@id="page-sidebar"]//a[contains(text(), "Workspaces (")])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.waitPage
            ‣ DriverHelper.waitVisibility - By(css selector, button[aria-label="Add Workspace"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.clickWorkspaceListItemLink - "new-ws"
            ‣ DriverHelper.waitAndClick - By(xpath, //tr[td//span[text()='new-ws']]//span[text()='new-ws'])
            ‣ DriverHelper.waitVisibility - By(xpath, //tr[td//span[text()='new-ws']]//span[text()='new-ws'])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ WorkspaceDetails.waitWorkspaceTitle - title: "new-ws"
            ‣ DriverHelper.waitVisibility - By(xpath, //h1[text()='new-ws'])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ WorkspaceDetails.waitLoaderDisappearance
            ‣ DriverHelper.waitDisappearance - By(css selector, workspace-details-overview md-progress-linear)
            ‣ DriverHelper.waitDisappearanceBoolean - By(css selector, workspace-details-overview md-progress-linear)
            ‣ DriverHelper.isVisible - By(css selector, workspace-details-overview md-progress-linear)
          ▼ WorkspaceDetails.attemptRenameWorkspaceName - desiredName: "new-ws"
            ‣ DriverHelper.waitAndClick - By(xpath, //button[@title="Edit Workspace Name"])
            ‣ DriverHelper.waitVisibility - By(xpath, //button[@title="Edit Workspace Name"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
            ‣ DriverHelper.type - By(css selector, *[id="edit-workspace-name"]) text: new-ws
            ‣ DriverHelper.waitVisibility - By(css selector, *[id="edit-workspace-name"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
            ‣ DriverHelper.waitAttributePresent - By(xpath, //button[@data-testid="edit-workspace-name-save"])
            ‣ DriverHelper.waitAndGetElementAttribute - By(xpath, //button[@data-testid="edit-workspace-name-save"]) attribute: 'disabled'
            ‣ DriverHelper.waitVisibility - By(xpath, //button[@data-testid="edit-workspace-name-save"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
            ‣ DriverHelper.waitAndClick - By(xpath, //button[@data-testid="edit-workspace-name-cancel"])
            ‣ DriverHelper.waitVisibility - By(xpath, //button[@data-testid="edit-workspace-name-cancel"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
    ✔ Workspace details: setting name to "new-ws" when it is already the current name is rejected
          ▼ Dashboard.clickWorkspacesButton
            ‣ DriverHelper.waitAndClick - By(xpath, //div[@id="page-sidebar"]//a[contains(text(), "Workspaces (")])
            ‣ DriverHelper.waitVisibility - By(xpath, //div[@id="page-sidebar"]//a[contains(text(), "Workspaces (")])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Dashboard.waitPage
            ‣ DriverHelper.waitVisibility - By(xpath, //div[@id="page-sidebar"]//a[contains(text(), "Workspaces (")])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
            ‣ DriverHelper.waitVisibility - By(xpath, //div[@id="page-sidebar"]//a[text()="Create Workspace"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ WorkspaceHandlingTests.createAndOpenWorkspace - fetching user kubernetes namespace, storing auth token by getting workspaces API URL.
          ▼ ApiUrlResolver.obtainUserNamespace - admin-devspaces
          ▼ Dashboard.clickCreateWorkspaceButton
            ‣ DriverHelper.waitAndClick - By(xpath, //div[@id="page-sidebar"]//a[text()="Create Workspace"])
            ‣ DriverHelper.waitVisibility - By(xpath, //div[@id="page-sidebar"]//a[text()="Create Workspace"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ CreateWorkspace.waitPage
          ▼ CreateWorkspace.waitTitleContains - text: "Create Workspace"
            ‣ DriverHelper.waitVisibility - By(xpath, //h1[contains(text(), 'Create Workspace')])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ CreateWorkspace.setCreateNewWorkspaceCheckbox - checked: true
          ▼ CreateWorkspace.isCreateNewWorkspaceCheckboxChecked
            ‣ DriverHelper.waitPresence - By(css selector, *[id="create-new-if-exist-switch"])
          ▼ CreateWorkspace.setCreateNewWorkspaceCheckbox - Checkbox is already set, no action needed
          ▼ BrowserTabsUtil.getCurrentWindowHandle
            ‣ DriverHelper.getDriver
          ▼ CreateWorkspace.clickOnSampleNoEditorSelection - sampleName: "Python"
            ‣ CreateWorkspace.getSampleLocator - sampleName: Python, used default editor
            ‣ DriverHelper.waitAndClick - By(xpath, //div[contains(@id, 'sample-card') and text()='Python'])
            ‣ DriverHelper.waitVisibility - By(xpath, //div[contains(@id, 'sample-card') and text()='Python'])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ BrowserTabsUtil.waitAndSwitchToAnotherWindow
            ‣ DriverHelper.waitUntilTrue
          ▼ BrowserTabsUtil.getAllWindowHandles
            ‣ DriverHelper.getDriver
          ▼ BrowserTabsUtil.getAllWindowHandles
            ‣ DriverHelper.getDriver
          ▼ BrowserTabsUtil.switchToWindow
            ‣ DriverHelper.getDriver
            ‣ DriverHelper.getDriver
            ‣ WorkspaceHandlingTests.obtainWorkspaceNameFromStartingPage - failed to obtain name from workspace start page, element not visible yet. Retrying.
            ‣ DriverHelper.wait - (1000 milliseconds)
            ‣ DriverHelper.getDriver
            ‣ WorkspaceHandlingTests.obtainWorkspaceNameFromStartingPage - failed to obtain name from workspace start page, element not visible yet. Retrying.
            ‣ DriverHelper.wait - (1000 milliseconds)
            ‣ DriverHelper.getDriver
            ‣ WorkspaceHandlingTests.obtainWorkspaceNameFromStartingPage - failed to obtain name from workspace start page, element not visible yet. Retrying.
            ‣ DriverHelper.wait - (1000 milliseconds)
            ‣ DriverHelper.getDriver
            ‣ WorkspaceHandlingTests.obtainWorkspaceNameFromStartingPage - failed to obtain name from workspace start page, element not visible yet. Retrying.
            ‣ DriverHelper.wait - (1000 milliseconds)
            ‣ DriverHelper.getDriver
            ‣ WorkspaceHandlingTests.obtainWorkspaceNameFromStartingPage - failed to obtain name from workspace start page, element not visible yet. Retrying.
            ‣ DriverHelper.wait - (1000 milliseconds)
            ‣ DriverHelper.getDriver
            ‣ WorkspaceHandlingTests.obtainWorkspaceNameFromStartingPage - obtained starting workspace getText():Starting workspace python-hello-world-aubw
            ‣ WorkspaceHandlingTests.obtainWorkspaceNameFromStartingPage - trimmed workspace name from getText():python-hello-world-aubw
      • WorkspaceHandlingTests.obtainWorkspaceNameFromStartingPage - obtained workspace name from workspace loader page: python-hello-world-aubw
          ▼ registerRunningWorkspace - with workspaceName:python-hello-world-aubw
          ▼ ProjectAndFileTests.waitWorkspaceReadinessForCheCodeEditor - waiting for editor.
            ‣ DriverHelper.waitVisibility - By(css selector, .monaco-workbench)
            ‣ DriverHelper.waitVisibility - polling timed out attempt #1, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #2, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #3, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #4, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #5, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #6, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #7, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #8, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #9, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #10, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #11, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #12, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #13, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #14, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #15, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #16, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #17, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #18, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #19, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #20, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #21, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #22, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - polling timed out attempt #23, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ ProjectAndFileTests.waitWorkspaceReadinessForCheCodeEditor - editor was opened in 28247 seconds.
    ✔ Create a second workspace from sample (Python) (33969ms)
          ▼ Dashboard.openDashboard
            ‣ DriverHelper.navigateToUrl
            ‣ DriverHelper.getDriver
            ‣ DriverHelper.getDriver
          ▼ Dashboard.openDashboard - No alert detected
          ▼ Dashboard.waitPage
            ‣ DriverHelper.waitVisibility - By(xpath, //div[@id="page-sidebar"]//a[contains(text(), "Workspaces (")])
            ‣ DriverHelper.waitVisibility - polling timed out attempt #1, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - element is located and is visible.
            ‣ DriverHelper.waitVisibility - By(xpath, //div[@id="page-sidebar"]//a[text()="Create Workspace"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Dashboard.stopWorkspaceByUI - "python-hello-world-aubw"
          ▼ Dashboard.clickWorkspacesButton
            ‣ DriverHelper.waitAndClick - By(xpath, //div[@id="page-sidebar"]//a[contains(text(), "Workspaces (")])
            ‣ DriverHelper.waitVisibility - By(xpath, //div[@id="page-sidebar"]//a[contains(text(), "Workspaces (")])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.waitPage
            ‣ DriverHelper.waitVisibility - By(css selector, button[aria-label="Add Workspace"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.waitWorkspaceListItem - "python-hello-world-aubw"
            ‣ DriverHelper.waitVisibility - By(xpath, //tr[td//span[text()='python-hello-world-aubw']])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.stopWorkspaceByActionsButton
          ▼ Workspaces.waitWorkspaceListItem - "python-hello-world-aubw"
            ‣ DriverHelper.waitVisibility - By(xpath, //tr[td//span[text()='python-hello-world-aubw']])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.openActionsPopup - for the 'python-hello-world-aubw' list item
          ▼ Workspaces.clickActionsButton - of the 'python-hello-world-aubw' list item
            ‣ DriverHelper.waitAndClick - By(xpath, //tr[td//span[text()='python-hello-world-aubw']]/td/button[@aria-label='Actions for python-hello-world-aubw'])
            ‣ DriverHelper.waitVisibility - By(xpath, //tr[td//span[text()='python-hello-world-aubw']]/td/button[@aria-label='Actions for python-hello-world-aubw'])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.waitActionsPopup - of the 'python-hello-world-aubw' list item
            ‣ DriverHelper.waitVisibility - By(css selector, div[class*="workspaceActionSelector"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.clickActionsStopWorkspaceButton - for the 'python-hello-world-aubw' list item
            ‣ DriverHelper.waitAndClick - By(css selector, button[aria-label="Action: Stop Workspace"])
            ‣ DriverHelper.waitVisibility - By(css selector, button[aria-label="Action: Stop Workspace"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.waitWorkspaceWithStoppedStatus - "python-hello-world-aubw"
            ‣ DriverHelper.waitVisibility - By(xpath, //tr[td//span[text()='python-hello-world-aubw']]//span[@data-testid='workspace-status-indicator' and @aria-label='Workspace status is Stopped'])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
            ‣ BrowserTabsUtil.closeAllTabsExceptCurrent
          ▼ BrowserTabsUtil.getAllWindowHandles
            ‣ DriverHelper.getDriver
          ▼ BrowserTabsUtil.getCurrentWindowHandle
            ‣ DriverHelper.getDriver
          ▼ BrowserTabsUtil.switchToWindow
            ‣ DriverHelper.getDriver
            ‣ DriverHelper.getDriver
          ▼ BrowserTabsUtil.switchToWindow
            ‣ DriverHelper.getDriver
          ▼ Dashboard.openDashboard
            ‣ DriverHelper.navigateToUrl
            ‣ DriverHelper.getDriver
            ‣ DriverHelper.getDriver
          ▼ Dashboard.openDashboard - No alert detected
          ▼ Dashboard.waitPage
            ‣ DriverHelper.waitVisibility - By(xpath, //div[@id="page-sidebar"]//a[contains(text(), "Workspaces (")])
            ‣ DriverHelper.waitVisibility - polling timed out attempt #1, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - element is located and is visible.
            ‣ DriverHelper.waitVisibility - By(xpath, //div[@id="page-sidebar"]//a[text()="Create Workspace"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Dashboard.clickWorkspacesButton
            ‣ DriverHelper.waitAndClick - By(xpath, //div[@id="page-sidebar"]//a[contains(text(), "Workspaces (")])
            ‣ DriverHelper.waitVisibility - By(xpath, //div[@id="page-sidebar"]//a[contains(text(), "Workspaces (")])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.waitPage
            ‣ DriverHelper.waitVisibility - By(css selector, button[aria-label="Add Workspace"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.clickWorkspaceListItemLink - "python-hello-world-aubw"
            ‣ DriverHelper.waitAndClick - By(xpath, //tr[td//span[text()='python-hello-world-aubw']]//span[text()='python-hello-world-aubw'])
            ‣ DriverHelper.waitVisibility - By(xpath, //tr[td//span[text()='python-hello-world-aubw']]//span[text()='python-hello-world-aubw'])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ WorkspaceDetails.waitWorkspaceTitle - title: "python-hello-world-aubw"
            ‣ DriverHelper.waitVisibility - By(xpath, //h1[text()='python-hello-world-aubw'])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ WorkspaceDetails.waitLoaderDisappearance
            ‣ DriverHelper.waitDisappearance - By(css selector, workspace-details-overview md-progress-linear)
            ‣ DriverHelper.waitDisappearanceBoolean - By(css selector, workspace-details-overview md-progress-linear)
            ‣ DriverHelper.isVisible - By(css selector, workspace-details-overview md-progress-linear)
          ▼ WorkspaceDetails.attemptRenameWorkspaceName - desiredName: "new-ws"
            ‣ DriverHelper.waitAndClick - By(xpath, //button[@title="Edit Workspace Name"])
            ‣ DriverHelper.waitVisibility - By(xpath, //button[@title="Edit Workspace Name"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
            ‣ DriverHelper.type - By(css selector, *[id="edit-workspace-name"]) text: new-ws
            ‣ DriverHelper.waitVisibility - By(css selector, *[id="edit-workspace-name"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
            ‣ DriverHelper.waitAttributePresent - By(xpath, //button[@data-testid="edit-workspace-name-save"])
            ‣ DriverHelper.waitAndGetElementAttribute - By(xpath, //button[@data-testid="edit-workspace-name-save"]) attribute: 'disabled'
            ‣ DriverHelper.waitVisibility - By(xpath, //button[@data-testid="edit-workspace-name-save"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
            ‣ DriverHelper.waitAndClick - By(xpath, //button[@data-testid="edit-workspace-name-cancel"])
            ‣ DriverHelper.waitVisibility - By(xpath, //button[@data-testid="edit-workspace-name-cancel"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
    ✔ Second workspace details: rename to "new-ws" shows conflict and does not apply
          ▼ Dashboard.openDashboard
            ‣ DriverHelper.navigateToUrl
            ‣ DriverHelper.getDriver
            ‣ DriverHelper.getDriver
          ▼ Dashboard.openDashboard - No alert detected
          ▼ Dashboard.waitPage
            ‣ DriverHelper.waitVisibility - By(xpath, //div[@id="page-sidebar"]//a[contains(text(), "Workspaces (")])
            ‣ DriverHelper.waitVisibility - polling timed out attempt #1, retrying with 1000ms timeout
            ‣ DriverHelper.waitVisibility - element is located and is visible.
            ‣ DriverHelper.waitVisibility - By(xpath, //div[@id="page-sidebar"]//a[text()="Create Workspace"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Dashboard.clickWorkspacesButton
            ‣ DriverHelper.waitAndClick - By(xpath, //div[@id="page-sidebar"]//a[contains(text(), "Workspaces (")])
            ‣ DriverHelper.waitVisibility - By(xpath, //div[@id="page-sidebar"]//a[contains(text(), "Workspaces (")])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.waitPage
            ‣ DriverHelper.waitVisibility - By(css selector, button[aria-label="Add Workspace"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Dashboard.deleteStoppedWorkspaceByUI - "python-hello-world-aubw"
          ▼ Dashboard.clickWorkspacesButton
            ‣ DriverHelper.waitAndClick - By(xpath, //div[@id="page-sidebar"]//a[contains(text(), "Workspaces (")])
            ‣ DriverHelper.waitVisibility - By(xpath, //div[@id="page-sidebar"]//a[contains(text(), "Workspaces (")])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.waitPage
            ‣ DriverHelper.waitVisibility - By(css selector, button[aria-label="Add Workspace"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.waitWorkspaceListItem - "python-hello-world-aubw"
            ‣ DriverHelper.waitVisibility - By(xpath, //tr[td//span[text()='python-hello-world-aubw']])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.deleteWorkspaceByActionsButton
          ▼ Workspaces.waitWorkspaceListItem - "python-hello-world-aubw"
            ‣ DriverHelper.waitVisibility - By(xpath, //tr[td//span[text()='python-hello-world-aubw']])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.openActionsPopup - for the 'python-hello-world-aubw' list item
          ▼ Workspaces.clickActionsButton - of the 'python-hello-world-aubw' list item
            ‣ DriverHelper.waitAndClick - By(xpath, //tr[td//span[text()='python-hello-world-aubw']]/td/button[@aria-label='Actions for python-hello-world-aubw'])
            ‣ DriverHelper.waitVisibility - By(xpath, //tr[td//span[text()='python-hello-world-aubw']]/td/button[@aria-label='Actions for python-hello-world-aubw'])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.waitActionsPopup - of the 'python-hello-world-aubw' list item
            ‣ DriverHelper.waitVisibility - By(css selector, div[class*="workspaceActionSelector"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.clickActionsDeleteButton - for the 'python-hello-world-aubw' list item
            ‣ DriverHelper.waitAndClick - By(css selector, button[aria-label="Action: Delete Workspace"])
            ‣ DriverHelper.waitVisibility - By(css selector, button[aria-label="Action: Delete Workspace"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.waitDeleteWorkspaceConfirmationWindow
            ‣ DriverHelper.waitVisibility - By(xpath, //div[@aria-label="Delete workspaces confirmation window"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.clickToDeleteConfirmationCheckbox
            ‣ DriverHelper.waitAndClick - By(xpath, //input[@data-testid="confirmation-checkbox"])
            ‣ DriverHelper.waitVisibility - By(xpath, //input[@data-testid="confirmation-checkbox"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.waitAndClickEnabledConfirmationWindowDeleteButton
            ‣ DriverHelper.waitAndClick - By(xpath, //button[@data-testid="delete-workspace-button" and not(@disabled)])
            ‣ DriverHelper.waitVisibility - By(xpath, //button[@data-testid="delete-workspace-button" and not(@disabled)])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.waitPage
            ‣ DriverHelper.waitVisibility - By(css selector, button[aria-label="Add Workspace"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.waitWorkspaceListItemAbsence - "python-hello-world-aubw"
            ‣ DriverHelper.waitDisappearance - By(xpath, //tr[td//span[text()='python-hello-world-aubw']])
            ‣ DriverHelper.waitDisappearanceBoolean - By(xpath, //tr[td//span[text()='python-hello-world-aubw']])
            ‣ DriverHelper.isVisible - By(xpath, //tr[td//span[text()='python-hello-world-aubw']])
            ‣ DriverHelper.wait - (1000 milliseconds)
            ‣ DriverHelper.isVisible - By(xpath, //tr[td//span[text()='python-hello-world-aubw']])
          ▼ Dashboard.deleteStoppedWorkspaceByUI - "new-ws"
          ▼ Dashboard.clickWorkspacesButton
            ‣ DriverHelper.waitAndClick - By(xpath, //div[@id="page-sidebar"]//a[contains(text(), "Workspaces (")])
            ‣ DriverHelper.waitVisibility - By(xpath, //div[@id="page-sidebar"]//a[contains(text(), "Workspaces (")])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.waitPage
            ‣ DriverHelper.waitVisibility - By(css selector, button[aria-label="Add Workspace"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.waitWorkspaceListItem - "new-ws"
            ‣ DriverHelper.waitVisibility - By(xpath, //tr[td//span[text()='new-ws']])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.deleteWorkspaceByActionsButton
          ▼ Workspaces.waitWorkspaceListItem - "new-ws"
            ‣ DriverHelper.waitVisibility - By(xpath, //tr[td//span[text()='new-ws']])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.openActionsPopup - for the 'new-ws' list item
          ▼ Workspaces.clickActionsButton - of the 'new-ws' list item
            ‣ DriverHelper.waitAndClick - By(xpath, //tr[td//span[text()='new-ws']]/td/button[@aria-label='Actions for new-ws'])
            ‣ DriverHelper.waitVisibility - By(xpath, //tr[td//span[text()='new-ws']]/td/button[@aria-label='Actions for new-ws'])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.waitActionsPopup - of the 'new-ws' list item
            ‣ DriverHelper.waitVisibility - By(css selector, div[class*="workspaceActionSelector"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.clickActionsDeleteButton - for the 'new-ws' list item
            ‣ DriverHelper.waitAndClick - By(css selector, button[aria-label="Action: Delete Workspace"])
            ‣ DriverHelper.waitVisibility - By(css selector, button[aria-label="Action: Delete Workspace"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.waitDeleteWorkspaceConfirmationWindow
            ‣ DriverHelper.waitVisibility - By(xpath, //div[@aria-label="Delete workspaces confirmation window"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.clickToDeleteConfirmationCheckbox
            ‣ DriverHelper.waitAndClick - By(xpath, //input[@data-testid="confirmation-checkbox"])
            ‣ DriverHelper.waitVisibility - By(xpath, //input[@data-testid="confirmation-checkbox"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.waitAndClickEnabledConfirmationWindowDeleteButton
            ‣ DriverHelper.waitAndClick - By(xpath, //button[@data-testid="delete-workspace-button" and not(@disabled)])
            ‣ DriverHelper.waitVisibility - By(xpath, //button[@data-testid="delete-workspace-button" and not(@disabled)])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.waitPage
            ‣ DriverHelper.waitVisibility - By(css selector, button[aria-label="Add Workspace"])
            ‣ DriverHelper.waitVisibility - element is located and is visible.
          ▼ Workspaces.waitWorkspaceListItemAbsence - "new-ws"
            ‣ DriverHelper.waitDisappearance - By(xpath, //tr[td//span[text()='new-ws']])
            ‣ DriverHelper.waitDisappearanceBoolean - By(xpath, //tr[td//span[text()='new-ws']])
            ‣ DriverHelper.isVisible - By(xpath, //tr[td//span[text()='new-ws']])
            ‣ DriverHelper.wait - (1000 milliseconds)
            ‣ DriverHelper.isVisible - By(xpath, //tr[td//span[text()='new-ws']])
          ▼     at che/tests/e2e/specs/MochaHooks.ts:39:12 - delete workspace name


  10 passing (2m)

PR Checklist

As the author of this Pull Request I made sure that:

Reviewers

Reviewers, please comment how you tested the PR when approving it.

@artaleks9
Copy link
Copy Markdown
Contributor

@SkorikSergey, did you have a run RenameWorkspace E2E test locally to verify changes ?

/**
* devSpaces Dashboard does not allow editing the workspace display name while the workspace is running.
*/
async waitRenameWorkspaceNotPossibleWhileWorkspaceRunning(): Promise<void> {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would suggest making the method name more specific, like checkRenameButtonIsAbsent()

Comment thread tests/e2e/pageobjects/dashboard/workspace-details/WorkspaceDetails.ts Outdated
await this.waitWorkspaceTitle(newDisplayName);
}

async attemptRenameWorkspaceName(desiredName: string): Promise<void> {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

attemptRenameWorkspaceName() is really test-level assertion logic - it's verifying a negative scenario (save button disabled, then cancel). That kind of logic belongs in the spec file (RenameWorkspace test), not in the page object.

Comment thread tests/e2e/pageobjects/dashboard/workspace-details/WorkspaceDetails.ts Outdated
@SkorikSergey
Copy link
Copy Markdown
Contributor Author

@SkorikSergey, did you have a run RenameWorkspace E2E test locally to verify changes ?

Yes, I will update PR description with logs

@SkorikSergey SkorikSergey marked this pull request as ready for review May 20, 2026 07:34
Copy link
Copy Markdown
Contributor

@dmytro-ndp dmytro-ndp left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good to merge.

@dmytro-ndp dmytro-ndp merged commit cf08ff6 into eclipse-che:main May 20, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants