Return remote object description for unserializable objects

This patch starts handling unserializable objects by returning their
description.

Fixes #86.
This commit is contained in:
Andrey Lushnikov 2017-07-18 00:03:52 -07:00
parent 72b7e50f9e
commit 6c1c3a0c45
2 changed files with 26 additions and 7 deletions

View File

@ -75,13 +75,21 @@ class Helper {
} }
if (!remoteObject.objectId) if (!remoteObject.objectId)
return remoteObject.value; return remoteObject.value;
let response = await client.send('Runtime.callFunctionOn', { try {
objectId: remoteObject.objectId, let response = await client.send('Runtime.callFunctionOn', {
functionDeclaration: 'function() { return this; }', objectId: remoteObject.objectId,
returnByValue: true, functionDeclaration: 'function() { return this; }',
}); returnByValue: true,
client.send('Runtime.releaseObject', {objectId: remoteObject.objectId}); });
return response.result.value; return response.result.value;
} catch (e) {
// Return description for unserializable object, e.g. 'window'.
return remoteObject.description;
} finally {
client.send('Runtime.releaseObject', {objectId: remoteObject.objectId}).catch(e => {
// While we were serializing object, the page might've navigated.
});
}
} }
} }

View File

@ -128,6 +128,10 @@ describe('Puppeteer', function() {
let result = await page.evaluate(() => -Infinity); let result = await page.evaluate(() => -Infinity);
expect(Object.is(result, -Infinity)).toBe(true); expect(Object.is(result, -Infinity)).toBe(true);
})); }));
it('should not fail for window object', SX(async function() {
let result = await page.evaluate(() => window);
expect(result).toBe('Window');
}));
}); });
describe('Page.injectFile', function() { describe('Page.injectFile', function() {
@ -256,6 +260,13 @@ describe('Puppeteer', function() {
'calling console.error', 'calling console.error',
]); ]);
})); }));
it('should not fail for window object', SX(async function() {
let windowObj = null;
page.once('console', arg => windowObj = arg);
page.evaluate(() => console.error(window));
await waitForEvents(page, 'console');
expect(windowObj).toBe('Window');
}));
}); });
describe('Page.navigate', function() { describe('Page.navigate', function() {