diff --git a/examples/unrandomize.js b/examples/unrandomize.js new file mode 100644 index 00000000000..fc8df3fcd1e --- /dev/null +++ b/examples/unrandomize.js @@ -0,0 +1,33 @@ +/** + * Copyright 2017 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var Browser = require('../lib/Browser'); +var browser = new Browser(); + +browser.newPage().then(async page => { + await page.evaluateOnInitialized(function() { + Math.random = () => 42 / 100; + }); + var result = await page.navigate('http://ariya.github.com/js/random/'); + if (result) { + console.log(await page.evaluate(function () { + return document.getElementById('numbers').textContent; + })); + } else { + console.log('Network error.'); + } + browser.close(); +}); diff --git a/lib/Page.js b/lib/Page.js index c161798cc7d..9e52fd41082 100644 --- a/lib/Page.js +++ b/lib/Page.js @@ -304,6 +304,18 @@ class Page extends EventEmitter { return response.result.value; } + /** + * @param {function()} fun + * @param {!Array<*>} args + * @return {!Promise} + */ + async evaluateOnInitialized(fun, ...args) { + var code = helpers.evaluationString(fun, args, false); + await this._client.send('Page.addScriptToEvaluateOnLoad', { + scriptSource: code + }); + } + /** * @param {!Page.ScreenshotType} screenshotType * @param {?{x: number, y: number, width: number, height: number}} clipRect diff --git a/lib/helpers.js b/lib/helpers.js index b5a868e0f3b..d7a19c1ce29 100644 --- a/lib/helpers.js +++ b/lib/helpers.js @@ -14,7 +14,7 @@ * limitations under the License. */ -module.exports = { +var helpers = module.exports = { /** * @param {!CDP} client * @param {string} url @@ -53,16 +53,28 @@ module.exports = { * @return {!Promise} */ evaluate: function(client, fun, args, awaitPromise, sourceURL) { - var argsString = args.map(x => JSON.stringify(x)).join(','); - var code = `(${fun.toString()})(${argsString})`; - if (awaitPromise) - code = `Promise.resolve(${code})`; - if (sourceURL) - code += `\n//# sourceURL=${sourceURL}`; + var code = helpers.evaluationString(fun, args, awaitPromise, sourceURL); return client.send('Runtime.evaluate', { expression: code, awaitPromise: awaitPromise, returnByValue: true }); }, + + /** + * @param {function()} fun + * @param {!Array<*>} args + * @param {boolean} awaitPromise + * @param {string=} sourceURL + * @return {string} + */ + evaluationString: function(fun, args, awaitPromise, sourceURL) { + var argsString = args.map(x => JSON.stringify(x)).join(','); + var code = `(${fun.toString()})(${argsString})`; + if (awaitPromise) + code = `Promise.resolve(${code})`; + if (sourceURL) + code += `\n//# sourceURL=${sourceURL}`; + return code; + } }