Skip to content

Commit 1e764c4

Browse files
Merge pull request #15 from qavajs/i-execute-step
added I execute step
2 parents 4ae6567 + 9903f10 commit 1e764c4

File tree

8 files changed

+173
-22
lines changed

8 files changed

+173
-22
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
- :rocket: added capability to connect via CDP
55
- :rocket: added I wait until current url step
66
- :rocket: added I wait until page title step
7+
- :rocket: added I execute steps allow to execute client functions
78

89
## 0.0.6
910
- :beetle: fixed issue in After hook if browser is not started

index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ require('./lib/actions.js');
44
require('./lib/waits.js');
55
require('./lib/validations.js');
66
require('./lib/memory.js');
7+
require('./lib/execute.js');

package-lock.json

Lines changed: 36 additions & 16 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
"scripts": {
77
"build": "tsc",
88
"test": "jest --coverage",
9-
"test:e2e": "ts-node node_modules/.bin/qavajs run --config test-e2e/webui.ts"
9+
"test:e2e": "ts-node node_modules/.bin/qavajs run --config test-e2e/webui.ts",
10+
"debug:e2e": "ts-node node_modules/.bin/qavajs run --config test-e2e/webui.ts --profile debug"
1011
},
1112
"repository": {
1213
"type": "git",
@@ -28,13 +29,13 @@
2829
"@types/jest": "^29.2.0",
2930
"jest": "^29.2.1",
3031
"ts-jest": "^29.0.3",
31-
"ts-node": "^10.9.1"
32+
"ts-node": "^10.9.1",
33+
"@qavajs/memory": "^1.1.1"
3234
},
3335
"dependencies": {
3436
"@playwright/test": "^1.27.1",
35-
"@qavajs/memory": "^1.1.0",
3637
"@qavajs/po-playwright": "^0.0.4",
3738
"@qavajs/validation": "^0.0.2",
38-
"playwright": "^1.27.1"
39+
"playwright": "^1.28.1"
3940
}
4041
}

src/execute.ts

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import { When } from '@cucumber/cucumber';
2+
import { getValue, getElement } from './transformers';
3+
import memory from '@qavajs/memory';
4+
5+
/**
6+
* Execute client function
7+
* @param {string} functionKey - memory key of function
8+
* @example I execute '$fn' function // fn is function reference
9+
* @example I execute 'window.scrollBy(0, 100)' function
10+
*/
11+
When('I execute {string} function', async function (functionKey) {
12+
const fn = await getValue(functionKey);
13+
await page.evaluate(fn);
14+
});
15+
16+
/**
17+
* Execute client function and save result into memory
18+
* @param {string} functionKey - memory key of function
19+
* @param {string} memoryKey - memory key to store result
20+
* @example I execute '$fn' function and save result as 'result' // fn is function reference
21+
* @example I execute 'window.scrollY' function and save result as 'scroll'
22+
*/
23+
When('I execute {string} function and save result as {string}', async function (functionKey, memoryKey) {
24+
const fn = await getValue(functionKey);
25+
memory.setValue(memoryKey, await page.evaluate(fn));
26+
});
27+
28+
/**
29+
* Execute client function on certain element
30+
* @param {string} functionKey - memory key of function
31+
* @param {string} alias - alias of target element
32+
* @example I execute '$fn' function on 'Component > Element' // fn is function reference
33+
* @example I execute 'arguments[0].scrollIntoView()' function on 'Component > Element'
34+
*/
35+
When('I execute {string} function on {string}', async function (functionKey, alias) {
36+
let fn = await getValue(functionKey);
37+
const element = await getElement(alias);
38+
if (typeof fn === 'string') {
39+
fn = new Function('return ' + fn)
40+
}
41+
await element.evaluate(fn);
42+
});
43+
44+
/**
45+
* Execute client function on certain element
46+
* @param {string} functionKey - memory key of function
47+
* @param {string} alias - alias of target element
48+
* @example I execute '$fn' function on 'Component > Element' and save result as 'innerText' // fn is function reference
49+
* @example I execute 'arguments[0].innerText' function on 'Component > Element' and save result as 'innerText'
50+
*/
51+
When(
52+
'I execute {string} function on {string} and save result as {string}',
53+
async function (functionKey, alias, memoryKey) {
54+
let fn = await getValue(functionKey);
55+
if (typeof fn === 'string') {
56+
fn = new Function('return ' + fn)
57+
}
58+
const element = await getElement(alias);
59+
memory.setValue(memoryKey, await element.evaluate(fn));
60+
}
61+
);

test-e2e/features/execute.feature

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
Feature: execute
2+
3+
Background:
4+
When I open '$actionsPage' url
5+
6+
Scenario: execute function plain text
7+
When I execute 'document.querySelector("#input").value = "some value"' function
8+
Then I expect 'value' property of 'Input' to be equal 'some value'
9+
10+
Scenario: execute function
11+
When I execute '$setInputValue' function
12+
Then I expect 'value' property of 'Input' to be equal 'some value'
13+
14+
Scenario: execute function and save result plain text
15+
When I click 'Button'
16+
When I execute 'document.querySelector("#action").innerText' function and save result as 'innerText'
17+
Then I expect '$innerText' memory value to be equal 'click'
18+
19+
Scenario: execute function and save result plain text
20+
When I click 'Button'
21+
When I execute '$getActionInnerText' function and save result as 'innerText'
22+
Then I expect '$innerText' memory value to be equal 'click'
23+
24+
Scenario: execute function on element plain text
25+
When I execute 'arguments[0].click()' function on 'Button'
26+
Then I expect text of 'Action' to be equal 'click'
27+
28+
Scenario: execute function on element
29+
When I execute '$clickJS' function on 'Button'
30+
Then I expect text of 'Action' to be equal 'click'
31+
32+
Scenario: execute function on element plain text and save result
33+
When I execute 'arguments[0].innerText' function on 'Button' and save result as 'buttonInnerText'
34+
Then I expect '$buttonInnerText' memory value to be equal 'Click Me!'
35+
36+
Scenario: execute function on element and save result
37+
When I execute '$getInnerText' function on 'Button' and save result as 'buttonInnerText'
38+
Then I expect '$buttonInnerText' memory value to be equal 'Click Me!'

test-e2e/memory/index.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,18 @@ export default class Memory {
66
framePage = file(resolve('./test-e2e/apps/frame.html'));
77
waitsPage = file(resolve('./test-e2e/apps/waits.html'));
88

9-
array = (...args: Array<any>) => args
9+
array = (...args: Array<any>) => args;
10+
11+
// @ts-ignore
12+
setInputValue = () => document.querySelector('#input').value = 'some value';
13+
14+
// @ts-ignore
15+
getActionInnerText = () => document.querySelector("#action").innerText;
16+
17+
// @ts-ignore
18+
clickJS = target => target.click();
19+
20+
// @ts-ignore
21+
getInnerText = target => target.innerText;
1022
}
1123

test-e2e/webui.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import Memory from './memory';
22
import App from './page_object';
33

4-
export default {
4+
const common = {
55
paths: ['test-e2e/features/*.feature'],
66
require: ['test-e2e/step-definitions/*.ts', 'src/*.ts'],
77
browser: {
@@ -21,3 +21,20 @@ export default {
2121
parallel: 1,
2222
publishQuiet: true
2323
}
24+
25+
export default common;
26+
27+
export const debug = {
28+
...common,
29+
tags: '@debug',
30+
browser: {
31+
logLevel: 'warn',
32+
timeout: {
33+
page: 5000
34+
},
35+
capabilities: {
36+
browserName: 'chromium',
37+
headless: false
38+
}
39+
}
40+
}

0 commit comments

Comments
 (0)