@luminati-io/webdriverio8
Version:
Next-gen browser and mobile automation test framework for Node.js
60 lines (58 loc) • 3.63 kB
JavaScript
import fs from 'node:fs/promises';
import url from 'node:url';
import { resolve } from 'import-meta-resolve';
import { getElement } from '../../utils/getElementObject.js';
import { waitToLoadReact, react$ as react$Script } from '../../scripts/resq.js';
let resqScript;
/**
*
* The `react$` command is a useful command to query React Components by their
* actual name and filter them by props and state.
*
* :::info
*
* The command only works with applications using React v16.x. Read more about React
* selectors in the [Selectors](/docs/selectors#react-selectors) guide.
*
* :::
*
* <example>
:pause.js
it('should calculate 7 * 6', async () => {
await browser.url('https://ahfarmer.github.io/calculator/');
const appWrapper = await $('div#root')
await browser.react$('t', {
props: { name: '7' }
}).click()
await browser.react$('t', {
props: { name: 'x' }
}).click()
await browser.react$('t', {
props: { name: '6' }
}).click()
await browser.react$('t', {
props: { name: '=' }
}).click()
console.log(await $('.component-display').getText()); // prints "42"
});
* </example>
*
* @alias browser.react$
* @param {string} selector of React component
* @param {ReactSelectorOptions=} options React selector options
* @param {Object=} options.props React props the element should contain
* @param {Array<any>|number|string|object|boolean=} options.state React state the element should be in
* @return {Element}
*
*/
export async function react$(selector, { props = {}, state = {} } = {}) {
if (!resqScript) {
const resqScriptPath = url.fileURLToPath(await resolve('resq', import.meta.url));
resqScript = (await fs.readFile(resqScriptPath)).toString();
}
await this.executeScript(resqScript.toString(), []);
await this.execute(waitToLoadReact);
const res = await this.execute(react$Script, selector, props, state);
return getElement.call(this, selector, res, { isReactElement: true });
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhY3QkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2Jyb3dzZXIvcmVhY3QkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQ2pDLE9BQU8sR0FBRyxNQUFNLFVBQVUsQ0FBQTtBQUUxQixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFHN0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFBO0FBQzVELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxJQUFJLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBRy9FLElBQUksVUFBa0IsQ0FBQTtBQUV0Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMENHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxNQUFNLENBRXhCLFFBQWdCLEVBQ2hCLEVBQUUsS0FBSyxHQUFHLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxLQUEyQixFQUFFO0lBRXJELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNkLE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsTUFBTSxPQUFPLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUNoRixVQUFVLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQTtJQUMvRCxDQUFDO0lBRUQsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUNuRCxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUE7SUFDbkMsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUMxQixZQUFtQixFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUNuQixDQUFBO0lBRTVCLE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO0FBQ3pFLENBQUMifQ==