'Playwright: .toBeVisible() timeout is ignored

I faced an unclear behavior in the Playwright 1.18 toBeVisible() expectation. Here is the test row:

await expect(this.page.locator('.top-row .close i')).toBeVisible({timeout: 2000 })

And if the element is not visible, it hangs forever.

If I jump into the toBeTruthy.js -> toBeTruthy code, I see that the timeout is calculated to 0 despite the received options:

enter image description here

And for some reason, there is the current timeout from _toMatchText matcher used. Is this a bug or I'm doing somethin wrong?

Package.json:

"devDependencies": {
    "@playwright/test": "^1.18",
    "allure-commandline": "^2.17.2",
    "allure-playwright": "^2.0.0-beta.14",
    "rimraf": "3.0.2"
  }

Playwright config:

import { PlaywrightTestConfig, devices } from '@playwright/test';

const config: PlaywrightTestConfig = {
  testDir: './spec',
  timeout: 10 * 1000,

  expect: {
    timeout: 3 * 1000
  },

  forbidOnly: !!process.env.CI,
  retries: process.env.CI ? 2 : 0,
  workers: process.env.CI ? 5 : 1,

  reporter: [
    ['line'],
    ['json', { outputFile: './test-results/results.json' }],
    ['./util/test-start-stop-reporter.ts'],
    ['allure-playwright']
  ],

  use: {
    baseURL: 'http://localhost:8080',
    screenshot: 'only-on-failure',
    channel: 'chrome', //https://playwright.dev/docs/browsers#chromium
    headless: false,
    viewport: { width: 1820, height: 950 },
    ignoreHTTPSErrors: true,
    video: 'retain-on-failure',

    actionTimeout: 5 * 1000,
    navigationTimeout: 30 * 1000,
    launchOptions: {
      args: ['--window-position=1980,10'],
      devtools: process.env.PWDEBUG ? true : false,
    },

  },

  projects: [
    {
      name: 'Google Chrome',
      use: {
        channel: 'chrome',
      },
    },
  ],
  outputDir: 'test-results/',
};
export default config;


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source