Files
TS-CUCUMBER-WDIO-QK/test/support/qkforce-actions.mjs
isopropilick 29899223e4
Some checks failed
CI / validate (push) Has been cancelled
Enhance CI configuration and documentation; add new action palette adapter
2026-09-15 10:32:11 -06:00

46 lines
2.3 KiB
JavaScript

import fs from 'node:fs/promises';
import path from 'node:path';
import { randomUUID } from 'node:crypto';
/** Adapter for the action palette emitted by QKForce. One instance per WDIO worker. */
export function createQkfActions(browser, root = process.cwd()) {
let tail = Promise.resolve();
const enqueue = action => {
const result = tail.then(action);
tail = result;
// Legacy saved snippets did not await calls. flush() surfaces failures at the step boundary.
void result.catch(() => {});
return result;
};
const element = selector => {
if (typeof selector !== 'string' || !selector.trim()) throw new Error('QKForce action requires a selector string');
return browser.$(selector);
};
const call = (selector, method, ...args) => enqueue(async () => (await element(selector))[method](...args));
return Object.freeze({
click: selector => call(selector, 'click'),
doubleClick: selector => call(selector, 'doubleClick'),
rightClick: selector => call(selector, 'click', { button: 'right' }),
enterValue: (selector, value) => call(selector, 'setValue', value),
addValue: (selector, value) => call(selector, 'addValue', value),
clearValue: selector => call(selector, 'clearValue'),
isVisible: selector => call(selector, 'isDisplayed'),
exists: selector => call(selector, 'isExisting'),
isEnabled: selector => call(selector, 'isEnabled'),
isClickable: selector => call(selector, 'isClickable'),
isSelected: selector => call(selector, 'isSelected'),
waitForVisible: selector => call(selector, 'waitForDisplayed'),
waitForExistence: selector => call(selector, 'waitForExist'),
waitForClickable: selector => call(selector, 'waitForClickable'),
waitForEnabled: selector => call(selector, 'waitForEnabled'),
goto: url => enqueue(() => browser.url(url)),
takeScreenshot: name => enqueue(async () => {
const directory = path.resolve(root, 'qreport-results', 'screenshots');
await fs.mkdir(directory, { recursive: true });
const label = String(name ?? 'screenshot').replace(/[^a-zA-Z0-9_-]/g, '_').slice(0, 80);
return browser.saveScreenshot(path.join(directory, `${label}-${randomUUID()}.png`));
}),
async flush() { try { await tail; } finally { tail = Promise.resolve(); } }
});
}