LucianoGanga / simple-headless-chrome

Simple abstraction to use Chrome as a Headless Browser with Node JS
MIT License
217 stars 50 forks source link

Cannot read property 'kill' of undefined #60

Closed Tin-Nguyen closed 7 years ago

Tin-Nguyen commented 7 years ago

Hi all,

I got the issue when running with docker configuration

Cannot read property 'kill' of undefined, stack: TypeError: Cannot read property 'kill' of undefined
    at Browser._callee$ (/WORK_SPACE/src/.../node_modules/simple-headless-chrome/build/Browser.js:129:43)

The config I did

chromeConfig = {
        headless: true,
        launchChrome: false,
        chrome: {
            host: remoteChromeConfig.host,
            port: remoteChromeConfig.port,
            remote: true
        },
        browserlog: true
};

I'm seeing the document is out of date with the latest version. It might be a wrong configuration. Any advises to resolve the issue?

I have just checked the source code, there is no kill function in chrome.js file. The source code has issues?

Tin-Nguyen commented 7 years ago

any one can help to resolve the issue?

farant commented 7 years ago

I had this problem and it was because Chrome wasn't running! It wasn't running because it wouldn't start in the docker image I was using. The solution ended up being to change the startup script to start google-chrome-stable using the --no-sandbox flag.

Tin-Nguyen commented 7 years ago

Thanks @farant , I will try your way

Tin-Nguyen commented 7 years ago

hi @farant , I just check to do curl http://localhost:9222 and I could receive the response from Headless Chrome, so I think it is running now.

<html>
<head>
<title>Headless remote debugging</title>
<style>
</style>

<script>
const fetchjson = (url) => fetch(url).then(r => r.json());

function loadData() {
  const getList = fetchjson("/json/list");
  const getVersion = fetchjson('/json/version');
  Promise.all([getList, getVersion]).then(parseResults);
}

function parseResults([listData, versionData]){
    const version = versionData['WebKit-Version'];
    const hash = version.match(/\s\(@(\b[0-9a-f]{5,40}\b)/)[1];
    listData.forEach(item => appendItem(item, hash));
}

function appendItem(item, hash) {
  let link;
  if (item.devtoolsFrontendUrl) {
    link = document.createElement("a");
    var devtoolsFrontendUrl = item.devtoolsFrontendUrl.replace(/^\/devtools\//,'');
    link.href = `https://chrome-devtools-frontend.appspot.com/serve_file/@${hash}/${devtoolsFrontendUrl}&remoteFrontend=true`;
    link.title = item.title;
  } else {
    link = document.createElement("div");
    link.title = "The tab already has active debugging session";
  }

  var text = document.createElement("div");
  if (item.title)
    text.textContent = item.title;
  else
    text.textContent = "(untitled tab)";
  if (item.faviconUrl)
    text.style.cssText = "background-image:url(" + item.faviconUrl + ")";
  link.appendChild(text);

  var p = document.createElement("p");
  p.appendChild(link);

  document.getElementById("items").appendChild(p);
}
</script>
</head>
<body onload='loadData()'>
  <div id='caption'>Inspectable WebContents</div>
  <div id='items'></div>
</body>
</html>
Tin-Nguyen commented 7 years ago

is there any one help on this?

LucianoGanga commented 7 years ago

Hello @Tin-Nguyen !

I found the problem. As you're using remote debugging, simple-headless-chrome doesn't have an instance for the Chrome that you are connecting. So, (because of a bug) whenever you call the close() method it cannot find the instance to close it.

It's fixed now, and should be working if you try with version v4.3.7. Please let me know if it doesn't work by reopening the issue.

Cheers! Luciano

PS: I'm interested on knowing if remote debugging works well, as I haven't been able to test it right (it should be the same anyway). So, let me know please if it worked for you.

Tin-Nguyen commented 7 years ago

Thanks @LucianoGanga , I will check on newer version v4.3.7 today

Tin-Nguyen commented 7 years ago

The issue has been resolved on v4.3.8 version. Thanks