diff --git a/packages/code-export-java-junit/src/command.ts b/packages/code-export-java-junit/src/command.ts deleted file mode 100644 index 7dcc39a6b..000000000 --- a/packages/code-export-java-junit/src/command.ts +++ /dev/null @@ -1,1091 +0,0 @@ -// Licensed to the Software Freedom Conservancy (SFC) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The SFC licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. - -// eslint-disable-next-line node/no-unpublished-import -import { CommandShape } from '@seleniumhq/side-model' -import { - EmitterContext, - codeExport as exporter, - ExportFlexCommandShape, - PrebuildEmitter, - ProcessedCommandEmitter, - ScriptShape, -} from 'side-code-export' -import location from './location' -import selection from './selection' - -export const emitters: Record = { - addSelection: emitSelect, - answerOnNextPrompt: skip, - assert: emitAssert, - assertAlert: emitAssertAlert, - assertChecked: emitVerifyChecked, - assertConfirmation: emitAssertAlert, - assertEditable: emitVerifyEditable, - assertElementPresent: emitVerifyElementPresent, - assertElementNotPresent: emitVerifyElementNotPresent, - assertNotChecked: emitVerifyNotChecked, - assertNotEditable: emitVerifyNotEditable, - assertNotSelectedValue: emitVerifyNotSelectedValue, - assertNotText: emitVerifyNotText, - assertPrompt: emitAssertAlert, - assertSelectedLabel: emitVerifySelectedLabel, - assertSelectedValue: emitVerifySelectedValue, - assertValue: emitVerifyValue, - assertText: emitVerifyText, - assertTitle: emitVerifyTitle, - check: emitCheck, - chooseCancelOnNextConfirmation: skip, - chooseCancelOnNextPrompt: skip, - chooseOkOnNextConfirmation: skip, - click: emitClick, - clickAt: emitClick, - close: emitClose, - debugger: skip, - do: emitControlFlowDo, - doubleClick: emitDoubleClick, - doubleClickAt: emitDoubleClick, - dragAndDropToObject: emitDragAndDrop, - echo: emitEcho, - editContent: emitEditContent, - else: emitControlFlowElse, - elseIf: emitControlFlowElseIf, - end: emitControlFlowEnd, - executeScript: emitExecuteScript, - executeAsyncScript: emitExecuteAsyncScript, - forEach: emitControlFlowForEach, - if: emitControlFlowIf, - mouseDown: emitMouseDown, - mouseDownAt: emitMouseDown, - mouseMove: emitMouseMove, - mouseMoveAt: emitMouseMove, - mouseOver: emitMouseMove, - mouseOut: emitMouseOut, - mouseUp: emitMouseUp, - mouseUpAt: emitMouseUp, - open: emitOpen, - pause: emitPause, - removeSelection: emitSelect, - repeatIf: emitControlFlowRepeatIf, - run: emitRun, - runScript: emitRunScript, - select: emitSelect, - selectFrame: emitSelectFrame, - selectWindow: emitSelectWindow, - sendKeys: emitSendKeys, - setSpeed: emitSetSpeed, - setWindowSize: emitSetWindowSize, - store: emitStore, - storeAttribute: emitStoreAttribute, - //storeJson: emitStoreJson, - storeText: emitStoreText, - storeTitle: emitStoreTitle, - storeValue: emitStoreValue, - storeWindowHandle: emitStoreWindowHandle, - storeXpathCount: emitStoreXpathCount, - submit: emitSubmit, - times: emitControlFlowTimes, - type: emitType, - uncheck: emitUncheck, - verify: emitAssert, - verifyChecked: emitVerifyChecked, - verifyEditable: emitVerifyEditable, - verifyElementPresent: emitVerifyElementPresent, - verifyElementNotPresent: emitVerifyElementNotPresent, - verifyNotChecked: emitVerifyNotChecked, - verifyNotEditable: emitVerifyNotEditable, - verifyNotSelectedValue: emitVerifyNotSelectedValue, - verifyNotText: emitVerifyNotText, - verifySelectedLabel: emitVerifySelectedLabel, - verifySelectedValue: emitVerifySelectedValue, - verifyText: emitVerifyText, - verifyTitle: emitVerifyTitle, - verifyValue: emitVerifyValue, - waitForElementEditable: emitWaitForElementEditable, - waitForElementPresent: emitWaitForElementPresent, - waitForElementVisible: emitWaitForElementVisible, - waitForElementNotEditable: emitWaitForElementNotEditable, - waitForElementNotPresent: emitWaitForElementNotPresent, - waitForElementNotVisible: emitWaitForElementNotVisible, - waitForText: emitWaitForText, - webdriverAnswerOnVisiblePrompt: emitAnswerOnNextPrompt, - webdriverChooseCancelOnVisibleConfirmation: - emitChooseCancelOnNextConfirmation, - webdriverChooseCancelOnVisiblePrompt: emitChooseCancelOnNextConfirmation, - webdriverChooseOkOnVisibleConfirmation: emitChooseOkOnNextConfirmation, - while: emitControlFlowWhile, -} - -exporter.register.preprocessors(emitters) - -function register(command: string, emitter: PrebuildEmitter) { - exporter.register.emitter({ command, emitter, emitters }) -} - -function emit(command: CommandShape, context: EmitterContext) { - return exporter.emit.command(command, emitters[command.command], { - context, - variableLookup, - emitNewWindowHandling, - }) -} - -function variableLookup(varName: string) { - return `vars.get("${varName}").toString()` -} - -function variableSetter(varName: string, value: string) { - return varName ? `vars.put("${varName}", ${value});` : '' -} - -function emitWaitForWindow() { - const generateMethodDeclaration = (name: string) => { - return `public String ${name}(int timeout) {` - } - const commands = [ - { level: 0, statement: 'try {' }, - { level: 1, statement: 'Thread.sleep(timeout);' }, - { level: 0, statement: '} catch (InterruptedException e) {' }, - { level: 1, statement: 'e.printStackTrace();' }, - { level: 0, statement: '}' }, - { level: 0, statement: 'Set whNow = driver.getWindowHandles();' }, - { - level: 0, - statement: - 'Set whThen = (Set) vars.get("window_handles");', - }, - { level: 0, statement: 'if (whNow.size() > whThen.size()) {' }, - { level: 1, statement: 'whNow.removeAll(whThen);' }, - { level: 0, statement: '}' }, - { level: 0, statement: 'return whNow.iterator().next();' }, - ] - return Promise.resolve({ - name: 'waitForWindow', - commands, - generateMethodDeclaration, - }) -} - -async function emitNewWindowHandling( - command: CommandShape, - emittedCommand: ExportFlexCommandShape -) { - return Promise.resolve( - `vars.put("window_handles", driver.getWindowHandles());\n${await emittedCommand}\nvars.put("${ - command.windowHandleName - }", waitForWindow(${command.windowTimeout}));` - ) -} - -function emitAssert(varName: string, value: string) { - return Promise.resolve( - `assertEquals(vars.get("${varName}").toString(), "${value}");` - ) -} - -function emitAssertAlert(alertText: string) { - return Promise.resolve( - `assertThat(driver.switchTo().alert().getText(), is("${alertText}"));` - ) -} - -function emitAnswerOnNextPrompt(textToSend: string) { - const commands = [ - { level: 0, statement: '{' }, - { level: 1, statement: 'Alert alert = driver.switchTo().alert();' }, - { level: 1, statement: `alert.sendKeys("${textToSend}")` }, - { level: 1, statement: 'alert.accept();' }, - { level: 0, statement: '}' }, - ] - return Promise.resolve({ commands }) -} - -async function emitCheck(locator: string) { - const commands = [ - { level: 0, statement: '{' }, - { - level: 1, - statement: `WebElement element = driver.findElement(${await location.emit( - locator - )});`, - }, - { level: 1, statement: 'if (!element.isSelected()) {' }, - { level: 2, statement: 'element.click();' }, - { level: 1, statement: '}' }, - { level: 0, statement: '}' }, - ] - return Promise.resolve({ commands }) -} - -function emitChooseCancelOnNextConfirmation() { - return Promise.resolve(`driver.switchTo().alert().dismiss();`) -} - -function emitChooseOkOnNextConfirmation() { - return Promise.resolve(`driver.switchTo().alert().accept();`) -} - -async function emitClick(target: string) { - return Promise.resolve( - `driver.findElement(${await location.emit(target)}).click();` - ) -} - -async function emitClose() { - return Promise.resolve(`driver.close();`) -} - -function generateExpressionScript(script: ScriptShape) { - const scriptString = script.script.replace(/"/g, "'") - return `(Boolean) js.executeScript("return (${scriptString})"${generateScriptArguments( - script - )})` -} - -function emitControlFlowDo() { - return Promise.resolve({ - commands: [{ level: 0, statement: 'do {' }], - endingLevelAdjustment: 1, - }) -} - -function emitControlFlowElse() { - return Promise.resolve({ - commands: [{ level: 0, statement: '} else {' }], - startingLevelAdjustment: -1, - endingLevelAdjustment: +1, - }) -} - -function emitControlFlowElseIf(script: ScriptShape) { - return Promise.resolve({ - commands: [ - { - level: 0, - statement: `} else if (${generateExpressionScript(script)}) {`, - }, - ], - startingLevelAdjustment: -1, - endingLevelAdjustment: +1, - }) -} - -function emitControlFlowEnd() { - return Promise.resolve({ - commands: [{ level: 0, statement: `}` }], - startingLevelAdjustment: -1, - }) -} - -function emitControlFlowIf(script: ScriptShape) { - return Promise.resolve({ - commands: [ - { level: 0, statement: `if (${generateExpressionScript(script)}) {` }, - ], - endingLevelAdjustment: 1, - }) -} - -function emitControlFlowForEach( - collectionVarName: string, - iteratorVarName: string -) { - const collectionName = exporter.parsers.capitalize(collectionVarName) - const iteratorName = exporter.parsers.capitalize(iteratorVarName) - return Promise.resolve({ - commands: [ - { - level: 0, - statement: `ArrayList collection${collectionName} = (ArrayList) vars.get("${collectionVarName}");`, - }, - { - level: 0, - statement: `for (int i${iteratorName} = 0; i < collection${collectionName}.size() - 1; i${iteratorName}++) {`, - }, - { - level: 1, - statement: `vars.put("${iteratorVarName}", collection${collectionName}.get(i));`, - }, - ], - }) -} - -function emitControlFlowRepeatIf(script: ScriptShape) { - return Promise.resolve({ - commands: [ - { level: 0, statement: `} while (${generateExpressionScript(script)});` }, - ], - startingLevelAdjustment: -1, - }) -} - -function emitControlFlowTimes(target: string) { - const commands = [ - { level: 0, statement: `Integer times = ${target};` }, - { level: 0, statement: 'for(int i = 0; i < times; i++) {' }, - ] - return Promise.resolve({ commands, endingLevelAdjustment: 1 }) -} - -function emitControlFlowWhile(script: ScriptShape) { - return Promise.resolve({ - commands: [ - { level: 0, statement: `while (${generateExpressionScript(script)}) {` }, - ], - endingLevelAdjustment: 1, - }) -} - -async function emitDoubleClick(target: string) { - const commands = [ - { level: 0, statement: '{' }, - { - level: 1, - statement: `WebElement element = driver.findElement(${await location.emit( - target - )});`, - }, - { level: 1, statement: 'Actions builder = new Actions(driver);' }, - { level: 1, statement: 'builder.doubleClick(element).perform();' }, - { level: 0, statement: '}' }, - ] - return Promise.resolve({ commands }) -} - -async function emitDragAndDrop(dragged: string, dropped: string) { - const commands = [ - { level: 0, statement: '{' }, - { - level: 1, - statement: `WebElement dragged = driver.findElement(${await location.emit( - dragged - )});`, - }, - { - level: 1, - statement: `WebElement dropped = driver.findElement(${await location.emit( - dropped - )});`, - }, - { level: 1, statement: 'Actions builder = new Actions(driver);' }, - { level: 1, statement: 'builder.dragAndDrop(dragged, dropped).perform();' }, - { level: 0, statement: '}' }, - ] - return Promise.resolve({ commands }) -} - -async function emitEcho(message: string) { - const _message = message.startsWith('vars.get') ? message : `"${message}"` - return Promise.resolve(`System.out.println(${_message});`) -} - -async function emitEditContent(locator: string, content: string) { - const commands = [ - { level: 0, statement: '{' }, - { - level: 1, - statement: `WebElement element = driver.findElement(${await location.emit( - locator - )});`, - }, - { - level: 1, - statement: `js.executeScript("if(arguments[0].contentEditable === 'true') {arguments[0].innerText = '${content}'}", element);`, - }, - { level: 0, statement: '}' }, - ] - return Promise.resolve({ commands }) -} - -async function emitExecuteScript(script: ScriptShape, varName: string) { - const result = `js.executeScript("${script.script}"${generateScriptArguments( - script - )})` - return Promise.resolve(variableSetter(varName, result)) -} - -async function emitExecuteAsyncScript(script: ScriptShape, varName: string) { - const result = `js.executeAsyncScript("var callback = arguments[arguments.length - 1];${ - script.script - }.then(callback).catch(callback);${generateScriptArguments(script)}")` - return Promise.resolve(variableSetter(varName, result)) -} - -function generateScriptArguments(script: ScriptShape) { - return `${script.argv.length ? ', ' : ''}${script.argv - .map((varName) => `vars.get("${varName}")`) - .join(',')}` -} - -async function emitMouseDown(locator: string) { - const commands = [ - { level: 0, statement: '{' }, - { - level: 1, - statement: `WebElement element = driver.findElement(${await location.emit( - locator - )});`, - }, - { level: 1, statement: 'Actions builder = new Actions(driver);' }, - { - level: 1, - statement: 'builder.moveToElement(element).clickAndHold().perform();', - }, - { level: 0, statement: '}' }, - ] - return Promise.resolve({ commands }) -} - -async function emitMouseMove(locator: string) { - const commands = [ - { level: 0, statement: '{' }, - { - level: 1, - statement: `WebElement element = driver.findElement(${await location.emit( - locator - )});`, - }, - { level: 1, statement: 'Actions builder = new Actions(driver);' }, - { level: 1, statement: 'builder.moveToElement(element).perform();' }, - { level: 0, statement: '}' }, - ] - return Promise.resolve({ commands }) -} - -async function emitMouseOut() { - const commands = [ - { level: 0, statement: '{' }, - { - level: 1, - statement: `WebElement element = driver.findElement(By.tagName("body"));`, - }, - { level: 1, statement: 'Actions builder = new Actions(driver);' }, - { level: 1, statement: 'builder.moveToElement(element, 0, 0).perform();' }, - { level: 0, statement: '}' }, - ] - return Promise.resolve({ commands }) -} - -async function emitMouseUp(locator: string) { - const commands = [ - { level: 0, statement: '{' }, - { - level: 1, - statement: `WebElement element = driver.findElement(${await location.emit( - locator - )});`, - }, - { level: 1, statement: 'Actions builder = new Actions(driver);' }, - { - level: 1, - statement: 'builder.moveToElement(element).release().perform();', - }, - { level: 0, statement: '}' }, - ] - return Promise.resolve({ commands }) -} - -function emitOpen(target: string, _value: null, context: EmitterContext) { - const url = /^(file|http|https):\/\//.test(target) - ? `"${target}"` - : `"${context.project.url}${target}"` - return Promise.resolve(`driver.get(${url});`) -} - -async function emitPause(time: string) { - const commands = [ - { level: 0, statement: 'try {' }, - { level: 1, statement: `Thread.sleep(${time});` }, - { level: 0, statement: '} catch (InterruptedException e) {' }, - { level: 1, statement: 'e.printStackTrace();' }, - { level: 0, statement: '}' }, - ] - return Promise.resolve({ commands }) -} - -async function emitRun(testName: string) { - return Promise.resolve(`${exporter.parsers.sanitizeName(testName)}();`) -} - -async function emitRunScript(script: ScriptShape) { - return Promise.resolve( - `js.executeScript("${script.script}${generateScriptArguments(script)}");` - ) -} - -async function emitSetWindowSize(size: string) { - const [width, height] = size.split('x') - return Promise.resolve( - `driver.manage().window().setSize(new Dimension(${width}, ${height}));` - ) -} - -async function emitSelect(selectElement: string, option: string) { - const commands = [ - { level: 0, statement: '{' }, - { - level: 1, - statement: `WebElement dropdown = driver.findElement(${await location.emit( - selectElement - )});`, - }, - { - level: 1, - statement: `dropdown.findElement(${await selection.emit( - option - )}).click();`, - }, - { level: 0, statement: '}' }, - ] - return Promise.resolve({ commands }) -} - -async function emitSelectFrame(frameLocation: string) { - if (frameLocation === 'relative=top' || frameLocation === 'relative=parent') { - return Promise.resolve('driver.switchTo().defaultContent();') - } else if (/^index=/.test(frameLocation)) { - return Promise.resolve( - `driver.switchTo().frame(${Math.floor( - Number(frameLocation.split('index=')[1] as string) - )});` - ) - } else { - return Promise.resolve({ - commands: [ - { level: 0, statement: '{' }, - { - level: 1, - statement: `WebElement element = driver.findElement(${await location.emit( - frameLocation - )});`, - }, - { level: 1, statement: 'driver.switchTo().frame(element);' }, - { level: 0, statement: '}' }, - ], - }) - } -} - -async function emitSelectWindow(windowLocation: string) { - if (/^handle=/.test(windowLocation)) { - return Promise.resolve( - `driver.switchTo().window(${windowLocation.split('handle=')[1]});` - ) - } else if (/^name=/.test(windowLocation)) { - return Promise.resolve( - `driver.switchTo().window("${windowLocation.split('name=')[1]}");` - ) - } else if (/^win_ser_/.test(windowLocation)) { - if (windowLocation === 'win_ser_local') { - return Promise.resolve({ - commands: [ - { level: 0, statement: '{' }, - { - level: 1, - statement: - 'ArrayList handles = new ArrayList(driver.getWindowHandles());', - }, - { level: 1, statement: 'driver.switchTo().window(handles.get(0));' }, - { level: 0, statement: '}' }, - ], - }) - } else { - const index = parseInt(windowLocation.substr('win_ser_'.length)) - return Promise.resolve({ - commands: [ - { level: 0, statement: '{' }, - { - level: 1, - statement: - 'ArrayList handles = new ArrayList(driver.getWindowHandles());', - }, - { - level: 1, - statement: `driver.switchTo().window(handles.get(${index}));`, - }, - { level: 0, statement: '}' }, - ], - }) - } - } else { - return Promise.reject( - new Error('Can only emit `select window` using handles') - ) - } -} - -function generateSendKeysInput(value: string | string[]) { - if (typeof value === 'object') { - return value - .map((s) => { - if (s.startsWith('vars.get')) { - return s - } else if (s.startsWith('Key[')) { - const key = s.match(/\['(.*)'\]/)?.[1] as string - return `Keys.${key}` - } else { - return `"${s}"` - } - }) - .join(', ') - } else { - if (value.startsWith('vars.get')) { - return value - } else { - return `"${value}"` - } - } -} - -async function emitSendKeys(target: string, value: string) { - return Promise.resolve( - `driver.findElement(${await location.emit( - target - )}).sendKeys(${generateSendKeysInput(value)});` - ) -} - -function emitSetSpeed() { - return Promise.resolve( - `System.out.println("\`set speed\` is a no-op in code export, use \`pause\` instead");` - ) -} - -async function emitStore(value: string, varName: string) { - return Promise.resolve(variableSetter(varName, `"${value}"`)) -} - -async function emitStoreAttribute(locator: string, varName: string) { - const attributePos = locator.lastIndexOf('@') - const elementLocator = locator.slice(0, attributePos) - const attributeName = locator.slice(attributePos + 1) - const commands = [ - { level: 0, statement: '{' }, - { - level: 1, - statement: `WebElement element = driver.findElement(${await location.emit( - elementLocator - )});`, - }, - { - level: 1, - statement: `String attribute = element.getAttribute("${attributeName}");`, - }, - { level: 1, statement: `${variableSetter(varName, 'attribute')}` }, - { level: 0, statement: '}' }, - ] - return Promise.resolve({ commands }) -} - -//async function emitStoreJson(_json, _varName) { -// // TODO -// return Promise.resolve('') -//} - -async function emitStoreText(locator: string, varName: string) { - const result = `driver.findElement(${await location.emit(locator)}).getText()` - return Promise.resolve(variableSetter(varName, result)) -} - -async function emitStoreTitle(_: string, varName: string) { - return Promise.resolve(variableSetter(varName, 'driver.getTitle()')) -} - -async function emitStoreValue(locator: string, varName: string) { - const result = `driver.findElement(${await location.emit( - locator - )}).getAttribute("value")` - return Promise.resolve(variableSetter(varName, result)) -} - -async function emitStoreWindowHandle(varName: string) { - return Promise.resolve(variableSetter(varName, 'driver.getWindowHandle()')) -} - -async function emitStoreXpathCount(locator: string, varName: string) { - const result = `driver.findElements(${await location.emit(locator)}).size()` - return Promise.resolve(variableSetter(varName, result)) -} - -async function emitSubmit(_locator: string) { - return Promise.resolve( - `throw new Error("\`submit\` is not a supported command in Selenium WebDriver. Please re-record the step in the IDE.");` - ) -} - -async function emitType(target: string, value: string) { - return Promise.resolve( - `driver.findElement(${await location.emit( - target - )}).sendKeys(${generateSendKeysInput(value)});` - ) -} - -async function emitUncheck(locator: string) { - const commands = [ - { level: 0, statement: '{' }, - { - level: 1, - statement: `WebElement element = driver.findElement(${await location.emit( - locator - )});`, - }, - { level: 1, statement: 'if (element.isSelected()) {' }, - { level: 2, statement: 'element.click();' }, - { level: 1, statement: '}' }, - { level: 0, statement: '}' }, - ] - return Promise.resolve({ commands }) -} - -async function emitVerifyChecked(locator: string) { - return Promise.resolve( - `assertTrue(driver.findElement(${await location.emit( - locator - )}).isSelected());` - ) -} - -async function emitVerifyEditable(locator: string) { - const commands = [ - { level: 0, statement: '{' }, - { - level: 1, - statement: `WebElement element = driver.findElement(${await location.emit( - locator - )});`, - }, - { - level: 1, - statement: - 'Boolean isEditable = element.isEnabled() && element.getAttribute("readonly") == null;', - }, - { level: 1, statement: 'assertTrue(isEditable);' }, - { level: 0, statement: '}' }, - ] - return Promise.resolve({ commands }) -} - -async function emitVerifyElementPresent(locator: string) { - const commands = [ - { level: 0, statement: '{' }, - { - level: 1, - statement: `List elements = driver.findElements(${await location.emit( - locator - )});`, - }, - { level: 1, statement: 'assert(elements.size() > 0);' }, - { level: 0, statement: '}' }, - ] - return Promise.resolve({ commands }) -} - -async function emitVerifyElementNotPresent(locator: string) { - const commands = [ - { level: 0, statement: '{' }, - { - level: 1, - statement: `List elements = driver.findElements(${await location.emit( - locator - )});`, - }, - { level: 1, statement: 'assert(elements.size() == 0);' }, - { level: 0, statement: '}' }, - ] - return Promise.resolve({ commands }) -} - -async function emitVerifyNotChecked(locator: string) { - return Promise.resolve( - `assertFalse(driver.findElement(${await location.emit( - locator - )}).isSelected());` - ) -} - -async function emitVerifyNotEditable(locator: string) { - const commands = [ - { level: 0, statement: '{' }, - { - level: 1, - statement: `WebElement element = driver.findElement(${await location.emit( - locator - )});`, - }, - { - level: 1, - statement: - 'Boolean isEditable = element.isEnabled() && element.getAttribute("readonly") == null;', - }, - { level: 1, statement: 'assertFalse(isEditable);' }, - { level: 0, statement: '}' }, - ] - return Promise.resolve({ commands }) -} - -async function emitVerifyNotSelectedValue( - locator: string, - expectedValue: string -) { - const commands = [ - { level: 0, statement: '{' }, - { - level: 1, - statement: `String value = driver.findElement(${await location.emit( - locator - )}).getAttribute("value");`, - }, - { - level: 1, - statement: `assertThat(value, is(not("${exporter.emit.text( - expectedValue - )}")));`, - }, - { level: 0, statement: '}' }, - ] - return Promise.resolve({ commands }) -} - -async function emitVerifyNotText(locator: string, text: string) { - const result = `driver.findElement(${await location.emit(locator)}).getText()` - return Promise.resolve( - `assertThat(${result}, is(not("${exporter.emit.text(text)}")));` - ) -} - -async function emitVerifySelectedLabel(locator: string, labelValue: string) { - const commands = [ - { level: 0, statement: '{' }, - { - level: 1, - statement: `WebElement element = driver.findElement(${await location.emit( - locator - )});`, - }, - { level: 1, statement: 'String value = element.getAttribute("value");' }, - { - level: 1, - statement: `String locator = String.format("option[@value='%s']", value);`, - }, - { - level: 1, - statement: - 'String selectedText = element.findElement(By.xpath(locator)).getText();', - }, - { level: 1, statement: `assertThat(selectedText, is("${labelValue}"));` }, - { level: 0, statement: '}' }, - ] - return Promise.resolve({ - commands, - }) -} - -async function emitVerifySelectedValue(locator: string, value: string) { - return emitVerifyValue(locator, value) -} - -async function emitVerifyText(locator: string, text: string) { - return Promise.resolve( - `assertThat(driver.findElement(${await location.emit( - locator - )}).getText(), is("${exporter.emit.text(text)}"));` - ) -} - -async function emitVerifyValue(locator: string, value: string) { - const commands = [ - { level: 0, statement: '{' }, - { - level: 1, - statement: `String value = driver.findElement(${await location.emit( - locator - )}).getAttribute("value");`, - }, - { level: 1, statement: `assertThat(value, is("${value}"));` }, - { level: 0, statement: '}' }, - ] - return Promise.resolve({ commands }) -} - -async function emitVerifyTitle(title: string) { - return Promise.resolve(`assertThat(driver.getTitle(), is("${title}"));`) -} - -async function emitWaitForElementEditable(locator: string, timeout: number) { - const commands = [ - { level: 0, statement: '{' }, - { - level: 1, - statement: `WebDriverWait wait = new WebDriverWait(driver, ${Math.floor( - timeout / 1000 - )});`, - }, - { - level: 1, - statement: `wait.until(ExpectedConditions.elementToBeClickable(${await location.emit( - locator - )}));`, - }, - { level: 0, statement: '}' }, - ] - return Promise.resolve({ commands }) -} - -async function emitWaitForText(locator: string, text: string) { - const timeout = 30000 - const commands = [ - { level: 0, statement: '{' }, - { - level: 1, - statement: `WebDriverWait wait = new WebDriverWait(driver, ${Math.floor( - timeout / 1000 - )});`, - }, - { - level: 1, - statement: `wait.until(ExpectedConditions.textToBe(${await location.emit( - locator - )}, "${text}"));`, - }, - { level: 0, statement: '}' }, - ] - return Promise.resolve({ commands }) -} - -function skip() { - return Promise.resolve('') -} - -async function emitWaitForElementPresent(locator: string, timeout: number) { - const commands = [ - { level: 0, statement: '{' }, - { - level: 1, - statement: `WebDriverWait wait = new WebDriverWait(driver, ${Math.floor( - timeout / 1000 - )});`, - }, - { - level: 1, - statement: `wait.until(ExpectedConditions.presenceOfElementLocated(${await location.emit( - locator - )}));`, - }, - { level: 0, statement: '}' }, - ] - return Promise.resolve({ commands }) -} - -async function emitWaitForElementVisible(locator: string, timeout: number) { - const commands = [ - { level: 0, statement: '{' }, - { - level: 1, - statement: `WebDriverWait wait = new WebDriverWait(driver, ${Math.floor( - timeout / 1000 - )});`, - }, - { - level: 1, - statement: `wait.until(ExpectedConditions.visibilityOfElementLocated(${await location.emit( - locator - )}));`, - }, - { level: 0, statement: '}' }, - ] - return Promise.resolve({ - commands, - }) -} - -async function emitWaitForElementNotEditable(locator: string, timeout: number) { - const commands = [ - { level: 0, statement: '{' }, - { - level: 1, - statement: `WebDriverWait wait = new WebDriverWait(driver, ${Math.floor( - timeout / 1000 - )});`, - }, - { - level: 1, - statement: `wait.until(ExpectedConditions.not(ExpectedConditions.elementToBeClickable(${await location.emit( - locator - )})));`, - }, - { level: 0, statement: '}' }, - ] - return Promise.resolve({ - commands, - }) -} - -async function emitWaitForElementNotPresent(locator: string, timeout: number) { - const commands = [ - { level: 0, statement: '{' }, - { - level: 1, - statement: `WebDriverWait wait = new WebDriverWait(driver, ${Math.floor( - timeout / 1000 - )});`, - }, - { - level: 1, - statement: `WebElement element = driver.findElement(${await location.emit( - locator - )});`, - }, - { - level: 1, - statement: 'wait.until(ExpectedConditions.stalenessOf(element));', - }, - { level: 0, statement: '}' }, - ] - return Promise.resolve({ - commands, - }) -} - -async function emitWaitForElementNotVisible(locator: string, timeout: number) { - const commands = [ - { level: 0, statement: '{' }, - { - level: 1, - statement: `WebDriverWait wait = new WebDriverWait(driver, ${Math.floor( - timeout / 1000 - )});`, - }, - { - level: 1, - statement: `wait.until(ExpectedConditions.invisibilityOfElementLocated(${await location.emit( - locator - )}));`, - }, - { level: 0, statement: '}' }, - ] - return Promise.resolve({ - commands, - }) -} - -export default { - emit, - emitters, - register, - extras: { emitNewWindowHandling, emitWaitForWindow }, -} diff --git a/packages/code-export-java-junit/src/commands/answer_on_next_prompt.handlebars b/packages/code-export-java-junit/src/commands/answer_on_next_prompt.handlebars new file mode 100644 index 000000000..f73acf44d --- /dev/null +++ b/packages/code-export-java-junit/src/commands/answer_on_next_prompt.handlebars @@ -0,0 +1,5 @@ +{ + Alert alert = driver.switchTo().alert(); + alert.sendKeys({{{keys target}}}); + alert.accept(); +} diff --git a/packages/code-export-java-junit/src/commands/assert.handlebars b/packages/code-export-java-junit/src/commands/assert.handlebars new file mode 100644 index 000000000..461f0f926 --- /dev/null +++ b/packages/code-export-java-junit/src/commands/assert.handlebars @@ -0,0 +1 @@ +assertEquals(vars.get({{{string varName}}}).toString(), {{{string value}}}); diff --git a/packages/code-export-java-junit/src/commands/assert_alert.handlebars b/packages/code-export-java-junit/src/commands/assert_alert.handlebars new file mode 100644 index 000000000..2104fd73f --- /dev/null +++ b/packages/code-export-java-junit/src/commands/assert_alert.handlebars @@ -0,0 +1 @@ +assertThat(driver.switchTo().alert().getText(), is({{{string alertText}}}))); diff --git a/packages/code-export-java-junit/src/commands/check.handlebars b/packages/code-export-java-junit/src/commands/check.handlebars new file mode 100644 index 000000000..b8424675f --- /dev/null +++ b/packages/code-export-java-junit/src/commands/check.handlebars @@ -0,0 +1,6 @@ +{ + WebElement element = driver.findElement({{{locator target}}}); + if (!element.isSelected()) { + element.click(); + } +} \ No newline at end of file diff --git a/packages/code-export-java-junit/src/commands/choose_cancel_on_next_confirmation.handlebars b/packages/code-export-java-junit/src/commands/choose_cancel_on_next_confirmation.handlebars new file mode 100644 index 000000000..d70f1d423 --- /dev/null +++ b/packages/code-export-java-junit/src/commands/choose_cancel_on_next_confirmation.handlebars @@ -0,0 +1 @@ +driver.switchTo().alert().dismiss(); diff --git a/packages/code-export-java-junit/src/commands/choose_ok_on_next_confirmation.handlebars b/packages/code-export-java-junit/src/commands/choose_ok_on_next_confirmation.handlebars new file mode 100644 index 000000000..8846892ff --- /dev/null +++ b/packages/code-export-java-junit/src/commands/choose_ok_on_next_confirmation.handlebars @@ -0,0 +1 @@ +driver.switchTo().alert().accept(); diff --git a/packages/code-export-java-junit/src/commands/click.handlebars b/packages/code-export-java-junit/src/commands/click.handlebars new file mode 100644 index 000000000..0cb8443ef --- /dev/null +++ b/packages/code-export-java-junit/src/commands/click.handlebars @@ -0,0 +1 @@ +driver.findElement({{{locator target}}}).click(); diff --git a/packages/code-export-java-junit/src/commands/close.handlebars b/packages/code-export-java-junit/src/commands/close.handlebars new file mode 100644 index 000000000..8acfcaa1c --- /dev/null +++ b/packages/code-export-java-junit/src/commands/close.handlebars @@ -0,0 +1 @@ +driver.close(); diff --git a/packages/code-export-java-junit/src/commands/double_click.handlebars b/packages/code-export-java-junit/src/commands/double_click.handlebars new file mode 100644 index 000000000..efd921392 --- /dev/null +++ b/packages/code-export-java-junit/src/commands/double_click.handlebars @@ -0,0 +1,5 @@ +{ + WebElement element = driver.findElement({{{locator target}}}); + Actions builder = new Actions(driver); + builder.doubleClick(element).perform(); +} \ No newline at end of file diff --git a/packages/code-export-java-junit/src/commands/drag_and_drop.handlebars b/packages/code-export-java-junit/src/commands/drag_and_drop.handlebars new file mode 100644 index 000000000..6b56adcf5 --- /dev/null +++ b/packages/code-export-java-junit/src/commands/drag_and_drop.handlebars @@ -0,0 +1,6 @@ +{ + WebElement dragged = driver.findElement({{{locator target}}}); + WebElement dropped = driver.findElement({{{locator value}}}); + Actions builder = new Actions(driver); + builder.dragAndDrop(dragged, dropped).perform(); +} \ No newline at end of file diff --git a/packages/code-export-java-junit/src/commands/echo.handlebars b/packages/code-export-java-junit/src/commands/echo.handlebars new file mode 100644 index 000000000..8a3515d69 --- /dev/null +++ b/packages/code-export-java-junit/src/commands/echo.handlebars @@ -0,0 +1 @@ +System.out.println({{{string message}}}); \ No newline at end of file diff --git a/packages/code-export-java-junit/src/commands/edit_content.handlebars b/packages/code-export-java-junit/src/commands/edit_content.handlebars new file mode 100644 index 000000000..aee4c7cc1 --- /dev/null +++ b/packages/code-export-java-junit/src/commands/edit_content.handlebars @@ -0,0 +1,4 @@ +{ + WebElement element = driver.findElement({{{locator target}); + js.executeScript("if(arguments[0].contentEditable === 'true') {arguments[0].innerText = {{{string value}}}}", element); +} \ No newline at end of file diff --git a/packages/code-export-java-junit/src/commands/execute_async_script.handlebars b/packages/code-export-java-junit/src/commands/execute_async_script.handlebars new file mode 100644 index 000000000..521d57d6d --- /dev/null +++ b/packages/code-export-java-junit/src/commands/execute_async_script.handlebars @@ -0,0 +1,4 @@ +const result = js.executeAsyncScript({{{expression target}}}) +if (varName) { + vars[varName] = result +} diff --git a/packages/code-export-java-junit/src/commands/execute_script.handlebars b/packages/code-export-java-junit/src/commands/execute_script.handlebars new file mode 100644 index 000000000..43044d143 --- /dev/null +++ b/packages/code-export-java-junit/src/commands/execute_script.handlebars @@ -0,0 +1,4 @@ +const result = js.executeScript({{{async_script target}}}) +if (varName) { + vars[varName] = result +} \ No newline at end of file diff --git a/packages/code-export-java-junit/src/commands/mouse_down.handlebars b/packages/code-export-java-junit/src/commands/mouse_down.handlebars new file mode 100644 index 000000000..b9800693a --- /dev/null +++ b/packages/code-export-java-junit/src/commands/mouse_down.handlebars @@ -0,0 +1,5 @@ +{ + WebElement element = driver.findElement({{{locator target}}});`, + Actions builder = new Actions(driver); + builder.moveToElement(element).clickAndHold().perform(); +} \ No newline at end of file diff --git a/packages/code-export-java-junit/src/commands/mouse_down_at.handlebars b/packages/code-export-java-junit/src/commands/mouse_down_at.handlebars new file mode 100644 index 000000000..b9800693a --- /dev/null +++ b/packages/code-export-java-junit/src/commands/mouse_down_at.handlebars @@ -0,0 +1,5 @@ +{ + WebElement element = driver.findElement({{{locator target}}});`, + Actions builder = new Actions(driver); + builder.moveToElement(element).clickAndHold().perform(); +} \ No newline at end of file diff --git a/packages/code-export-java-junit/src/commands/mouse_move.handlebars b/packages/code-export-java-junit/src/commands/mouse_move.handlebars new file mode 100644 index 000000000..e380d357a --- /dev/null +++ b/packages/code-export-java-junit/src/commands/mouse_move.handlebars @@ -0,0 +1,5 @@ +{ + WebElement element = driver.findElement({{{locator target}}}); + Actions builder = new Actions(driver); + builder.moveToElement(element).perform(); +} diff --git a/packages/code-export-java-junit/src/commands/mouse_out.handlebars b/packages/code-export-java-junit/src/commands/mouse_out.handlebars new file mode 100644 index 000000000..42fca6ba4 --- /dev/null +++ b/packages/code-export-java-junit/src/commands/mouse_out.handlebars @@ -0,0 +1,5 @@ +{ + WebElement element = driver.findElement(By.tagName("body")); + Actions builder = new Actions(driver); + builder.moveToElement(element, 0, 0).perform(); +} \ No newline at end of file diff --git a/packages/code-export-java-junit/src/commands/mouse_up.handlebars b/packages/code-export-java-junit/src/commands/mouse_up.handlebars new file mode 100644 index 000000000..f4de64c3f --- /dev/null +++ b/packages/code-export-java-junit/src/commands/mouse_up.handlebars @@ -0,0 +1,3 @@ +WebElement element = driver.findElement({{{locator target}}}); +Actions builder = new Actions(driver); +builder.moveToElement(element).release().perform(); \ No newline at end of file diff --git a/packages/code-export-java-junit/src/commands/mouse_up_at.handlebars b/packages/code-export-java-junit/src/commands/mouse_up_at.handlebars new file mode 100644 index 000000000..f4de64c3f --- /dev/null +++ b/packages/code-export-java-junit/src/commands/mouse_up_at.handlebars @@ -0,0 +1,3 @@ +WebElement element = driver.findElement({{{locator target}}}); +Actions builder = new Actions(driver); +builder.moveToElement(element).release().perform(); \ No newline at end of file diff --git a/packages/code-export-java-junit/src/commands/open.handlebars b/packages/code-export-java-junit/src/commands/open.handlebars new file mode 100644 index 000000000..06a3ce348 --- /dev/null +++ b/packages/code-export-java-junit/src/commands/open.handlebars @@ -0,0 +1,5 @@ +{{#if match target '^(file|http|https)://'}} +driver.get({{{string target}}}); +{{else}} +driver.get({{{baseURL}}}{{{string target}}}); +{{/if}} diff --git a/packages/code-export-java-junit/src/commands/pause.handlebars b/packages/code-export-java-junit/src/commands/pause.handlebars new file mode 100644 index 000000000..7967d4a12 --- /dev/null +++ b/packages/code-export-java-junit/src/commands/pause.handlebars @@ -0,0 +1,5 @@ +try { + Thread.sleep({{{number time}}}); +} catch (InterruptedException e) { + e.printStackTrace(); +} \ No newline at end of file diff --git a/packages/code-export-java-junit/src/commands/run.handlebars b/packages/code-export-java-junit/src/commands/run.handlebars new file mode 100644 index 000000000..8bc116f4c --- /dev/null +++ b/packages/code-export-java-junit/src/commands/run.handlebars @@ -0,0 +1 @@ +{{{test target}}}() \ No newline at end of file diff --git a/packages/code-export-java-junit/src/commands/select.handlebars b/packages/code-export-java-junit/src/commands/select.handlebars new file mode 100644 index 000000000..bbf3331e2 --- /dev/null +++ b/packages/code-export-java-junit/src/commands/select.handlebars @@ -0,0 +1,4 @@ +{ + WebElement dropdown = driver.findElement({{{locator target}}}); + dropdown.findElement({{{locator value}}}).click(); +} \ No newline at end of file diff --git a/packages/code-export-java-junit/src/commands/select_frame.handlebars b/packages/code-export-java-junit/src/commands/select_frame.handlebars new file mode 100644 index 000000000..519145abb --- /dev/null +++ b/packages/code-export-java-junit/src/commands/select_frame.handlebars @@ -0,0 +1,12 @@ +{{#if (eq frameLocation 'relative=top')}} +driver.switchTo().defaultContent(); +{{else if (eq frameLocation 'relative=parent')}} +driver.switchTo().defaultContent(); +{{else if (match frameLocation '^index')}} +driver.switchTo().frame({{{num ( target)}}}); +{{else}} +{ + WebElement element = driver.findElement({{{locator target}}}); + driver.switchTo().frame(element); +} +{{/if}} diff --git a/packages/code-export-java-junit/src/commands/select_window.handlebars b/packages/code-export-java-junit/src/commands/select_window.handlebars new file mode 100644 index 000000000..b884bb57e --- /dev/null +++ b/packages/code-export-java-junit/src/commands/select_window.handlebars @@ -0,0 +1,16 @@ +{{#if (match target '^handle=')}} +driver.switchTo().window({{{string (attribute target)}}}); +{{else if (match target 'relative=parent')}} +driver.switchTo().window({{{string (attribute target)}}}); +{{else if (match target '^win_ser_')}} +{ + ArrayList handles = new ArrayList(driver.getWindowHandles()); + {{#if (eq target 'win_ser_local')}} + driver.switchTo().window(handles.get(0)); + {{else}} + driver.switchTo().window(handles.get({{{number (substr target 8)}}})); + {{/if}} +} +{{else}} +throw new Exception("Can only `select window` using handles"); +{{/if}} \ No newline at end of file diff --git a/packages/code-export-java-junit/src/commands/send_keys.handlebars b/packages/code-export-java-junit/src/commands/send_keys.handlebars new file mode 100644 index 000000000..5be49cc8e --- /dev/null +++ b/packages/code-export-java-junit/src/commands/send_keys.handlebars @@ -0,0 +1 @@ +driver.findElement({{{locator target}}}).sendKeys({{{keys value}}}); diff --git a/packages/code-export-java-junit/src/commands/set_speed.handlebars b/packages/code-export-java-junit/src/commands/set_speed.handlebars new file mode 100644 index 000000000..e69de29bb diff --git a/packages/code-export-java-junit/src/commands/set_window_size.handlebars b/packages/code-export-java-junit/src/commands/set_window_size.handlebars new file mode 100644 index 000000000..936be593d --- /dev/null +++ b/packages/code-export-java-junit/src/commands/set_window_size.handlebars @@ -0,0 +1 @@ +driver.manage().window().setSize(new Dimension({{{size:size}}})); \ No newline at end of file diff --git a/packages/code-export-java-junit/src/commands/store.handlebars b/packages/code-export-java-junit/src/commands/store.handlebars new file mode 100644 index 000000000..bfffe99fe --- /dev/null +++ b/packages/code-export-java-junit/src/commands/store.handlebars @@ -0,0 +1 @@ +vars[{{{varName}}}] = {{{value}}}; diff --git a/packages/code-export-java-junit/src/commands/store_attribute.handlebars b/packages/code-export-java-junit/src/commands/store_attribute.handlebars new file mode 100644 index 000000000..e7fc98b43 --- /dev/null +++ b/packages/code-export-java-junit/src/commands/store_attribute.handlebars @@ -0,0 +1,4 @@ +{ + WebElement element = driver.findElement({{{locator target}}}); + vars[{{{varName}}}] = element.getAttribute({{{attributeName}}}); +} \ No newline at end of file diff --git a/packages/code-export-java-junit/src/commands/store_text.handlebars b/packages/code-export-java-junit/src/commands/store_text.handlebars new file mode 100644 index 000000000..a68dbd337 --- /dev/null +++ b/packages/code-export-java-junit/src/commands/store_text.handlebars @@ -0,0 +1 @@ + vars[{{{varName}] = driver.findElement({{{await location.emit(locator)}).getText(); \ No newline at end of file diff --git a/packages/code-export-java-junit/src/commands/store_title.handlebars b/packages/code-export-java-junit/src/commands/store_title.handlebars new file mode 100644 index 000000000..27fd7baa1 --- /dev/null +++ b/packages/code-export-java-junit/src/commands/store_title.handlebars @@ -0,0 +1 @@ +vars[{{{varName}}}] = driver.getTitle(); diff --git a/packages/code-export-java-junit/src/commands/store_value.handlebars b/packages/code-export-java-junit/src/commands/store_value.handlebars new file mode 100644 index 000000000..66138afe2 --- /dev/null +++ b/packages/code-export-java-junit/src/commands/store_value.handlebars @@ -0,0 +1 @@ +vars[{{{varName}}}] = driver.findElement({{{locator target}}}).getAttribute("value"); diff --git a/packages/code-export-java-junit/src/commands/store_window_handle.handlebars b/packages/code-export-java-junit/src/commands/store_window_handle.handlebars new file mode 100644 index 000000000..0f4e32ac8 --- /dev/null +++ b/packages/code-export-java-junit/src/commands/store_window_handle.handlebars @@ -0,0 +1 @@ +vars[{{{varName}}}] = driver.getWindowHandle(); \ No newline at end of file diff --git a/packages/code-export-java-junit/src/commands/store_xpath_count.handlebars b/packages/code-export-java-junit/src/commands/store_xpath_count.handlebars new file mode 100644 index 000000000..073eb41ae --- /dev/null +++ b/packages/code-export-java-junit/src/commands/store_xpath_count.handlebars @@ -0,0 +1 @@ +vars[{{{varName}}}] = driver.findElements({{{await location.emit(locator)}).size(); diff --git a/packages/code-export-java-junit/src/commands/submit.handlebars b/packages/code-export-java-junit/src/commands/submit.handlebars new file mode 100644 index 000000000..b5faa46e0 --- /dev/null +++ b/packages/code-export-java-junit/src/commands/submit.handlebars @@ -0,0 +1 @@ +throw new Error("\`submit\` is not a supported command in Selenium WebDriver. Please re-record the step in the IDE."); diff --git a/packages/code-export-java-junit/src/commands/type.handlebars b/packages/code-export-java-junit/src/commands/type.handlebars new file mode 100644 index 000000000..830be02c8 --- /dev/null +++ b/packages/code-export-java-junit/src/commands/type.handlebars @@ -0,0 +1 @@ +driver.findElement({{{target}}}).sendKeys("keys:value"); diff --git a/packages/code-export-java-junit/src/commands/uncheck.handlebars b/packages/code-export-java-junit/src/commands/uncheck.handlebars new file mode 100644 index 000000000..6b897b784 --- /dev/null +++ b/packages/code-export-java-junit/src/commands/uncheck.handlebars @@ -0,0 +1,6 @@ +{ + WebElement element = driver.findElement({{{locator}); + if (element.isSelected()) { + element.click(); + } +} \ No newline at end of file diff --git a/packages/code-export-java-junit/src/commands/verify_checked.handlebars b/packages/code-export-java-junit/src/commands/verify_checked.handlebars new file mode 100644 index 000000000..a69f4575a --- /dev/null +++ b/packages/code-export-java-junit/src/commands/verify_checked.handlebars @@ -0,0 +1 @@ +assertTrue(driver.findElement({{{locator target}}}).isSelected()); diff --git a/packages/code-export-java-junit/src/commands/verify_editable.handlebars b/packages/code-export-java-junit/src/commands/verify_editable.handlebars new file mode 100644 index 000000000..8d2db9d10 --- /dev/null +++ b/packages/code-export-java-junit/src/commands/verify_editable.handlebars @@ -0,0 +1,5 @@ +{ + WebElement element = driver.findElement({{{locator target}}}); + Boolean isEditable = element.isEnabled() && element.getAttribute("readonly") == null; + assertTrue(isEditable); +} \ No newline at end of file diff --git a/packages/code-export-java-junit/src/commands/verify_element_not_present.handlebars b/packages/code-export-java-junit/src/commands/verify_element_not_present.handlebars new file mode 100644 index 000000000..ba6193134 --- /dev/null +++ b/packages/code-export-java-junit/src/commands/verify_element_not_present.handlebars @@ -0,0 +1,4 @@ +{ + List elements = driver.findElements({{{locator target}}}); + assert(elements.size() == 0); +} \ No newline at end of file diff --git a/packages/code-export-java-junit/src/commands/verify_element_present.handlebars b/packages/code-export-java-junit/src/commands/verify_element_present.handlebars new file mode 100644 index 000000000..9e46544d7 --- /dev/null +++ b/packages/code-export-java-junit/src/commands/verify_element_present.handlebars @@ -0,0 +1,4 @@ +{ + List elements = driver.findElements({{{locator target}}}); + assert(elements.size() > 0); +} \ No newline at end of file diff --git a/packages/code-export-java-junit/src/commands/verify_not_checked.handlebars b/packages/code-export-java-junit/src/commands/verify_not_checked.handlebars new file mode 100644 index 000000000..f355c0d9b --- /dev/null +++ b/packages/code-export-java-junit/src/commands/verify_not_checked.handlebars @@ -0,0 +1 @@ +assertFalse(driver.findElement({{{locator target}}}).isSelected()); diff --git a/packages/code-export-java-junit/src/commands/verify_not_editable.handlebars b/packages/code-export-java-junit/src/commands/verify_not_editable.handlebars new file mode 100644 index 000000000..6a5718e10 --- /dev/null +++ b/packages/code-export-java-junit/src/commands/verify_not_editable.handlebars @@ -0,0 +1,5 @@ +{ + WebElement element = driver.findElement({{{locator target}}}); + Boolean isEditable = element.isEnabled() && element.getAttribute("readonly") == null; + assertFalse(isEditable); +} \ No newline at end of file diff --git a/packages/code-export-java-junit/src/commands/verify_not_selected_value.handlebars b/packages/code-export-java-junit/src/commands/verify_not_selected_value.handlebars new file mode 100644 index 000000000..c6187d401 --- /dev/null +++ b/packages/code-export-java-junit/src/commands/verify_not_selected_value.handlebars @@ -0,0 +1,4 @@ + { + String value = driver.findElement({{{locator target}}}).getAttribute("value"); + assertThat(value, is(not({{{text:expectedValue}}}))); + } \ No newline at end of file diff --git a/packages/code-export-java-junit/src/commands/verify_not_text.handlebars b/packages/code-export-java-junit/src/commands/verify_not_text.handlebars new file mode 100644 index 000000000..dcfaeec0b --- /dev/null +++ b/packages/code-export-java-junit/src/commands/verify_not_text.handlebars @@ -0,0 +1,4 @@ +assertThat( + driver.findElement({{{locator target}}}).getText() + is(not({{{text:text}}})) +); \ No newline at end of file diff --git a/packages/code-export-java-junit/src/commands/verify_selected_label.handlebars b/packages/code-export-java-junit/src/commands/verify_selected_label.handlebars new file mode 100644 index 000000000..ce9993bd7 --- /dev/null +++ b/packages/code-export-java-junit/src/commands/verify_selected_label.handlebars @@ -0,0 +1,7 @@ +{ + WebElement element = driver.findElement({{{locator target}}}); + String value = element.getAttribute("value"); + String locator = String.format("option[@value='%s']", value); + String selectedText = element.findElement(By.xpath(locator)).getText(); + assertThat(selectedText, is({{{labelValue}}})); +} \ No newline at end of file diff --git a/packages/code-export-java-junit/src/commands/verify_selected_value.handlebars b/packages/code-export-java-junit/src/commands/verify_selected_value.handlebars new file mode 100644 index 000000000..ddddba2fe --- /dev/null +++ b/packages/code-export-java-junit/src/commands/verify_selected_value.handlebars @@ -0,0 +1,4 @@ +{ + String value = driver.findElement({{{locator target}}}).getAttribute("value"); + assertThat(value, is({{{value}}})); +} diff --git a/packages/code-export-java-junit/src/commands/verify_text.handlebars b/packages/code-export-java-junit/src/commands/verify_text.handlebars new file mode 100644 index 000000000..cd0c20111 --- /dev/null +++ b/packages/code-export-java-junit/src/commands/verify_text.handlebars @@ -0,0 +1 @@ +assertThat(driver.findElement({{{locator target}}}).getText(), is({{{text:text}}})); \ No newline at end of file diff --git a/packages/code-export-java-junit/src/commands/verify_title.handlebars b/packages/code-export-java-junit/src/commands/verify_title.handlebars new file mode 100644 index 000000000..a24ecae49 --- /dev/null +++ b/packages/code-export-java-junit/src/commands/verify_title.handlebars @@ -0,0 +1 @@ +assertThat(driver.getTitle(), is({{{title}}})); \ No newline at end of file diff --git a/packages/code-export-java-junit/src/commands/verify_value.handlebars b/packages/code-export-java-junit/src/commands/verify_value.handlebars new file mode 100644 index 000000000..ddddba2fe --- /dev/null +++ b/packages/code-export-java-junit/src/commands/verify_value.handlebars @@ -0,0 +1,4 @@ +{ + String value = driver.findElement({{{locator target}}}).getAttribute("value"); + assertThat(value, is({{{value}}})); +} diff --git a/packages/code-export-java-junit/src/commands/wait_for_element_editable.handlebars b/packages/code-export-java-junit/src/commands/wait_for_element_editable.handlebars new file mode 100644 index 000000000..facc5dc4b --- /dev/null +++ b/packages/code-export-java-junit/src/commands/wait_for_element_editable.handlebars @@ -0,0 +1,4 @@ +{ + WebDriverWait wait = new WebDriverWait(driver, {{{ms-to-s:timeout}}}); + wait.until(ExpectedConditions.elementToBeClickable({{{locator target}}})); +} diff --git a/packages/code-export-java-junit/src/commands/wait_for_element_not_editable.handlebars b/packages/code-export-java-junit/src/commands/wait_for_element_not_editable.handlebars new file mode 100644 index 000000000..01d368df5 --- /dev/null +++ b/packages/code-export-java-junit/src/commands/wait_for_element_not_editable.handlebars @@ -0,0 +1,4 @@ +{ + WebDriverWait wait = new WebDriverWait(driver, {{{ms-to-s:timeout}}}); + wait.until(ExpectedConditions.not(ExpectedConditions.elementToBeClickable({{{locator target}}}))); +} \ No newline at end of file diff --git a/packages/code-export-java-junit/src/commands/wait_for_element_not_present.handlebars b/packages/code-export-java-junit/src/commands/wait_for_element_not_present.handlebars new file mode 100644 index 000000000..3dbd14d81 --- /dev/null +++ b/packages/code-export-java-junit/src/commands/wait_for_element_not_present.handlebars @@ -0,0 +1,5 @@ +{ + WebDriverWait wait = new WebDriverWait(driver, {{{ms-to-s:timeout}}}); + WebElement element = driver.findElement({{{locator target}}}); + wait.until(ExpectedConditions.stalenessOf(element)); +} \ No newline at end of file diff --git a/packages/code-export-java-junit/src/commands/wait_for_element_not_visible.handlebars b/packages/code-export-java-junit/src/commands/wait_for_element_not_visible.handlebars new file mode 100644 index 000000000..8b0cab3de --- /dev/null +++ b/packages/code-export-java-junit/src/commands/wait_for_element_not_visible.handlebars @@ -0,0 +1,4 @@ +{ + WebDriverWait wait = new WebDriverWait(driver, {{{ms-to-s timeout}}}); + wait.until(ExpectedConditions.invisibilityOfElementLocated({{{locator target}}})); +} \ No newline at end of file diff --git a/packages/code-export-java-junit/src/commands/wait_for_element_present.handlebars b/packages/code-export-java-junit/src/commands/wait_for_element_present.handlebars new file mode 100644 index 000000000..050ae2b76 --- /dev/null +++ b/packages/code-export-java-junit/src/commands/wait_for_element_present.handlebars @@ -0,0 +1,4 @@ +{ + WebDriverWait wait = new WebDriverWait(driver, {{{ms-to-s:timeout}}}); + wait.until(ExpectedConditions.presenceOfElementLocated({{{locator target}}})); +} \ No newline at end of file diff --git a/packages/code-export-java-junit/src/commands/wait_for_element_visible.handlebars b/packages/code-export-java-junit/src/commands/wait_for_element_visible.handlebars new file mode 100644 index 000000000..9b501d3ba --- /dev/null +++ b/packages/code-export-java-junit/src/commands/wait_for_element_visible.handlebars @@ -0,0 +1,5 @@ +{ + WebDriverWait wait = new WebDriverWait(driver, {{{ms-to-s:timeout}}}); + wait.until(ExpectedConditions.visibilityOfElementLocated({{{locator target}}})); + +} \ No newline at end of file diff --git a/packages/code-export-java-junit/src/commands/wait_for_text.handlebars b/packages/code-export-java-junit/src/commands/wait_for_text.handlebars new file mode 100644 index 000000000..78666b6f1 --- /dev/null +++ b/packages/code-export-java-junit/src/commands/wait_for_text.handlebars @@ -0,0 +1,4 @@ +{ + WebDriverWait wait = new WebDriverWait(driver, {{{ms-to-s:timeout}}}); + wait.until(ExpectedConditions.textToBe({{{locator target}}}, {{{text}}})); +} diff --git a/packages/code-export-java-junit/src/commands/wait_for_window.handlebars b/packages/code-export-java-junit/src/commands/wait_for_window.handlebars new file mode 100644 index 000000000..f77553c1f --- /dev/null +++ b/packages/code-export-java-junit/src/commands/wait_for_window.handlebars @@ -0,0 +1,4 @@ +{ + WebDriverWait wait = new WebDriverWait(driver, {{{ms-to-s:timeout}}}); + wait.until(ExpectedConditions.invisibilityOfElementLocated({{{locator target}}})); +} \ No newline at end of file diff --git a/packages/code-export-java-junit/src/config.json b/packages/code-export-java-junit/src/config.json new file mode 100644 index 000000000..65c7b90eb --- /dev/null +++ b/packages/code-export-java-junit/src/config.json @@ -0,0 +1,8 @@ +{ + "displayName": "Java JUnit", + "name": "java-junit", + "fileExtension": ".java", + "commandPrefixPadding": " ", + "terminatingKeyword": "}", + "commentPrefix": "//" +} diff --git a/packages/code-export-java-junit/src/control_flow/do.handlebars b/packages/code-export-java-junit/src/control_flow/do.handlebars new file mode 100644 index 000000000..2103c9176 --- /dev/null +++ b/packages/code-export-java-junit/src/control_flow/do.handlebars @@ -0,0 +1 @@ +do { diff --git a/packages/code-export-java-junit/src/control_flow/else.handlebars b/packages/code-export-java-junit/src/control_flow/else.handlebars new file mode 100644 index 000000000..5e41e222d --- /dev/null +++ b/packages/code-export-java-junit/src/control_flow/else.handlebars @@ -0,0 +1 @@ +} else { diff --git a/packages/code-export-java-junit/src/control_flow/else_if.handlebars b/packages/code-export-java-junit/src/control_flow/else_if.handlebars new file mode 100644 index 000000000..50b1bc947 --- /dev/null +++ b/packages/code-export-java-junit/src/control_flow/else_if.handlebars @@ -0,0 +1 @@ +} else if ({{{boolean_exec script}}}) { diff --git a/packages/code-export-java-junit/src/control_flow/end.handlebars b/packages/code-export-java-junit/src/control_flow/end.handlebars new file mode 100644 index 000000000..5c34318c2 --- /dev/null +++ b/packages/code-export-java-junit/src/control_flow/end.handlebars @@ -0,0 +1 @@ +} diff --git a/packages/code-export-java-junit/src/control_flow/for_each.handlebars b/packages/code-export-java-junit/src/control_flow/for_each.handlebars new file mode 100644 index 000000000..b330cd7e9 --- /dev/null +++ b/packages/code-export-java-junit/src/control_flow/for_each.handlebars @@ -0,0 +1,3 @@ +ArrayList collection{{{target}}} = (ArrayList) vars.get({{{target}}}); +for (int i{{{value}}} = 0; i < collection{{{target}}}.size() - 1; i{{{value}}}++) { + vars.put({{{value}}}, collection{{{target}}}.get(i)); diff --git a/packages/code-export-java-junit/src/control_flow/if.handlebars b/packages/code-export-java-junit/src/control_flow/if.handlebars new file mode 100644 index 000000000..bd8a6becc --- /dev/null +++ b/packages/code-export-java-junit/src/control_flow/if.handlebars @@ -0,0 +1,2 @@ +if ({{{boolean_exec script}}}) { + diff --git a/packages/code-export-java-junit/src/control_flow/repeat_if.handlebars b/packages/code-export-java-junit/src/control_flow/repeat_if.handlebars new file mode 100644 index 000000000..af637e721 --- /dev/null +++ b/packages/code-export-java-junit/src/control_flow/repeat_if.handlebars @@ -0,0 +1 @@ +} while ({{{boolean_exec script}}}); diff --git a/packages/code-export-java-junit/src/control_flow/times.handlebars b/packages/code-export-java-junit/src/control_flow/times.handlebars new file mode 100644 index 000000000..f495584f5 --- /dev/null +++ b/packages/code-export-java-junit/src/control_flow/times.handlebars @@ -0,0 +1,2 @@ +Integer times = {{{number target}}}; +for (int i = 0; i < times; i++) { diff --git a/packages/code-export-java-junit/src/control_flow/while.handlebars b/packages/code-export-java-junit/src/control_flow/while.handlebars new file mode 100644 index 000000000..37865d8be --- /dev/null +++ b/packages/code-export-java-junit/src/control_flow/while.handlebars @@ -0,0 +1 @@ +while ({{{boolean_exec target }}}) { diff --git a/packages/code-export-java-junit/src/extras/new_window_handling.handlebars b/packages/code-export-java-junit/src/extras/new_window_handling.handlebars new file mode 100644 index 000000000..c32d3eb66 --- /dev/null +++ b/packages/code-export-java-junit/src/extras/new_window_handling.handlebars @@ -0,0 +1,3 @@ +vars.put("window_handles", driver.getWindowHandles()); +{{{emittedCommand}}} +vars.put({{{string windowHandleName}}}, waitForWindow({{{number command.windowTimeout}}})); diff --git a/packages/code-export-java-junit/src/extras/variable_lookup.handlebars b/packages/code-export-java-junit/src/extras/variable_lookup.handlebars new file mode 100644 index 000000000..cb087e233 --- /dev/null +++ b/packages/code-export-java-junit/src/extras/variable_lookup.handlebars @@ -0,0 +1 @@ +vars.get({{{string varName}}}).toString() \ No newline at end of file diff --git a/packages/code-export-java-junit/src/extras/wait_for_window.handlebars b/packages/code-export-java-junit/src/extras/wait_for_window.handlebars new file mode 100644 index 000000000..3a6525fff --- /dev/null +++ b/packages/code-export-java-junit/src/extras/wait_for_window.handlebars @@ -0,0 +1,13 @@ +public String waitForWindow(int timeout) { + try { + Thread.sleep(timeout); + } catch (InterruptedException e) { + e.printStackTrace(); + } + Set whNow = driver.getWindowHandles(); + Set whThen = (Set) vars.get("window_handles"); + if (whNow.size() > whThen.size()) { + whNow.removeAll(whThen); + } + return whNow.iterator().next(); +} diff --git a/packages/code-export-java-junit/src/hook.ts b/packages/code-export-java-junit/src/hook.ts deleted file mode 100644 index ee51387dc..000000000 --- a/packages/code-export-java-junit/src/hook.ts +++ /dev/null @@ -1,188 +0,0 @@ -// Licensed to the Software Freedom Conservancy (SFC) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The SFC licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. - -import { HookFunctionInputs } from "side-code-export" - -const emitters = { - afterAll, - afterEach, - beforeAll, - beforeEach, - declareDependencies, - declareMethods: empty, - declareVariables, - inEachBegin: empty, - inEachEnd: empty, -} - -export default emitters - -function afterAll() { - const params = { - startingSyntax: { - commands: [ - { level: 0, statement: '@AfterAll' }, - { level: 0, statement: 'public void finalTearDown() {' }, - ], - }, - endingSyntax: { - commands: [{ level: 0, statement: '}' }], - }, - registrationLevel: 1, - } - return params -} - -function afterEach() { - const params = { - startingSyntax: { - commands: [ - { level: 0, statement: '@After' }, - { level: 0, statement: 'public void tearDown() {' }, - { level: 1, statement: 'driver.quit();' }, - ], - }, - endingSyntax: { - commands: [{ level: 0, statement: '}' }], - }, - } - return params -} - -function beforeAll() { - const params = { - startingSyntax: { - commands: [ - { level: 0, statement: '@BeforeAll' }, - { level: 0, statement: 'public void initialSetUp() {' }, - ], - }, - endingSyntax: { - commands: [{ level: 0, statement: '}' }], - }, - registrationLevel: 1, - } - return params -} - -function beforeEach() { - const params: HookFunctionInputs = { - startingSyntax: ({ browserName, gridUrl } = {}) => ({ - commands: [ - { level: 0, statement: '@Before' }, - { - level: 0, - statement: `public void setUp() ${ - gridUrl ? 'throws MalformedURLException ' : '' - }{`, - }, - { - level: 1, - statement: gridUrl - ? `driver = new RemoteWebDriver(new URL("${gridUrl}"), DesiredCapabilities.${ - browserName ? browserName.toLowerCase() : 'chrome' - }());` - : `driver = new ${browserName ? browserName : 'Chrome'}Driver();`, - }, - { level: 1, statement: 'js = (JavascriptExecutor) driver;' }, - { level: 1, statement: 'vars = new HashMap();' }, - ], - }), - endingSyntax: { - commands: [{ level: 0, statement: '}' }], - }, - } - return params -} - -function declareDependencies() { - const params = { - startingSyntax: { - commands: [ - { level: 0, statement: 'import org.junit.Test;' }, - { level: 0, statement: 'import org.junit.Before;' }, - { level: 0, statement: 'import org.junit.After;' }, - { level: 0, statement: 'import static org.junit.Assert.*;' }, - { level: 0, statement: 'import static org.hamcrest.CoreMatchers.is;' }, - { level: 0, statement: 'import static org.hamcrest.core.IsNot.not;' }, - { level: 0, statement: 'import org.openqa.selenium.By;' }, - { level: 0, statement: 'import org.openqa.selenium.WebDriver;' }, - { - level: 0, - statement: 'import org.openqa.selenium.firefox.FirefoxDriver;', - }, - { - level: 0, - statement: 'import org.openqa.selenium.chrome.ChromeDriver;', - }, - { - level: 0, - statement: 'import org.openqa.selenium.remote.RemoteWebDriver;', - }, - { - level: 0, - statement: 'import org.openqa.selenium.remote.DesiredCapabilities;', - }, - { level: 0, statement: 'import org.openqa.selenium.Dimension;' }, - { level: 0, statement: 'import org.openqa.selenium.WebElement;' }, - { - level: 0, - statement: 'import org.openqa.selenium.interactions.Actions;', - }, - { - level: 0, - statement: - 'import org.openqa.selenium.support.ui.ExpectedConditions;', - }, - { - level: 0, - statement: 'import org.openqa.selenium.support.ui.WebDriverWait;', - }, - { - level: 0, - statement: 'import org.openqa.selenium.JavascriptExecutor;', - }, - { level: 0, statement: 'import org.openqa.selenium.Alert;' }, - { level: 0, statement: 'import org.openqa.selenium.Keys;' }, - { level: 0, statement: 'import java.util.*;' }, - { level: 0, statement: 'import java.net.MalformedURLException;' }, - { level: 0, statement: 'import java.net.URL;' }, - ], - }, - } - return params -} - -function declareVariables() { - const params = { - startingSyntax: { - commands: [ - { level: 0, statement: 'private WebDriver driver;' }, - { - level: 0, - statement: 'private Map vars;', - }, - { level: 0, statement: 'JavascriptExecutor js;' }, - ], - }, - } - return params -} - -function empty() { - return {} -} diff --git a/packages/code-export-java-junit/src/hooks/after_all.handlebars b/packages/code-export-java-junit/src/hooks/after_all.handlebars new file mode 100644 index 000000000..d49329526 --- /dev/null +++ b/packages/code-export-java-junit/src/hooks/after_all.handlebars @@ -0,0 +1,4 @@ +@AfterAll +public void finalTearDown() { + {{{afterAll}}} +} \ No newline at end of file diff --git a/packages/code-export-java-junit/src/hooks/after_each.handlebars b/packages/code-export-java-junit/src/hooks/after_each.handlebars new file mode 100644 index 000000000..3f97faa81 --- /dev/null +++ b/packages/code-export-java-junit/src/hooks/after_each.handlebars @@ -0,0 +1,4 @@ +@After +public void tearDown() { + driver.quit(); +} diff --git a/packages/code-export-java-junit/src/hooks/before_all.handlebars b/packages/code-export-java-junit/src/hooks/before_all.handlebars new file mode 100644 index 000000000..13b8ea176 --- /dev/null +++ b/packages/code-export-java-junit/src/hooks/before_all.handlebars @@ -0,0 +1,3 @@ +@BeforeAll +public void initialSetUp() { +} \ No newline at end of file diff --git a/packages/code-export-java-junit/src/hooks/before_each.handlebars b/packages/code-export-java-junit/src/hooks/before_each.handlebars new file mode 100644 index 000000000..3e236c0cf --- /dev/null +++ b/packages/code-export-java-junit/src/hooks/before_each.handlebars @@ -0,0 +1,13 @@ +@Before +{{#if GRID_URL}} +public void setUp() throws MalformedURLException { + driver = new RemoteWebDriver(new URL({{{string GRID_URL}}}), DesiredCapabilities.${ + {{#if BROWSER_NAME}}{{{lower BROWSER_NAME}}}{{else}}chrome{{/if}} + }());` +{{else}} +public void setUp() { + driver = new {{#if BROWSER_NAME}}{{{title BROWSER_NAME}}}{{else}}Chrome{{/if}}Driver(); +{{/if}} + js = (JavascriptExecutor) driver; + vars = new HashMap(); +} diff --git a/packages/code-export-java-junit/src/hooks/declare_dependencies.handlebars b/packages/code-export-java-junit/src/hooks/declare_dependencies.handlebars new file mode 100644 index 000000000..0d0bcfe27 --- /dev/null +++ b/packages/code-export-java-junit/src/hooks/declare_dependencies.handlebars @@ -0,0 +1,23 @@ +import org.junit.Test; +import org.junit.Before; +import org.junit.After; +import static org.junit.Assert.*; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.core.IsNot.not; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.remote.RemoteWebDriver; +import org.openqa.selenium.remote.DesiredCapabilities; +import org.openqa.selenium.Dimension; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.interactions.Actions; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.Alert; +import org.openqa.selenium.Keys; +import java.util.*; +import java.net.MalformedURLException; +import java.net.URL; \ No newline at end of file diff --git a/packages/code-export-java-junit/src/hooks/declare_variables.handlebars b/packages/code-export-java-junit/src/hooks/declare_variables.handlebars new file mode 100644 index 000000000..ac8644e2c --- /dev/null +++ b/packages/code-export-java-junit/src/hooks/declare_variables.handlebars @@ -0,0 +1,3 @@ +private WebDriver driver; +private Map vars; +JavascriptExecutor js; \ No newline at end of file diff --git a/packages/code-export-java-junit/src/hooks/generate_filename.handlebars b/packages/code-export-java-junit/src/hooks/generate_filename.handlebars new file mode 100644 index 000000000..5162cada8 --- /dev/null +++ b/packages/code-export-java-junit/src/hooks/generate_filename.handlebars @@ -0,0 +1 @@ +{{{title name)}}}Test{{{fileExtension}}} \ No newline at end of file diff --git a/packages/code-export-java-junit/src/hooks/generate_method_declaration.handlebars b/packages/code-export-java-junit/src/hooks/generate_method_declaration.handlebars new file mode 100644 index 000000000..c53e89943 --- /dev/null +++ b/packages/code-export-java-junit/src/hooks/generate_method_declaration.handlebars @@ -0,0 +1 @@ + public void {{{name}}}() { \ No newline at end of file diff --git a/packages/code-export-java-junit/src/hooks/generate_suite_declaration.handlebars b/packages/code-export-java-junit/src/hooks/generate_suite_declaration.handlebars new file mode 100644 index 000000000..6a0ec75ff --- /dev/null +++ b/packages/code-export-java-junit/src/hooks/generate_suite_declaration.handlebars @@ -0,0 +1 @@ +public class {{{title name}}}Test { \ No newline at end of file diff --git a/packages/code-export-java-junit/src/hooks/generate_test_declaration.handlebars b/packages/code-export-java-junit/src/hooks/generate_test_declaration.handlebars new file mode 100644 index 000000000..0276e31bb --- /dev/null +++ b/packages/code-export-java-junit/src/hooks/generate_test_declaration.handlebars @@ -0,0 +1,2 @@ +@Test +public void {{{lower name}}}() { diff --git a/packages/code-export-java-junit/src/index.ts b/packages/code-export-java-junit/src/index.ts deleted file mode 100644 index 9875bde7c..000000000 --- a/packages/code-export-java-junit/src/index.ts +++ /dev/null @@ -1,61 +0,0 @@ -// Licensed to the Software Freedom Conservancy (SFC) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The SFC licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. - -import { - codeExport as exporter, - generateHooks, - LanguageEmitterOpts, - languageFromOpts, -} from 'side-code-export' -import emitter from './command' -import location from './location' -import hooks from './hook' - -// Define language options -export const displayName = 'Java JUnit' - -export const opts: LanguageEmitterOpts = { - emitter, - displayName, - name: 'java-junit', - hooks: generateHooks(hooks), - fileExtension: '.java', - commandPrefixPadding: ' ', - terminatingKeyword: '}', - commentPrefix: '//', - generateFilename: (name) => { - return `${exporter.parsers.capitalize( - exporter.parsers.sanitizeName(name) - )}Test${opts.fileExtension}` - }, - generateMethodDeclaration: (name) => { - return `public void ${exporter.parsers.sanitizeName(name)}() {` - }, - // Create generators for dynamic string creation of primary entities (e.g., filename, methods, test, and suite) - generateSuiteDeclaration: (name) => { - return `public class ${exporter.parsers.capitalize( - exporter.parsers.sanitizeName(name) - )}Test {` - }, - generateTestDeclaration: (name) => { - return `@Test\npublic void ${exporter.parsers.uncapitalize( - exporter.parsers.sanitizeName(name) - )}() {` - }, -} - -export default languageFromOpts(opts, location.emit) diff --git a/packages/code-export-java-junit/src/location.ts b/packages/code-export-java-junit/src/location.ts deleted file mode 100644 index 056afa95c..000000000 --- a/packages/code-export-java-junit/src/location.ts +++ /dev/null @@ -1,60 +0,0 @@ -// Licensed to the Software Freedom Conservancy (SFC) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The SFC licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. - -import { codeExport as exporter } from 'side-code-export' - -const emitters = { - id: emitId, - name: emitName, - link: emitLink, - linkText: emitLink, - partialLinkText: emitPartialLinkText, - css: emitCss, - xpath: emitXpath, -} - -export function emit(location: string) { - return exporter.emit.location(location, emitters) -} - -export default { - emit, -} - -function emitId(selector: string) { - return Promise.resolve(`By.id("${selector}")`) -} - -function emitName(selector: string) { - return Promise.resolve(`By.name("${selector}")`) -} - -function emitLink(selector: string) { - return Promise.resolve(`By.linkText("${selector}")`) -} - -function emitPartialLinkText(selector: string) { - return Promise.resolve(`By.partialLinkText("${selector}")`) -} - -function emitCss(selector: string) { - return Promise.resolve(`By.cssSelector("${selector}")`) -} - -function emitXpath(selector: string) { - return Promise.resolve(`By.xpath("${selector}")`) -} diff --git a/packages/code-export-java-junit/src/locators/css.handlebars b/packages/code-export-java-junit/src/locators/css.handlebars new file mode 100644 index 000000000..ffd7a8a8e --- /dev/null +++ b/packages/code-export-java-junit/src/locators/css.handlebars @@ -0,0 +1 @@ +By.cssSelector({{{string selector}}}) \ No newline at end of file diff --git a/packages/code-export-java-junit/src/locators/id.handlebars b/packages/code-export-java-junit/src/locators/id.handlebars new file mode 100644 index 000000000..c31e9f084 --- /dev/null +++ b/packages/code-export-java-junit/src/locators/id.handlebars @@ -0,0 +1 @@ +By.id({{{string selector}}}) \ No newline at end of file diff --git a/packages/code-export-java-junit/src/locators/link.handlebars b/packages/code-export-java-junit/src/locators/link.handlebars new file mode 100644 index 000000000..9b6e871f2 --- /dev/null +++ b/packages/code-export-java-junit/src/locators/link.handlebars @@ -0,0 +1 @@ +By.linkText({{{string selector}}}) \ No newline at end of file diff --git a/packages/code-export-java-junit/src/locators/name.handlebars b/packages/code-export-java-junit/src/locators/name.handlebars new file mode 100644 index 000000000..defeb77d4 --- /dev/null +++ b/packages/code-export-java-junit/src/locators/name.handlebars @@ -0,0 +1 @@ +By.name({{{string selector}}}) \ No newline at end of file diff --git a/packages/code-export-java-junit/src/locators/partial_link_text.handlebars b/packages/code-export-java-junit/src/locators/partial_link_text.handlebars new file mode 100644 index 000000000..9b186bd5d --- /dev/null +++ b/packages/code-export-java-junit/src/locators/partial_link_text.handlebars @@ -0,0 +1 @@ +By.partialLinkText({{{string selector}}}) \ No newline at end of file diff --git a/packages/code-export-java-junit/src/locators/xpath.handlebars b/packages/code-export-java-junit/src/locators/xpath.handlebars new file mode 100644 index 000000000..9860a9cb2 --- /dev/null +++ b/packages/code-export-java-junit/src/locators/xpath.handlebars @@ -0,0 +1 @@ +By.xpath({{{string selector}}}) \ No newline at end of file diff --git a/packages/code-export-java-junit/src/selection.ts b/packages/code-export-java-junit/src/selection.ts deleted file mode 100644 index 79422a816..000000000 --- a/packages/code-export-java-junit/src/selection.ts +++ /dev/null @@ -1,49 +0,0 @@ -// Licensed to the Software Freedom Conservancy (SFC) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The SFC licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. - -import { codeExport as exporter } from 'side-code-export' - -const emitters = { - id: emitId, - value: emitValue, - label: emitLabel, - index: emitIndex, -} - -export function emit(location: string) { - return exporter.emit.selection(location, emitters) -} - -export default { - emit, -} - -function emitId(id: string) { - return Promise.resolve(`By.cssSelector("*[id='${id}']")`) -} - -function emitValue(value: string) { - return Promise.resolve(`By.cssSelector("*[value='${value}']")`) -} - -function emitLabel(label: string) { - return Promise.resolve(`By.xpath("//option[. = '${label}']")`) -} - -function emitIndex(index: string) { - return Promise.resolve(`By.cssSelector("*:nth-child(${index})")`) -} diff --git a/packages/code-export-java-junit/src/selection/id.handlesbars b/packages/code-export-java-junit/src/selection/id.handlesbars new file mode 100644 index 000000000..ab8594df7 --- /dev/null +++ b/packages/code-export-java-junit/src/selection/id.handlesbars @@ -0,0 +1 @@ +By.id({{{value}}}) \ No newline at end of file diff --git a/packages/code-export-java-junit/src/selection/index.handlebars b/packages/code-export-java-junit/src/selection/index.handlebars new file mode 100644 index 000000000..1d104e689 --- /dev/null +++ b/packages/code-export-java-junit/src/selection/index.handlebars @@ -0,0 +1 @@ +By.cssSelector("*:nth-child({{{value}}})") \ No newline at end of file diff --git a/packages/code-export-java-junit/src/selection/label.handlebars b/packages/code-export-java-junit/src/selection/label.handlebars new file mode 100644 index 000000000..88c8a0b75 --- /dev/null +++ b/packages/code-export-java-junit/src/selection/label.handlebars @@ -0,0 +1 @@ +By.xpath("//option[. = '{{{value}}}']") \ No newline at end of file diff --git a/packages/code-export-java-junit/src/selection/value.handlebars b/packages/code-export-java-junit/src/selection/value.handlebars new file mode 100644 index 000000000..425567601 --- /dev/null +++ b/packages/code-export-java-junit/src/selection/value.handlebars @@ -0,0 +1 @@ +By.cssSelector("*[value='{{{value}}}']") \ No newline at end of file diff --git a/packages/code-export-java-junit/src/syntax/arguments.handlebars b/packages/code-export-java-junit/src/syntax/arguments.handlebars new file mode 100644 index 000000000..624e01b34 --- /dev/null +++ b/packages/code-export-java-junit/src/syntax/arguments.handlebars @@ -0,0 +1 @@ +{{#each arguments}}, vars.get({{{string this}}}){{else}}{{/each}} \ No newline at end of file diff --git a/packages/code-export-java-junit/src/syntax/async_script.handlebars b/packages/code-export-java-junit/src/syntax/async_script.handlebars new file mode 100644 index 000000000..3432437ac --- /dev/null +++ b/packages/code-export-java-junit/src/syntax/async_script.handlebars @@ -0,0 +1,3 @@ +{{#with script}} +var callback = arguments[arguments.length - 1];({{{string}}}).then(callback).catch(callback);{{{arguments args}}}" +{{/with}} \ No newline at end of file diff --git a/packages/code-export-java-junit/src/syntax/boolean_exec.handlebars b/packages/code-export-java-junit/src/syntax/boolean_exec.handlebars new file mode 100644 index 000000000..ad61d1f35 --- /dev/null +++ b/packages/code-export-java-junit/src/syntax/boolean_exec.handlebars @@ -0,0 +1 @@ +(Boolean) js.executeScript({{{string (expression target)}}}); diff --git a/packages/code-export-java-junit/src/syntax/expression.handlebars b/packages/code-export-java-junit/src/syntax/expression.handlebars new file mode 100644 index 000000000..497aa7878 --- /dev/null +++ b/packages/code-export-java-junit/src/syntax/expression.handlebars @@ -0,0 +1,3 @@ +{{#with script}} +{{{string string}}}{{{arguments args}}} +{{/with}} \ No newline at end of file diff --git a/packages/code-export-java-junit/src/syntax/keys.ts b/packages/code-export-java-junit/src/syntax/keys.ts new file mode 100644 index 000000000..1e3b6ecd4 --- /dev/null +++ b/packages/code-export-java-junit/src/syntax/keys.ts @@ -0,0 +1,24 @@ +function generateSendKeysInput(value: string | string[]) { + if (typeof value === 'object') { + return value + .map((s) => { + if (s.startsWith('vars.get')) { + return s + } else if (s.startsWith('Key[')) { + const key = s.match(/\['(.*)'\]/)?.[1] as string + return `Keys.${key}` + } else { + return `"${s}"` + } + }) + .join(', ') + } else { + if (value.startsWith('vars.get')) { + return value + } else { + return `"${value}"` + } + } +} + +export default generateSendKeysInput; \ No newline at end of file diff --git a/packages/code-export-js-nightwatch/commands/assert-element-present.js b/packages/code-export-js-nightwatch/commands/assert-element-present.js new file mode 100644 index 000000000..e69de29bb diff --git a/packages/code-export-js-nightwatch/commands/click.js b/packages/code-export-js-nightwatch/commands/click.js new file mode 100644 index 000000000..e69de29bb diff --git a/packages/code-export-js-nightwatch/commands/open.js b/packages/code-export-js-nightwatch/commands/open.js new file mode 100644 index 000000000..e69de29bb diff --git a/packages/code-export-js-nightwatch/commands/send-keys.js b/packages/code-export-js-nightwatch/commands/send-keys.js new file mode 100644 index 000000000..e69de29bb diff --git a/packages/code-export-js-nightwatch/hooks/after-all.js b/packages/code-export-js-nightwatch/hooks/after-all.js new file mode 100644 index 000000000..e69de29bb diff --git a/packages/code-export-js-nightwatch/hooks/after-each.js b/packages/code-export-js-nightwatch/hooks/after-each.js new file mode 100644 index 000000000..e69de29bb diff --git a/packages/code-export-js-nightwatch/hooks/before-all.js b/packages/code-export-js-nightwatch/hooks/before-all.js new file mode 100644 index 000000000..e69de29bb diff --git a/packages/code-export-js-nightwatch/hooks/before-each.js b/packages/code-export-js-nightwatch/hooks/before-each.js new file mode 100644 index 000000000..e69de29bb diff --git a/packages/code-export-js-nightwatch/hooks/declare-dependencies.js b/packages/code-export-js-nightwatch/hooks/declare-dependencies.js new file mode 100644 index 000000000..e69de29bb diff --git a/packages/side-code-export/package.json b/packages/side-code-export/package.json index 6e5726d76..53eda3486 100644 --- a/packages/side-code-export/package.json +++ b/packages/side-code-export/package.json @@ -23,6 +23,7 @@ "@seleniumhq/side-model": "^4.0.0-alpha.3", "@seleniumhq/side-runtime": "^4.0.0-alpha.23", "commander": "^9.4.0", + "handlebars": "^4.7.7", "ua-parser-js": "0.7.28" }, "gitHead": "f58e327e7616e23a3e926e4b80cf9952164e5744" diff --git a/packages/side-code-export/src/library-handlebars/parse-folder.ts b/packages/side-code-export/src/library-handlebars/parse-folder.ts new file mode 100644 index 000000000..538f98cf7 --- /dev/null +++ b/packages/side-code-export/src/library-handlebars/parse-folder.ts @@ -0,0 +1,53 @@ +import { readFile, readdir } from 'fs/promises' +import handlebar from 'handlebars' +import { sep } from 'path' + +const requiredDirectories = [ + 'commands', + 'control_flow', + 'extras', + 'hooks', + 'locators', + 'selection', + 'syntax', +] + +export const helperFromTemplate = (template: string) => { + const compiled = handlebar.compile(template) + handlebar.registerHelper(template, compiled) +} + +export const registerHandlebarFileTemplateAsHelper = async (path: string) => { + const name = path.split(sep).pop()?.split('.')[0] + const extension = path.split('.').pop() + switch (extension) { + case 'handlebars': + handlebar.registerHelper( + name!, + handlebar.compile(await readFile(path, 'utf8')) + ) + break + case 'js': + handlebar.registerHelper(name!, (await import(path)).default) + break + default: + throw new Error(`Unsupported file extension: ${extension}`) + } +} + +export const collectFilepaths = async (folderPath: string): Promise => + (await readdir(folderPath)).map((file) => `${folderPath}${sep}${file}`) + +export const parseFormat = async (folderPath: string) => { + const tld = await readdir(folderPath) + const directories = tld.filter((file) => requiredDirectories.includes(file)) + requiredDirectories.forEach((directory) => { + if (!directories.includes(directory)) { + throw new Error( + `Missing required directory: ${directory} in ${folderPath}` + ) + } + }) + const syntaxHelpers = await collectFilepaths(`${folderPath}${sep}syntax`) + await Promise.all(syntaxHelpers.map(registerHandlebarFileTemplateAsHelper)) +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 09d62abe3..d31797f01 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -484,6 +484,9 @@ importers: commander: specifier: ^9.4.0 version: 9.4.1 + handlebars: + specifier: ^4.7.7 + version: 4.7.7 ua-parser-js: specifier: 0.7.28 version: 0.7.28 @@ -6448,6 +6451,19 @@ packages: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} dev: true + /handlebars@4.7.7: + resolution: {integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==} + engines: {node: '>=0.4.7'} + hasBin: true + dependencies: + minimist: 1.2.6 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.17.4 + dev: false + /hard-rejection@2.1.0: resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} engines: {node: '>=6'} @@ -8515,7 +8531,6 @@ packages: /neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - dev: true /nice-try@1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} @@ -10534,6 +10549,14 @@ packages: resolution: {integrity: sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==} dev: false + /uglify-js@3.17.4: + resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + engines: {node: '>=0.8.0'} + hasBin: true + requiresBuild: true + dev: false + optional: true + /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: @@ -10967,6 +10990,10 @@ packages: resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} engines: {node: '>=0.10.0'} + /wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + dev: false + /wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} diff --git a/tsconfig.json b/tsconfig.json index f05bbac0f..8ec5a38b1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -43,6 +43,9 @@ { "path": "./packages/side-code-export" }, + { + "path": "./packages/side-code-export-handlebars" + }, { "path": "./packages/side-commons" },