microsoft / playwright-java

Java version of the Playwright testing and automation library
https://playwright.dev/java/
Apache License 2.0
1.13k stars 205 forks source link

Getting com.microsoft.playwright.TimeoutError: Error when opening the same page multiple times #1608

Closed ThatYodaCoder closed 3 months ago

ThatYodaCoder commented 3 months ago

Version

1.44.0

Steps to reproduce

Opening a same html page 200 times in new browser instance, getting following exception for many requests. I do not want to increase the timeout here.

I am trying to simulate prod like scenario where I will get > 1000 of requests per minute and I will be opening this page in headless browser per request.

``   public static void main(String[] args) throws InterruptedException {
        List<Thread> threads = new ArrayList<>();
        for (int i = 0; i < 200; i++) {
            System.out.println("=**************************************************i" + i);
            Thread th = new Thread(() -> {openTestPageForMemProfile();});
            threads.add(th);
            th.start();

        }
        System.out.println("************************************************** threads.size()=" + threads.size());

        for (Thread th : threads){
            th.join();
        }
        System.out.println("Exiting main now..............");
    }

    private static void openTestPageForMemProfile() {

        String htmlContent = FixtureHelpers.fixture("__files/test.html");
        System.out.println("read page");

        try (Playwright playwright = Playwright.create()) {
            // Launch a new instance of Chromium

            Browser browser = playwright.chromium().launch(
                    new BrowserType.LaunchOptions().setHeadless(true));

            BrowserContext context = browser.newContext();
            Page page = context.newPage();
            page.onResponse(response -> System.out.println("<<" + response.status() + " " + response.url()));

            page.setContent(htmlContent);

            page.waitForLoadState(LoadState.NETWORKIDLE);

            System.out.println("Check0");

            Thread.sleep(180000);

            page.close();
            context.close();
            browser.close();
            System.out.println("exiting");
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

`Call log:

Caused by: com.microsoft.playwright.TimeoutError: Error { message='Timeout 30000ms exceeded. name='TimeoutError stack='TimeoutError: Timeout 30000ms exceeded. at ProgressController.run (/private/var/folders/2t/_wf5dp41445ggspsmp9ymjsrb9bjrn/T/playwright-java-16108880659489428992/package/lib/server/progress.js:78:26) at Frame.setContent (/private/var/folders/2t/_wf5dp41445ggspsmp9ymjsrb9bjrn/T/playwright-java-16108880659489428992/package/lib/server/frames.js:760:23) at FrameDispatcher.setContent (/private/var/folders/2t/_wf5dp41445ggspsmp9ymjsrb9bjrn/T/playwright-java-16108880659489428992/package/lib/server/dispatchers/frameDispatcher.js:144:30) at FrameDispatcher._handleCommand (/private/var/folders/2t/_wf5dp41445ggspsmp9ymjsrb9bjrn/T/playwright-java-16108880659489428992/package/lib/server/dispatchers/dispatcher.js:94:40) at DispatcherConnection.dispatch (/private/var/folders/2t/_wf5dp41445ggspsmp9ymjsrb9bjrn/T/playwright-java-16108880659489428992/package/lib/server/dispatchers/dispatcher.js:361:39) } Call log:

Actual behavior

Timeout should not occur when I open this page multiple times in a loop.

Additional context

No response

Environment

Mac OS, 2 gb heap space

yury-s commented 3 months ago

Opening a same html page 200 times in new browser instance, getting following exception for many requests. I do not want to increase the timeout here.

You machine chokes trying to open 200 browsers in parallel. You need to either get a much beefier machine, shard the load across several machines, increase timeout or run some of the tests sequentially. General rule of thumb for efficient runs is to have number of parallel browsers = 1/2 CPU cores. Closing as this is working as intended.