[Home](./index.md) > [puppeteer](./puppeteer.md) > [Frame](./puppeteer.frame.md) > [waitForFunction](./puppeteer.frame.waitforfunction.md) ## Frame.waitForFunction() method Signature: ```typescript waitForFunction(pageFunction: Function | string, options?: FrameWaitForFunctionOptions, ...args: SerializableOrJSHandle[]): Promise; ``` ## Parameters | Parameter | Type | Description | | --- | --- | --- | | pageFunction | Function \| string | the function to evaluate in the frame context. | | options | [FrameWaitForFunctionOptions](./puppeteer.framewaitforfunctionoptions.md) | options to configure the polling method and timeout. | | args | [SerializableOrJSHandle](./puppeteer.serializableorjshandle.md)\[\] | arguments to pass to the pageFunction. | Returns: Promise<[JSHandle](./puppeteer.jshandle.md)> the promise which resolve when the `pageFunction` returns a truthy value. ## Remarks ## Example The `waitForFunction` can be used to observe viewport size change: ```js const puppeteer = require('puppeteer'); (async () => { . const browser = await puppeteer.launch(); . const page = await browser.newPage(); . const watchDog = page.mainFrame().waitForFunction('window.innerWidth < 100'); . page.setViewport({width: 50, height: 50}); . await watchDog; . await browser.close(); })(); ``` To pass arguments from Node.js to the predicate of `page.waitForFunction` function: ```js const selector = '.foo'; await frame.waitForFunction( selector => !!document.querySelector(selector), {}, // empty options object selector ); ```