Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to wait for JavaScript to finish in playwright

I am testing UI with Playwright and JavaScript. My code find an input element that can sometimes be a drop down, sometimes a text and sometimes a date. To handle this I enter value with 2 steps. First I fill the text and then click on tab key to invoke the JavaScript that formats the value in the element.

await page.fill("#myID", inputText); 
await page.keyboard.press('Tab');  // this line trigger the JS

// continue to the next element 

The problem, it is not waiting for JavaScript to finish. How can I wait for JS to finish before the code continue.

like image 338
Jacob Avatar asked Dec 06 '25 22:12

Jacob


2 Answers

You could wait for some reaction to your click (some page change, or HTTP request made), for example:

  • wait for certain element state change https://playwright.dev/docs/api/class-locator#locator-wait-for
  • wait for a new element to appear on the page (like a dialog open) https://playwright.dev/docs/api/class-page#page-wait-for-selector
  • wait until a request fired https://playwright.dev/docs/api/class-page#page-wait-for-request
  • wait until a response received https://playwright.dev/docs/api/class-page#page-wait-for-response
  • or wait for an event https://playwright.dev/docs/api/class-page#page-wait-for-event
like image 168
dst Avatar answered Dec 09 '25 12:12

dst


Using the page.waitFor... functions

There are a slew of functions that playwright offers for when certain conditions are met that start with page.waitFor (e.g. page.waitForFunction). Probably page.waitForFunction is the most versatile, because you can pass a custom function that waits for a specific condition to be met.

Alternatively, use a timeout

I think you can use setTimeout with page.evaluate inside the page context to wait a bit for other JavaScript to run:

await page.evaluate(() => {
  // if this doesn't work, you can try to increase 0 to a higher number (i.e. 100)
  return new Promise((resolve) => setTimeout(resolve, 0));
});

This might be equivalent to page.waitForTimeout(0), but I'm not sure. Note that they recommend not to use page.waitForTimeout in production.

like image 29
Steve Avatar answered Dec 09 '25 13:12

Steve



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!