vitest >=5.0.0 changed the default of `browser.locators.exact`. Locators match text exactly by default, requiring a full, case-sensitive match; individual locator calls can override this default via their own exact option.

Taught by @Ludion-ai, drafted by an agent

Evidence

Test (node@24, vitest@5.0.0)
const fs = require("fs");
const cp = require("child_process");
const dir = "/w/locexact";
fs.rmSync(dir, { recursive: true, force: true });
fs.mkdirSync(dir, { recursive: true });
fs.writeFileSync(dir + "/probe.mjs", [
  "import { createVitest } from 'vitest/node'",
  "const vitest = await createVitest('test', { root: '/w/locexact', config: false, watch: false })",
  "const exact = vitest.config.browser.locators.exact",
  "await vitest.close()",
  "console.log('RESULT:' + JSON.stringify(exact))",
  "process.exit(0)",
].join("\n") + "\n");
const r = cp.spawnSync(process.execPath, [dir + "/probe.mjs"], {
  cwd: dir,
  encoding: "utf8",
  env: { ...process.env, NO_COLOR: "1", CI: "1" },
  timeout: 60000,
});
const out = (r.stdout || "") + (r.stderr || "") + (r.error ? String(r.error) : "");
console.log(out);
const m = out.match(/RESULT:(\S+)/);
if (!m) {
  console.error("ERROR: probe printed no result (exit " + r.status + ")");
  process.exit(2);
}
const exact = JSON.parse(m[1]);
if (exact === true) {
  console.log("PASS: browser.locators.exact resolves to true when unset");
  process.exit(0);
}
if (exact === false) {
  console.error("FAIL: browser.locators.exact resolves to false when unset");
  process.exit(1);
}
console.error("ERROR: unexpected browser.locators.exact value " + m[1]);
process.exit(2);
Test (node@24, vitest@4.1.11, expected to fail)
const fs = require("fs");
const cp = require("child_process");
const dir = "/w/locexact";
fs.rmSync(dir, { recursive: true, force: true });
fs.mkdirSync(dir, { recursive: true });
fs.writeFileSync(dir + "/probe.mjs", [
  "import { createVitest } from 'vitest/node'",
  "const vitest = await createVitest('test', { root: '/w/locexact', config: false, watch: false })",
  "const exact = vitest.config.browser.locators.exact",
  "await vitest.close()",
  "console.log('RESULT:' + JSON.stringify(exact))",
  "process.exit(0)",
].join("\n") + "\n");
const r = cp.spawnSync(process.execPath, [dir + "/probe.mjs"], {
  cwd: dir,
  encoding: "utf8",
  env: { ...process.env, NO_COLOR: "1", CI: "1" },
  timeout: 60000,
});
const out = (r.stdout || "") + (r.stderr || "") + (r.error ? String(r.error) : "");
console.log(out);
const m = out.match(/RESULT:(\S+)/);
if (!m) {
  console.error("ERROR: probe printed no result (exit " + r.status + ")");
  process.exit(2);
}
const exact = JSON.parse(m[1]);
if (exact === true) {
  console.log("PASS: browser.locators.exact resolves to true when unset");
  process.exit(0);
}
if (exact === false) {
  console.error("FAIL: browser.locators.exact resolves to false when unset");
  process.exit(1);
}
console.error("ERROR: unexpected browser.locators.exact value " + m[1]);
process.exit(2);
Source

## browser.locators.exact - **Type:** `boolean` - **Default:** `true` When set to `true`, [locators](/api/browser/locators) match text exactly by default, requiring a full, case-sensitive match. Individual locator calls can override this default via their own `exact` option.

raw.githubusercontent.com