From 533eec7a8e73688f6440f94dc7a64d0219fe32a6 Mon Sep 17 00:00:00 2001 From: Fran Date: Tue, 28 May 2024 19:26:11 -0300 Subject: [PATCH 1/2] Eclipse integration first approach --- tests/eclipse_setup .ts | 83 +++++++++++++++++++++++++++++++++++++---- tests/example.spec.ts | 2 +- tests/vscode_setup.ts | 2 +- 3 files changed, 78 insertions(+), 9 deletions(-) diff --git a/tests/eclipse_setup .ts b/tests/eclipse_setup .ts index 2857c7d..f1340df 100644 --- a/tests/eclipse_setup .ts +++ b/tests/eclipse_setup .ts @@ -1,16 +1,85 @@ -import { test, Page } from '@playwright/test'; +import { test, ElementHandle } from '@playwright/test'; +import { chromium, Browser, Page } from '@playwright/test'; import { exec } from 'child_process'; const path = `${__dirname.split('tests')[0]}glsp-theia-integration` +// import { chromium, Browser, Page } from 'playwright'; async function eclipse_setup(page: Page) { + +const windowSize = { width: 1920, height: 1080 }; + +class ConnectToAp { + private browser: Browser | undefined; + private page: Page | undefined; + + async connectToAp() { + try { + this.browser = await chromium.launch({ + headless: false, + args: [ + `--window-size=${windowSize.width},${windowSize.height}` + ] + }); +console.log("amshcbsakchabkahbakhbasbhbhkbasbjasjabsh"); + + this.page = await this.browser.newPage(); + await this.page.setViewportSize(windowSize); + await this.registerPage(this.page); + return this.page; + } catch (error) { + console.error('Error launching browser or creating a new page:', error); + throw error; + } + } + + private async registerPage(page: Page) { + // Implement the logic to register the page with the context if needed + console.log("Page registered:", page.url()); + return page; + } +} + +// Example usage +(async () => { + const connector = new ConnectToAp(); + try { + const page = await connector.connectToAp(); + + // Navigate to an example URL to verify everything is working correctly + await page.goto('https://example.com'); + console.log(`Page title: ${await page.title()}`); + + // Close the browser after performing the tests + await page.context().browser()?.close(); + } catch (error) { + console.error('Error in connecting to AP:', error); + } +})(); // page.pause(); - await page.goto('localhost:8888'); - await page.click('#items > p > a') - const pushbtn = page.locator('#workflow_Editor_1_task0_automated') - console.log(pushbtn); - await pushbtn.click() - await page.keyboard.down("Delete"); + // await page.goto('localhost:8888'); + // await page.click('#items > p > a') + // await page.waitForTimeout(3000) + // await page.getByRole('treeitem', { name: '
{ // IDE Setup test.setTimeout(60000) - const ide = process.env.IDE?.toLowerCase() ?? 'vscode' + const ide = process.env.IDE?.toLowerCase() ?? 'eclipse' console.log(ide); await setup_ide(ide, page) diff --git a/tests/vscode_setup.ts b/tests/vscode_setup.ts index ecf18bb..f1ddd24 100644 --- a/tests/vscode_setup.ts +++ b/tests/vscode_setup.ts @@ -6,7 +6,7 @@ const path = __dirname.split('tests')[0]; async function vscode_setup(page: Page) { return new Promise((resolve, reject) => { try { - const result = exec('"sh" /snap/code/155/usr/share/code/bin/code --no-sandbox serve-web'); + const result = exec('"sh" /snap/code/current/usr/share/code/bin/code --no-sandbox serve-web'); result.stdout?.on('data', async (data) => { if (data.includes('Web UI available at')) { From a26ecf3db940bbfd28bbce39d58b7d3cb4b1a2bb Mon Sep 17 00:00:00 2001 From: Fran Date: Wed, 19 Jun 2024 16:32:45 -0300 Subject: [PATCH 2/2] Eclipse setup and playwright modification --- enable_cef_connection.sh | 23 +++++++++++ package.json | 4 +- tests/eclipse_setup .ts | 85 ---------------------------------------- tests/eclipse_setup.ts | 37 +++++++++++++++++ tests/example.spec.ts | 62 ++++++++++++++++++++++++----- tests/ide_setup.ts | 12 +++--- tests/theia_setup.ts | 11 +----- tests/vscode_setup.ts | 12 +++--- 8 files changed, 130 insertions(+), 116 deletions(-) create mode 100755 enable_cef_connection.sh delete mode 100644 tests/eclipse_setup .ts create mode 100644 tests/eclipse_setup.ts diff --git a/enable_cef_connection.sh b/enable_cef_connection.sh new file mode 100755 index 0000000..d94b4cd --- /dev/null +++ b/enable_cef_connection.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +root=$(pwd) + +path="$root/node_modules/playwright-core/lib/server/chromium/crBrowser.js" + +if [ -f "$path" ]; then + tmpfile=$(mktemp) + + lineno=0 + while IFS= read -r line; do + if [ "$lineno" -ge 300 ] && [ "$lineno" -le 307 ]; then + echo "// $line" >> "$tmpfile" + else + echo "$line" >> "$tmpfile" + fi + lineno=$((lineno + 1)) + done < "$path" + + mv "$tmpfile" "$path" +else + echo "file does not exist." +fi \ No newline at end of file diff --git a/package.json b/package.json index 547e424..e8cea93 100644 --- a/package.json +++ b/package.json @@ -6,11 +6,11 @@ "author": "mattcastells ", "license": "MIT", "devDependencies": { - "@playwright/test": "^1.42.1", + "@playwright/test": "^1.44.1", "@types/node": "^20.11.30" }, "scripts": { + "setup": "yarn install && chmod +x enable_cef_connection.sh && ./enable_cef_connection.sh", "test": "npx playwright test --project='chrome' --headed" - } } diff --git a/tests/eclipse_setup .ts b/tests/eclipse_setup .ts deleted file mode 100644 index f1340df..0000000 --- a/tests/eclipse_setup .ts +++ /dev/null @@ -1,85 +0,0 @@ -import { test, ElementHandle } from '@playwright/test'; -import { chromium, Browser, Page } from '@playwright/test'; -import { exec } from 'child_process'; - -const path = `${__dirname.split('tests')[0]}glsp-theia-integration` - -// import { chromium, Browser, Page } from 'playwright'; -async function eclipse_setup(page: Page) { - -const windowSize = { width: 1920, height: 1080 }; - -class ConnectToAp { - private browser: Browser | undefined; - private page: Page | undefined; - - async connectToAp() { - try { - this.browser = await chromium.launch({ - headless: false, - args: [ - `--window-size=${windowSize.width},${windowSize.height}` - ] - }); -console.log("amshcbsakchabkahbakhbasbhbhkbasbjasjabsh"); - - this.page = await this.browser.newPage(); - await this.page.setViewportSize(windowSize); - await this.registerPage(this.page); - return this.page; - } catch (error) { - console.error('Error launching browser or creating a new page:', error); - throw error; - } - } - - private async registerPage(page: Page) { - // Implement the logic to register the page with the context if needed - console.log("Page registered:", page.url()); - return page; - } -} - -// Example usage -(async () => { - const connector = new ConnectToAp(); - try { - const page = await connector.connectToAp(); - - // Navigate to an example URL to verify everything is working correctly - await page.goto('https://example.com'); - console.log(`Page title: ${await page.title()}`); - - // Close the browser after performing the tests - await page.context().browser()?.close(); - } catch (error) { - console.error('Error in connecting to AP:', error); - } -})(); - // page.pause(); - // await page.goto('localhost:8888'); - // await page.click('#items > p > a') - // await page.waitForTimeout(3000) - // await page.getByRole('treeitem', { name: '
{ + let browser: Browser | undefined; + + try { + console.log("Launching browser..."); + + const browser: Browser = await chromium.connectOverCDP('http://localhost:8888'); + + // Create a new browser context with a specific viewport size + + // Create a new page within the context + const pages = browser.contexts()[0].pages(); + console.log(pages); + + // page = pages[0]; + // await pages[0].goto('http://localhost:8888'); + // Register the driver or perform additional actions here + // this.ctx.registerDriver(page, null); + + return pages[0]; + } catch (error) { + console.error('Error launching browser or creating a new page:', error); + + if (browser) { + + await browser.close(); + + console.log("Browser closed due to error"); + } + + throw error; + } +} +export default eclipse_setup; \ No newline at end of file diff --git a/tests/example.spec.ts b/tests/example.spec.ts index 9182812..8b0e5de 100644 --- a/tests/example.spec.ts +++ b/tests/example.spec.ts @@ -1,17 +1,61 @@ import { test, expect, Keyboard } from '@playwright/test'; import { setup_ide } from './ide_setup'; +import { exec } from 'child_process'; test('Test example', async ({ page }) => { // IDE Setup test.setTimeout(60000) - const ide = process.env.IDE?.toLowerCase() ?? 'eclipse' - console.log(ide); - await setup_ide(ide, page) + const ideToSetup = process.env.IDE?.toLowerCase() ?? 'eclipse' - // await page.frameLocator('iframe[class="webview ready"]').frameLocator('iframe[title="undefined"]').locator('#workflow-diagram_0').getByText('Push').click(); - // Interact with the element inside the iframe - // await elementInsideIframe.click(); - // await iframe.keyboard.press("Delete"); - // await page.waitForTimeout(5000); -}); + console.log(ideToSetup); + + const example = await setup_ide(ideToSetup, page) + + let vscodeIframe; + + let vscode = ideToSetup === 'vscode'; + + if (vscode) { + vscodeIframe = example.frameLocator('iframe[class="webview ready"]').frameLocator('iframe[title="undefined"]') + } + + let elementXpath = '//*[contains(@class, "heading sprotty-label") and text()="KeepTp"]'; + + let svgElement = vscode ? await vscodeIframe.locator(elementXpath).first() : example.locator(elementXpath).first(); + + let textbox = vscode ? vscodeIframe.getByRole('textbox') : example.getByRole('textbox'); + + await svgElement?.click() + + await svgElement?.dblclick() + + await textbox.fill('Test'); + + await textbox.press('Enter'); + + await example.waitForTimeout(2000) + + let modifiedXpath = '//*[contains(@class, "heading sprotty-label") and text()="Test"]'; + + expect(vscode ? vscodeIframe.locator(modifiedXpath).first() : example.locator(modifiedXpath).first()).toBeTruthy(); + + await example.waitForTimeout(2000) + + if (ideToSetup === 'theia') { + + await example.keyboard.press('Control+Z'); + + await example.waitForTimeout(2000) + + exec("kill -9 `lsof -t -i:3000`") + } else if (vscode) { + + exec("kill -9 `lsof -t -i:8000`") + + } else if (ideToSetup === 'eclipse') { + await example.keyboard.press('Control+Z'); + await example.waitForTimeout(2000) + + } +}); \ No newline at end of file diff --git a/tests/ide_setup.ts b/tests/ide_setup.ts index 599eccc..17d37d8 100644 --- a/tests/ide_setup.ts +++ b/tests/ide_setup.ts @@ -1,23 +1,25 @@ import { Page } from '@playwright/test'; import vscode_setup from './vscode_setup'; // Import setup function for Visual Studio Code import theia_setup from './theia_setup'; -import eclipse_setup from './eclipse_setup '; +import eclipse_setup from './eclipse_setup'; // import eclipse_setup from './eclipse_setup'; // Import setup function for Eclipse // import theia_setup from './theia_setup'; // Import setup function for Theia // Function to setup the IDE environment based on the provided IDE name export async function setup_ide(ide: string, page: Page) { // Check which IDE is provided and call the respective setup function + let connectToPage : Page if (ide === 'vscode') { - await vscode_setup(page); // Setup for Visual Studio Code + connectToPage = await vscode_setup(page); // Setup for Visual Studio Code } else if (ide === 'theia') { - await theia_setup(page); // Setup for Theia + connectToPage = await theia_setup(page); // Setup for Theia } else if (ide === 'eclipse') { - await eclipse_setup(page); // Setup for Eclipse + connectToPage = await eclipse_setup(page); // Setup for Eclipse } else { // If the IDE name is not recognized or blank, set up all IDEs - await vscode_setup(page); // Setup for Visual Studio Code + connectToPage = await vscode_setup(page); // Setup for Visual Studio Code // theia_setup(page); // Setup for Theia // eclipse_setup(page); // Setup for Eclipse } + return connectToPage; } diff --git a/tests/theia_setup.ts b/tests/theia_setup.ts index 79f72f7..e679b5c 100644 --- a/tests/theia_setup.ts +++ b/tests/theia_setup.ts @@ -4,7 +4,7 @@ import { exec } from 'child_process'; const path = `${__dirname.split('tests')[0]}glsp-theia-integration` async function theia_setup(page: Page) { - return new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { try { const result = exec(`"cd" ${path} && "yarn" start`); @@ -16,14 +16,7 @@ async function theia_setup(page: Page) { await page.click('li#shell-tab-explorer-view-container'); await page.dblclick('//div[contains(text(), "example1.wf")]'); await page.waitForTimeout(3000) - await page.waitForSelector('g#workflow-diagram_0_task0'); - const pushbtn = page.locator(`[id=workflow-diagram_0_task0][data-svg-metadata-parent-id]`); - await pushbtn.click() - await page.keyboard.down("Delete"); - await page.waitForTimeout(5000) - await page.keyboard.press('Control+Z'); - await page.waitForTimeout(5000) - resolve(); // Resolve the promise when 'Web UI' is available + resolve(page); // Resolve the promise when 'Web UI' is available } }); diff --git a/tests/vscode_setup.ts b/tests/vscode_setup.ts index f1ddd24..b140c5d 100644 --- a/tests/vscode_setup.ts +++ b/tests/vscode_setup.ts @@ -4,7 +4,7 @@ import { exec } from 'child_process'; const path = __dirname.split('tests')[0]; async function vscode_setup(page: Page) { - return new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { try { const result = exec('"sh" /snap/code/current/usr/share/code/bin/code --no-sandbox serve-web'); @@ -31,7 +31,7 @@ async function vscode_setup(page: Page) { await page.waitForTimeout(3000); await page.click('a.install'); - await page.waitForTimeout(5000); + await page.waitForTimeout(10000); await page.click('a[aria-label="Explorer (Ctrl+Shift+E)"]'); @@ -39,10 +39,10 @@ async function vscode_setup(page: Page) { await page.click('div[aria-label="workspace"]'); await page.click('div[aria-label="example1.wf"]'); await page.waitForTimeout(20000); - await page.frameLocator('iframe[class="webview ready"]').frameLocator('iframe[title="undefined"]').locator('#workflow-diagram_0').getByText('Push').click(); - await page.keyboard.press("Delete"); - await page.waitForTimeout(10000) - resolve(); // Resolve the promise when 'Web UI' is available + // await page.frameLocator('iframe[class="webview ready"]').frameLocator('iframe[title="undefined"]').locator('#workflow-diagram_0').getByText('Push').click(); + // await page.keyboard.press("Delete"); + // await page.waitForTimeout(10000) + resolve(page); // Resolve the promise when 'Web UI' is available } });