如何使用selenium typescript拦截网络调用?

问题描述 投票:0回答:1

我正在使用打字稿、包

"selenium-webdriver": "^4.8.1",
"@types/selenium-webdriver": "^4.1.11",

和 chromedriver。

我感兴趣的是打开特定站点后“监听网络呼叫”。

示例

await driver.get('https://example.com");

现在我想拦截该网站正在执行的所有 AJAX 请求和响应。 我需要获取特定 url 的 API 响应并继续执行我的 selenium 测试的断言逻辑。

我怎样才能实现这一目标?

我尝试过的:

我使用

"browsermob-proxy": "^1.0.13",
没有成功


type Proxy = {
    host: string;
    port: number;
    start: () => Promise<void>;
    cbHAR: (
        url: string,
        doSeleniumStuff: (proxy: Proxy, cb: () => void) => void,
        cb: (err: Error | null, data: string) => void,
    ) => void;
    getHAR: () => {
        log: {
            entries: {
                // @ts-ignore
                request: any;
                // @ts-ignore
                response: any;
            }[];
        };
    };
    doHAR: (url: string, cb: (err: Error | null, data: string) => void) => void;
};

const proxy = new browsermob.Proxy()
proxy.start(); // always failed also doHar etc

提前致谢

selenium-webdriver proxy selenium-chromedriver browsermob-proxy browsermob
1个回答
0
投票

我会尝试使用 Chrome DevTools Protocol (CDP) 建立与浏览器的连接,启用网络后,您可以订阅

requestWillBeSent
responseReceived
事件。

我建议您使用

chrome-remote-interface
,这样会更容易。虽然也可以使用 Selenium Webdriver 来完成,但尚未得到官方支持。

使用

chrome-remote-interface
的示例:

首先在 Chrome 选项中配置 Selenium 中的端口:

options.addArguments('--remote-debugging-port=9222');

然后您可以使用 CDP 连接到该端口并订阅请求事件:

import CDP from 'chrome-remote-interface';

async function listenToNetworkCalls() {
  let client: CDP.Client | undefined;

  try {
    // Connect to the Chrome DevTools Protocol
    client = await CDP({ port: 9222 });

    // Extract the domains we need
    const { Network } = client;

    // Enable the network domain
    await Network.enable();

    // Subscribe to the requestWillBeSent event
    Network.requestWillBeSent((params) => {
      console.log('Request:', params.request);
    });

    // Subscribe to the responseReceived event
    Network.responseReceived((params) => {
      console.log('Response:', params.response);
    });

  } catch (err) {
    console.error('Error:', err);
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.