Rayrun
← Back to Discord Forum

.waitFor() doesn't seem to be working

disconnexusposted in #help-playwright
Open in Discord
disconnexus
disconnexus

The test I'm running requires a page to be refreshed in order for an element (an order link) to appear on the page. The order will only appear once processed in the back-end system, the time of which can vary. Previously in my code i was waiting 25 seconds, reloading the page and continuing, but there has been a couple instances where the order was still not avaialable upon refresh. I've tested the locator for the order and it is working, but in the context of the for loop below and using the .waitFor(), it doesn't seem to be found. Any thoughts?

for (let i = 0; i < 12; i++) { let order = await page .getByRole("grid", { name: "Orders" }) .getByRole("link") .waitFor({ timeout: 10000, }) .catch(() => null);

if (order) {
    console.log("Order found!");
    break;
  } else {
  console.log("Order not found, refreshing the page...");
  await page.reload();
  await page.waitForLoadState("load");
  await page.waitForTimeout(10000);
  }
}

This thread is trying to answer question "Why isn't the .waitFor() function working as expected in the context of waiting for an order link to appear upon page refresh?"

2 replies

The waitFor function is used in a way that it waits for the order link to be available. However, it's not used in conjunction with a function that continuously checks for the element, which could be a problem since it might not be able to find the order if it appears after the waitFor has timed out.

A better approach might be to use the waitForSelector function

This way, the page will keep checking for the order link for 25 seconds before timing out and refreshing the page.

This may cause a long wait time thought

An "Exponential back off" approach could provide a more dynamic solution and reduce the chance of a long wait time

Answer

I'm sorry, but without more specific details about the issue you're facing with the .waitFor() function in @playwright/test, it's hard to provide a definitive answer.

However, I can share a general approach to using .waitFor() function. This function is used to pause the execution of the test until a certain condition is met. It's particularly useful when you're dealing with elements that might take some time to appear on the page.

Here's a basic example in TypeScript:

import { test, expect } from '@playwright/test';

test('wait for order link', async ({ page }) => {
  await page.goto('https://ray.run/');
  await page.waitForSelector('#order-link');
  const orderLink = await page.$('#order-link');
  expect(orderLink).toBeTruthy();
});

In this example, the test navigates to 'https://ray.run/', then waits for an element with the id 'order-link' to appear on the page. If the element appears within the default timeout period (30 seconds), the test continues. If not, the test fails.

If you're still having trouble, you might find this blog post helpful. It provides some tips on handling flaky tests in Playwright, which might be relevant if your .waitFor() function is not behaving as expected.

Related Discord Threads

TwitterGitHubLinkedIn
AboutQuestionsDiscord ForumBrowser ExtensionTagsQA Jobs

Rayrun is a community for QA engineers. I am constantly looking for new ways to add value to people learning Playwright and other browser automation frameworks. If you have feedback, email luc@ray.run.