You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Playwright JavaScript:导航失败及元素交互异常抛出方法

Playwright JavaScript 异常处理实现方案

一、元素可见可点击但点击后无跳转时抛出异常

Playwright 默认不会在元素可点击但点击后未触发导航时自动抛出异常,你需要手动校验导航状态并抛出自定义异常,以此模拟 Selenium 中 ElementNotInteractableException 的触发场景:

  • 核心思路:点击元素前记录当前页面 URL,点击后等待导航完成,若超时且 URL 未变化,则判定为导航未触发,抛出对应异常。
  • 代码实现:
const { chromium } = require('playwright');

(async () => {
  const browser = await chromium.launch();
  const page = await browser.newPage();
  await page.goto('https://example.com');

  // 定位目标元素(假设该元素可见可点击但点击后无跳转)
  const targetBtn = page.locator('#non-nav-btn');

  // 点击前记录当前URL
  const originalUrl = page.url();
  await targetBtn.click();

  try {
    // 等待导航完成,设置超时时间(示例为3秒)
    await page.waitForNavigation({ timeout: 3000 });
  } catch (err) {
    // 超时未导航且URL未变化时,抛出模拟异常
    if (page.url() === originalUrl) {
      throw new Error('ElementNotInteractableException: Element is visible and clickable but did not trigger navigation');
    }
    // 其他超时原因,抛出原错误
    throw err;
  }

  await browser.close();
})();

二、导航失败时主动抛出异常

Playwright 的 page.goto()、page.reload() 等导航方法默认不会在导航失败(如4xx/5xx状态码、网络错误、超时)时直接抛出异常,可通过以下两种方式实现主动抛异常:

方式1:校验响应状态码

通过获取导航响应,判断状态码是否合法,非2xx则抛出异常:

const { chromium } = require('playwright');

(async () => {
  const browser = await chromium.launch();
  const page = await browser.newPage();

  try {
    const response = await page.goto('https://example.com/invalid-path', {
      waitUntil: 'domcontentloaded',
      timeout: 5000
    });

    // 校验响应状态,无响应或状态码非2xx则抛出异常
    if (!response || !response.ok()) {
      throw new Error(`Navigation failed with status code: ${response ? response.status() : 'No response received'}`);
    }
  } catch (err) {
    throw new Error(`Navigation error: ${err.message}`);
  }

  await browser.close();
})();

方式2:监听页面错误事件

通过监听页面的错误事件,捕获导航相关异常并抛出:

const { chromium } = require('playwright');

(async () => {
  const browser = await chromium.launch();
  const page = await browser.newPage();

  // 监听页面全局错误,捕获导航相关异常
  page.on('pageerror', (err) => {
    throw new Error(`Navigation-related error occurred: ${err.message}`);
  });

  try {
    await page.goto('https://example.com/invalid-path', { timeout: 5000 });
    // 额外校验是否到达预期URL
    if (!page.url().includes('target-path')) {
      throw new Error('Navigation failed: Did not reach expected URL');
    }
  } catch (err) {
    throw err;
  }

  await browser.close();
})();

内容的提问来源于stack exchange,提问作者Amit kundalkar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 08:40:32