Chrome如何禁用调试器关键字或禁用暂停

时间:2017-06-09 17:39:16

标签: javascript google-chrome google-chrome-devtools

我知道有一个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.

3 个答案:

答案 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