Я знаю, что Never pause here
, но это не работает для кода, подобного этому
setInterval(function(){
eval('debugger;'+Math.random())
},1000)
Если я не могу найти setInterval
, я не могу отключить паузу, это очень раздражает.
Есть ли какой-либо флаг или каким-то образом отключить его?
РЕДАКТИРОВАТЬ
Я нашел эти проблемы (DevTools: невозможно отключить точку останова, вызванную оператором "отладчик"), относятся к этой проблеме, в тестовом коде я нашел флаг --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.
Ну, единственный выбор, который у вас есть, - это ввести код на страницу, которая переопределяет eval и удаляет ее.
(function () {
var _eval = window.eval;
window.eval = function (str) {
_eval(str.replace(/debugger;/,""));
};
}());
eval("debugger;alert('a');")
Я сделал это, отключив интервал и тайм-аут, некоторые сайты используют это, чтобы другие не наблюдали за кодом.
Я вставляю код перед загрузкой, используя хром без головы
Начать без головы
chrome --headless --disable-gpu <URL> --remote-debugging-port=9222
Другой сеанс оболочки
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()
После сценария откройте "localhost: 9222" в chrome, проверьте страницу, отладчик не запустится.
eval
нарушит код, который создает переменные вне его внутренней области, т. Е. В области вызываемого объекта - это может сделать только встроенныйeval
.