Dive into secure and efficient coding practices with our curated list of the top 10 examples showcasing 'chrome-remote-interface' in functional components in JavaScript. Our advanced machine learning engine meticulously scans each line of code, cross-referencing millions of open source libraries to ensure your implementation is not just functional, but also robust and secure. Elevate your React applications to new heights by mastering the art of handling side effects, API calls, and asynchronous operations with confidence and precision.
module.exports.test = (event, context, callback, chrome) => {
CDP.Version()
.then((versionInfo) => {
callback(null, {
statusCode: 200,
body: JSON.stringify({
versionInfo,
chrome,
}),
// headers: {
// 'Content-Type': 'application/json',
// },
})
})
.catch((error) => {
callback(null, {
statusCode: 500,
body: JSON.stringify({
async function init() {
let client;
try {
// Start the Chrome Debugging Protocol
client = await CDP();
// Verify version
const { Browser } = await CDP.Version();
const browserVersion = Browser.match(/\/(\d+)/)[1];
if (Number(browserVersion) !== 60) {
console.warn(`This script requires Chrome 60, however you are using version ${browserVersion}. The script is not guaranteed to work and you may need to modify it.`);
}
// Extract used DevTools domains.
const {DOM, Emulation, Network, Page, Runtime} = client;
// Enable events on domains we are interested in.
await Page.enable();
await DOM.enable();
await Network.enable();
// If user agent override was specified, pass to Network domain
if (userAgent) {
await Network.setUserAgentOverride({userAgent});
await sleep(100) // wait here, in case this resource has triggered more resources to load.
requestQueue.splice(requestQueue.findIndex(item => item === data.requestId), 1)
log('Chrome received response for:', data.requestId, data.response.url)
})
Page.loadEventFired((data) => {
loaded = true
log('Page.loadEventFired', data)
})
Page.domContentEventFired((data) => {
log('Page.domContentEventFired', data)
})
if (config.logging) {
Cdp.Version((err, info) => {
console.log('CDP version info', err, info)
})
}
try {
await Promise.all([
Network.enable(), // https://chromedevtools.github.io/devtools-protocol/tot/Network/#method-enable
Page.enable(), // https://chromedevtools.github.io/devtools-protocol/tot/Page/#method-enable
])
await Page.navigate({ url }) // https://chromedevtools.github.io/devtools-protocol/tot/Page/#method-navigate
await loading()
log('We think the page has finished loading. Printing PDF.')
// https://chromedevtools.github.io/devtools-protocol/tot/Page/#method-printToPDF
})
Page.screencastFrame(({ sessionId, data, metadata }) => {
const filename = `/tmp/frame-${invokeid}-${String(metadata.timestamp).replace('.', '')}.jpg`
framesCaptured += 1
// log('Received screencast frame', sessionId, metadata)
Page.screencastFrameAck({ sessionId })
fs.writeFile(filename, data, { encoding: 'base64' }, (error) => {
log('Page.screencastFrame writeFile:', filename, error)
})
})
if (process.env.LOGGING === 'TRUE') {
Cdp.Version((err, info) => {
console.log('CDP version info', err, info)
})
}
try {
await Promise.all([Network.enable(), Page.enable(), DOM.enable()])
const interactionStartTime = Date.now()
await client.send('Overlay.enable') // this has to happen after DOM.enable()
await client.send('Overlay.setShowFPSCounter', { show: true })
await Page.startScreencast({
format: 'jpeg',
quality: options.captureQuality,
everyNthFrame: options.captureFrameRate,
const loading = async (startTime = Date.now()) => {
console.log('loading...')
if (!loaded && Date.now() - startTime < LOAD_TIMEOUT) {
await sleep(100)
await loading(startTime)
}
}
console.log('here 1')
const tab = await Cdp.New({ host: '127.0.0.1' })
console.log('tab', tab)
const client = await Cdp({ host: '127.0.0.1', tab /* , remote: true*/ })
const { Network, Page } = client
console.log('here 2')
Cdp.Version((err, info) => {
console.log('CDP version info', err, info)
})
/* client.on('event', (message) => {
console.log('client event', message)
})*/
Network.requestWillBeSent((params) => {
// console.log(params.request.url)
})
Page.loadEventFired(() => {
loaded = true
})
console.log('here 3')
<title>Chromeless test page</title>
<div class="container">
<div class="logo"><img alt="Chromeless" src="data:image/png;base64,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"></div>
<div>
<p>This is a test page for Chromeless unit tests</p>
</div>
</div>
`;
CDP.Version().then(version => {
console.log(`Detected Chrome running: ${version['User-Agent']}`);
http.createServer((request, response) => {
const pathname = url.parse(request.url).pathname;
if (pathname === '/' || pathname === '/index.html') {
response.writeHead(200, {'Content-Type': 'text/html'});
response.write(indexHtml);
response.end();
}
else {
// Currently no other file exists
response.writeHead(404, {'Content-Type': 'text/plain'});
response.write('404 Not Found');
response.end();
}
let result
let loaded = false
const loading = async (startTime = Date.now()) => {
console.log('loading...')
if (!loaded && Date.now() - startTime < LOAD_TIMEOUT) {
await sleep(100)
await loading(startTime)
}
}
console.log('here 1')
const tab = await Cdp.New({ host: '127.0.0.1' })
console.log('tab', tab)
const client = await Cdp({ host: '127.0.0.1', tab /* , remote: true*/ })
const { Network, Page } = client
console.log('here 2')
Cdp.Version((err, info) => {
console.log('CDP version info', err, info)
})
/* client.on('event', (message) => {
console.log('client event', message)
})*/
Network.requestWillBeSent((params) => {
// console.log(params.request.url)
})
Meteor.setTimeout(() => {
console.log("going to visit",url);
console.log(url);
const chromeParams = {};
if (Spiderable.useLocalChrome) {
chromeParams.port = chrome.port;
} else {
chromeParams.host = Spiderable.chromeIp;
chromeParams.port = Spiderable.chromePort;
}
CDP(chromeParams, (protocol) => {
// Extract the parts of the DevTools protocol we need for the task.
// See API docs: https://chromedevtools.github.io/debugger-protocol-viewer/
const {Page, Runtime} = protocol;
// First, need to enable the domains we're going to use.
Promise.all([
Page.enable(),
Runtime.enable()
]).then(() => {
Page.navigate({url});
// Wait for window.onload before doing stuff.
Page.loadEventFired(() => {
succeeded = true;
checkIfReady(Runtime, () => {
getHtmlContent(Runtime).then((result) => {
await Page.stopScreencast()
log('We think the page has finished doing what it do. Rendering video.')
log(`Interaction took ${Date.now() - interactionStartTime}ms to finish.`)
} catch (error) {
console.error(error)
}
// @TODO: handle this better —
// If you don't close the tab, an a subsequent Page.navigate() is unable to load the url,
// you'll end up printing a PDF of whatever was loaded in the tab previously
// (e.g. a previous URL) _unless_ you Cdp.New() each time. But still good to close to
// clear up memory in Chrome
try {
log('trying to close tab', tab)
await Cdp.Close({ id: tab.id })
} catch (error) {
log('unable to close tab', tab, error)
}
await client.close()
const renderVideo = async () => {
await new Promise((resolve, reject) => {
const args = [
'-y',
'-loglevel',
'warning', // 'debug',
'-f',
'image2',
'-framerate',
`${options.videoFrameRate}`,
connect: function(options, cb) {
var self = this;
self.options = options;
var client = chrome.createClient();
client.on("error", function(error) {
console.log(error);
});
self.client = client;
if (options.websocket) {
return cb(null, {
url: '',
webSocketDebuggerUrl: options.websocket
});
} else {
client.listTabs(options.host, options.port, function(err, tabs) {
if(err) return cb(err);
// TODO: skip tabs without webSocketDebuggerUrl (likely already being debugged)
cb(null, tabs[0]);
});
}