我知道有一个Never pause here
,但它不适用于像这样的代码
setInterval(function(){
eval('debugger;'+Math.random())
},1000)
如果我找不到setInterval
,我无法禁用暂停,这非常烦人。
是否有任何标志或以某种方式禁用此功能?
修改
我发现这个issues(DevTools:无法禁用由“调试器”语句引起的断点)与此问题相关,在测试code中我找到了一个标志--expose-debug-as debug
,但是如何将这个标志用于无头,
chrome --expose-debug-as debug --headless --disable-gpu '<URL>' --repl
[0610/020053.677043:ERROR:headless_shell.cc(459)] Open multiple tabs is only supported when the remote debug port is set.
答案 0 :(得分:1)
你真正唯一的选择是将代码注入覆盖eval的页面并删除它。
(function () {
var _eval = window.eval;
window.eval = function (str) {
_eval(str.replace(/debugger;/,""));
};
}());
eval("debugger;alert('a');")
答案 1 :(得分:0)
我通过禁用间隔和超时来完成此操作,有些网站使用它来阻止其他人观看代码。
我使用chrome headless
在onload之前插入代码开始无头
chrome --headless --disable-gpu <URL> --remote-debugging-port=9222
其他shell会话
yarn add chrome-remote-interface
<强> test.es6 强>
const CDP = require('chrome-remote-interface');
async function test() {
const protocol = await CDP({port: 9222});
// Extract the DevTools protocol domains we need and enable them.
// See API docs: https://chromedevtools.github.io/devtools-protocol/
const {Page, Runtime, Debugger, Log, Console} = protocol;
try {
await Promise.all([
Page.enable(),
Runtime.enable(),
Log.enable(),
Console.enable(),
Debugger.disable(),
]);
} catch (e) {
console.log('Failed', e)
return
}
Log.entryAdded(({entry: e}) =>
console.log(`${new Date(e.timestamp).toISOString()} ${e.source}:${e.level} ${e.text}`)
);
Console.messageAdded(({message: e}) =>
console.log(`${new Date().toISOString()} ${e.source}:${e.level} ${e.text}`)
)
Page.navigate({url: URL_HERE});
// Inject code,disable setInterval and setTimeout
Runtime.executionContextCreated(async ({context}) => {
console.log('executionContextCreated')
let result = await Runtime.evaluate({
expression: `
window._si=window.setInterval
window.setInterval=(...args)=>{
let id = 1//window._si.apply(window,args)
console.warn(\`setInterval:\${args}\`,)
return id
}
window._st=window.setTimeout
window.setTimeout=(...args)=>{
let id = 1//window._st.apply(window,args)
console.warn(\`setTimeout:\${args}\`,)
return id
}
;location.href
`,
contextId: context.id,
});
console.log('executionContextCreated', result)
});
// Wait for window.onload before doing stuff.
Page.loadEventFired(async () => {
// Debugger.setSkipAllPauses(true)
const js = `
console.log('Page load');
document.querySelector('title').textContent
`;
// Evaluate the JS expression in the page.
const result = await Runtime.evaluate({expression: js});
console.log('Title of page: ' + result.result.value);
protocol.close();
});
}
test()
在脚本之后,在chrome中打开'localhost:9222',检查页面,调试器现在不运行。
答案 2 :(得分:0)
如果您不需要 setInterval 用于其他任何事情,只需在控制台中输入:
window.setTimeout = null