webdriverio
Version:
Next-gen browser and mobile automation test framework for Node.js
62 lines (59 loc) • 3.17 kB
TypeScript
import type { ChainablePromiseElement, FrameQuery } from '../../types.js';
type FrameTarget = string | WebdriverIO.Element | ChainablePromiseElement | FrameQuery | FramePredicate;
type FramePredicate = (context: {
context: string;
url: string;
}) => boolean | Promise<boolean>;
/**
* Get a frame (`<iframe>` or `<frame>`) of this browsing context as a browsing
* context of its own. Commands on the returned context run in the frame's
* document, also for cross-origin frames, while this context and every other one
* stay usable. Since v10 this replaces `switchFrame()` in a WebDriver BiDi session.
*
* Say how to find the frame with a query, the recommended form:
*
* - `{ selector }`: the frame element a CSS or XPath selector finds in this document
* - `{ url }`: the first frame, at any depth, whose URL equals the string or matches the RegExp
* - `{ id }`: the frame with this browsing context id
*
* It also takes a frame element, or a predicate that is called with the `context`
* id and `url` of each descendant frame. A string is a shorthand that guesses:
* a selector when it finds a frame element, then a frame URL (or a part of it),
* then a context id.
*
* `parent` on the result is the context `frame()` was called on for a direct
* child frame, or the frame in between when the match is nested deeper.
*
* <example>
:frame.js
it('works with nested frames', async () => {
const page = await browser.url('https://the-internet.herokuapp.com/nested_frames')
const top = await page.frame({ selector: 'frame[name="frame-top"]' })
const middle = await top.frame({ selector: 'frame[name="frame-middle"]' })
console.log(await middle.$('#content').getText()) // outputs: "MIDDLE"
console.log(middle.parent?.contextId === top.contextId) // outputs: true
console.log(await page.getTitle()) // the page itself is still usable
})
* </example>
*
* <example>
:frameQueries.js
it('finds frames by url, id or predicate', async () => {
const page = await browser.url('https://the-internet.herokuapp.com/nested_frames')
const top = await page.frame({ url: /frame_top/ })
const left = await top.frame({ url: /frame_left/ })
const sameFrame = await page.frame({ id: left.contextId })
console.log(await sameFrame.$('body').getText()) // outputs: "LEFT"
const bottom = await page.frame(({ url }) => url.endsWith('/frame_bottom'))
console.log(await bottom.$('body').getText()) // outputs: "BOTTOM"
})
* </example>
*
* @param {FrameQuery|WebdriverIO.Element|Function|string} target the frame to get: a query (`{ selector }`, `{ url }` or `{ id }`), a frame element, a predicate, or a string shorthand
* @alias browsingContext.frame
* @return {WebdriverIO.BrowsingContext} the browsing context of the frame
* @throws {Error} When no frame matches before the `waitforTimeout` passes, or when a selector finds an element that is not a frame.
*/
export declare function frame(this: WebdriverIO.BrowsingContext, target: FrameTarget): Promise<WebdriverIO.BrowsingContext>;
export {};
//# sourceMappingURL=frame.d.ts.map