diff --git a/tests/e2e/utils_e2e.js b/tests/e2e/utils_e2e.js
index 98d762fbcc..6afbe43b86 100644
--- a/tests/e2e/utils_e2e.js
+++ b/tests/e2e/utils_e2e.js
@@ -80,3 +80,24 @@ export async function save_visual(page) {
     });
   }
 }
+
+// Create a temporary user and login to that user and store session info.
+// This should ideally run on a per test basis.
+export async function create_temp_user(browser, workerInfo, request) {
+  const username = globalThis.crypto.randomUUID();
+  const newUser = await request.post(`/api/v1/admin/users`, {
+    headers: {
+      'Content-Type': 'application/json',
+      'Authorization': `Basic ${btoa(`user1:${LOGIN_PASSWORD}`)}`,
+    },
+    data: {
+      username,
+      email: `${username}@host.invalid`,
+      password: LOGIN_PASSWORD,
+      must_change_password: false,
+    },
+  });
+  expect(newUser.ok()).toBeTruthy();
+
+  return {context: await login_user(browser, workerInfo, username), username};
+}
diff --git a/tests/e2e/webauthn.test.e2e.js b/tests/e2e/webauthn.test.e2e.js
index f98cd47126..1f645ffea2 100644
--- a/tests/e2e/webauthn.test.e2e.js
+++ b/tests/e2e/webauthn.test.e2e.js
@@ -9,15 +9,11 @@
 // @watch end
 
 import {expect} from '@playwright/test';
-import {test, login_user, load_logged_in_context} from './utils_e2e.js';
+import {test, create_temp_user} from './utils_e2e.js';
 
-test.beforeAll(async ({browser}, workerInfo) => {
-  await login_user(browser, workerInfo, 'user40');
-});
-
-test('WebAuthn register & login flow', async ({browser}, workerInfo) => {
+test('WebAuthn register & login flow', async ({browser, request}, workerInfo) => {
   test.skip(workerInfo.project.name !== 'chromium', 'Uses Chrome protocol');
-  const context = await load_logged_in_context(browser, workerInfo, 'user40');
+  const {context, username} = await create_temp_user(browser, workerInfo, request);
   const page = await context.newPage();
 
   // Register a security key.
@@ -51,7 +47,7 @@ test('WebAuthn register & login flow', async ({browser}, workerInfo) => {
   response = await page.goto('/user/login');
   await expect(response?.status()).toBe(200);
 
-  await page.getByLabel('Username or email address').fill('user40');
+  await page.getByLabel('Username or email address').fill(username);
   await page.getByLabel('Password').fill('password');
   await page.getByRole('button', {name: 'Sign in'}).click();
   await page.waitForURL(`${workerInfo.project.use.baseURL}/user/webauthn`);