我正在使用打字稿、包
"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
提前致谢
我会尝试使用 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);
}
}