title: Getting DOM node text with Puppeteer and headless Chrome
body: <p>I'm trying to use headless Chrome and Puppeteer to run our Javascript tests, but I can't extract the results from the page. Based on <a href="https://stackoverflow.com/a/45799744/4794">this answer</a>, it looks like I should use <a href="https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pageevaluatepagefunction-args" rel="noreferrer"><code>page.evaluate()</code></a>. That section even has an example that looks like what I need.</p>
  
  <pre><code>const bodyHandle = await page.$('body');
  const html = await page.evaluate(body =&gt; body.innerHTML, bodyHandle);
  await bodyHandle.dispose();
  </code></pre>
  
  <p>As a full example, I tried to convert that to a script that will extract my name from my user profile on Stack Overflow. Our project is using Node 6, so I converted the <code>await</code> expressions to use <code>.then()</code>.</p>
  
  <pre><code>const puppeteer = require('puppeteer');
  
  puppeteer.launch().then(function(browser) {
      browser.newPage().then(function(page) {
          page.goto('https://stackoverflow.com/users/4794').then(function() {
              page.$('h2.user-card-name').then(function(heading_handle) {
                  page.evaluate(function(heading) {
                      return heading.innerText;
                  }, heading_handle).then(function(result) {
                      console.info(result);
                      browser.close();
                  }, function(error) {
                      console.error(error);
                      browser.close();
                  });
              });
          });
      });
  });
  </code></pre>
  
  <p>When I run that, I get this error:</p>
  
  <pre><code>$ node get_user.js 
  TypeError: Converting circular structure to JSON
      at Object.stringify (native)
      at args.map.x (/mnt/data/don/git/Kive/node_modules/puppeteer/node6/helper.js:30:43)
      at Array.map (native)
      at Function.evaluationString (/mnt/data/don/git/Kive/node_modules/puppeteer/node6/helper.js:30:29)
      at Frame.&lt;anonymous&gt; (/mnt/data/don/git/Kive/node_modules/puppeteer/node6/FrameManager.js:376:31)
      at next (native)
      at step (/mnt/data/don/git/Kive/node_modules/puppeteer/node6/FrameManager.js:355:24)
      at Promise (/mnt/data/don/git/Kive/node_modules/puppeteer/node6/FrameManager.js:373:12)
      at fn (/mnt/data/don/git/Kive/node_modules/puppeteer/node6/FrameManager.js:351:10)
      at Frame._rawEvaluate (/mnt/data/don/git/Kive/node_modules/puppeteer/node6/FrameManager.js:375:3)
  </code></pre>
  
  <p>The problem seems to be with serializing the input parameter to <code>page.evaluate()</code>. I can pass in strings and numbers, but not element handles. Is the example wrong, or is it a problem with Node 6? How can I extract the text of a DOM node?</p>