cyrus-and / chrome-remote-interface Goto Github PK
View Code? Open in Web Editor NEWChrome Debugging Protocol interface for Node.js
License: MIT License
Chrome Debugging Protocol interface for Node.js
License: MIT License
isn't it a consensus since many years back that javascript with
keyword is bad and should be avoided at any time?
https://www.barryvan.com.au/2009/05/avoid-javascripts-with-keyword/
The Sample API usage
section actually reminded me it's still there; for the first time I saw it I almost couldn't understand how did it work, on this line Page.loadEventFired(close);
where is the close
variable from, or is it a magic function, finally I realized it's actually the chrome.close
https://github.com/cyrus-and/chrome-remote-interface#sample-api-usage
it's a bad use case I can make a PR to change it this is agreed.
When I try to use the CSS.toggleProperty
method defined in the Chrome Debugger Protocol Viewer docs, I get an error:
>>> CSS.toggleProperty({ 'styleId': { 'styleSheetId': '56219.1', 'ordinal': 1 }, 'propertyIndex': 1, 'disable': true })
TypeError: CSS.toggleProperty is not a function
at repl:1:5
at REPLServer.defaultEval (repl.js:250:27)
at bound (domain.js:280:14)
at REPLServer.runBound [as eval] (domain.js:293:12)
at REPLServer.<anonymous> (repl.js:412:12)
at emitOne (events.js:82:20)
at REPLServer.emit (events.js:169:7)
at REPLServer.Interface._onLine (readline.js:210:10)
at REPLServer.Interface._line (readline.js:549:8)
at REPLServer.Interface._ttyWrite (readline.js:826:14)
The same happens for DOM.setInspectModeEnabled
.
>>> DOM.setInspectModeEnabled({ 'enabled': true })
TypeError: DOM.setInspectModeEnabled is not a function
at repl:1:5
at REPLServer.defaultEval (repl.js:250:27)
at bound (domain.js:280:14)
at REPLServer.runBound [as eval] (domain.js:293:12)
at REPLServer.<anonymous> (repl.js:412:12)
at emitOne (events.js:82:20)
at REPLServer.emit (events.js:169:7)
at REPLServer.Interface._onLine (readline.js:210:10)
at REPLServer.Interface._line (readline.js:549:8)
at REPLServer.Interface._ttyWrite (readline.js:826:14)
Hi,
This is a question not an issue, so if it's not the right place to post this, sorry.
I'm trying out this piece of code, but I can't figure out how to "wait" for something from the browser.
For example:
I want to go to a url, load a page and wait for something in the console or for an event.
The url is opening, but the nodejs code is immediately closed(which makes sense).
Page.navigate({'url': 'http://mypage.com'});
// how to wait?
This is your sample code:
var Chrome = require('chrome-remote-interface');
Chrome(function (chrome) {
with (chrome) {
Network.requestWillBeSent(function (params) {
console.log(params.request.url);
});
Page.loadEventFired(close);
Network.enable();
Page.enable();
once('ready', function () {
Page.navigate({'url': 'https://github.com'});
//how to wait for a console message or event?
});
}
}).on('error', function () {
console.error('Cannot connect to Chrome');
});
Thanks in advance!
chrome.Page.domContentEventFired(function () {
chrome.DOM.getDocument(function (err, document) {
console.log(document);
});
});
the above code returns:
{
nodeId: 1,
nodeType: 9,
nodeName: '#document',
localName: '',
nodeValue: '',
childNodeCount: 2,
children: [ [Object], [Object] ],
documentURL: 'https://example-url.com/',
baseURL: 'https://example-url.com/',
xmlVersion: ''
}
now that we have root nodeId I would like to search for all img
nodes like so:
chrome.DOM.querySelectorAll({
nodeId: 1,
selector: "img"
}, function (err, nodes) {
console.log(err, nodes);
});
which always returns
true { code: -32000, message: 'Could not find node with given id' }
any help would be greatly appreciated.
node-inspector
spawns debugger protocol compatible API on ws://127.0.0.1:8080/?port=5858
. Path goes where?
I'm using this framework to get data from the profiler but whenever I send Profiler.stop and Profiler.start my callback functions don't get called.
Example:
chrome.send('Profiler.stop', function(){console.log("Stop concluded.");});
Likely this is a stupid error on my side:
For this siimple send the page is reloading but the callback is never called.
What am I doing wrong? Thanks for any feedback.
//Ralf
Page.reload(function(error,response){
console.log(error);
console.log(response);
});
Hi, @cyrus-and I am wondering how to connect mobile chrome within my android device?
I cannot find any clue in the README. Could you advice? thank you.
Hi there,
Not sure if this is a bug but anyways let me put forward what i am trying to do using the interface. Let me know if I am missing anything obvious.
I am trying to automate chrome using webdriver and webdriver opens chrome on any random port, which can not be forced as of now (a bug). I want to read the port it opens the chrome in and pass that to chrome-remote-interface every time. I tried changing the port in defaults.js with the new port after chrome opens but it did not work. Do you have any suggestions in make debugging port dynamic?
Thanks,
Xhings
I am having 200 nw-js instances and every instance has a different port. I am connecting with this library to them dependent on port. The issue is, that I cannot have more then 115 connections opened.
Is there some sort of a limit on the library?
We know it is not the hardware, we still have a lot in reserve.
In the Edge Diagnostics Adaptor we have added new HTTP endpoint that allows clients to fetch the protocol.json
on demand.
I propose that the client will try to fetch it from this endpoint if /json/version
provides to be Edge
, and otherwise fallback to the Chrome specific repo.
API: https://github.com/Microsoft/edge-diagnostics-adaptor/wiki/HTTP-endpoint
recently I found fetching protocol failed with this; so the protocol.json
has divided into 2 parts, maybe here just need to switch to the browser_protocol.json
?
➸ curl -s 'https://chromium.googlesource.com/chromium/src/+/84cc4cdf21633b6209f2561e78fea87d40e84329/third_party/WebKit/Source/devtools/protocol.json?format=TEXT'
VGhlIHByb3RvY29sLmpzb24gaGFzIHNwbGl0IGludG8gc2VwYXJhdGUgZmlsZXMuIGh0dHBzOi8vY3JidWcuY29tLzU4MDMzNwoKT25lIGZvciB0aGUgYnJvd3Nlciwgb25lIGZvciBhIFY4IGphdmFzY3JpcHQgZW52aXJvbm1lbnQ6CiAgICBzcmMvdGhpcmRfcGFydHkvV2ViS2l0L1NvdXJjZS9jb3JlL2luc3BlY3Rvci9icm93c2VyX3Byb3RvY29sLmpzb24KICAgIHNyYy90aGlyZF9wYXJ0eS9XZWJLaXQvU291cmNlL3BsYXRmb3JtL3Y4X2luc3BlY3Rvci9qc19wcm90b2NvbC5qc29uCgpCcm93c2FibGUgaGVyZToKICAgIGh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMvKy9tYXN0ZXIvdGhpcmRfcGFydHkvV2ViS2l0L1NvdXJjZS9jb3JlL2luc3BlY3Rvci9icm93c2VyX3Byb3RvY29sLmpzb24KICAgIGh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMvKy9tYXN0ZXIvdGhpcmRfcGFydHkvV2ViS2l0L1NvdXJjZS9wbGF0Zm9ybS92OF9pbnNwZWN0b3IvanNfcHJvdG9jb2wuanNvbgoKTW9yZSBkZXRhaWxzIG9uIHRoZSBwcm90b2NvbDoKICAgIGh0dHBzOi8vZGV2ZWxvcGVyLmNocm9tZS5jb20vZGV2dG9vbHMvZG9jcy9kZWJ1Z2dlci1wcm90b2NvbAo=
➸ node -p 'Buffer.from("VGhlIHByb3RvY29sLmpzb24gaGFzIHNwbGl0IGludG8gc2VwYXJhdGUgZmlsZXMuIGh0dHBzOi8vY3JidWcuY29tLzU4MDMzNwoKT25lIGZvciB0aGUgYnJvd3Nlciwgb25lIGZvciBhIFY4IGphdmFzY3JpcHQgZW52aXJvbm1lbnQ6CiAgICBzcmMvdGhpcmRfcGFydHkvV2ViS2l0L1NvdXJjZS9jb3JlL2luc3BlY3Rvci9icm93c2VyX3Byb3RvY29sLmpzb24KICAgIHNyYy90aGlyZF9wYXJ0eS9XZWJLaXQvU291cmNlL3BsYXRmb3JtL3Y4X2luc3BlY3Rvci9qc19wcm90b2NvbC5qc29uCgpCcm93c2FibGUgaGVyZToKICAgIGh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMvKy9tYXN0ZXIvdGhpcmRfcGFydHkvV2ViS2l0L1NvdXJjZS9jb3JlL2luc3BlY3Rvci9icm93c2VyX3Byb3RvY29sLmpzb24KICAgIGh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMvKy9tYXN0ZXIvdGhpcmRfcGFydHkvV2ViS2l0L1NvdXJjZS9wbGF0Zm9ybS92OF9pbnNwZWN0b3IvanNfcHJvdG9jb2wuanNvbgoKTW9yZSBkZXRhaWxzIG9uIHRoZSBwcm90b2NvbDoKICAgIGh0dHBzOi8vZGV2ZWxvcGVyLmNocm9tZS5jb20vZGV2dG9vbHMvZG9jcy9kZWJ1Z2dlci1wcm90b2NvbAo=", "base64").toString()'
The protocol.json has split into separate files. https://crbug.com/580337
One for the browser, one for a V8 javascript environment:
src/third_party/WebKit/Source/core/inspector/browser_protocol.json
src/third_party/WebKit/Source/platform/v8_inspector/js_protocol.json
Browsable here:
https://chromium.googlesource.com/chromium/src/+/master/third_party/WebKit/Source/core/inspector/browser_protocol.json
https://chromium.googlesource.com/chromium/src/+/master/third_party/WebKit/Source/platform/v8_inspector/js_protocol.json
More details on the protocol:
https://developer.chrome.com/devtools/docs/debugger-protocol
C:\Windows\system32>npm install -g chrome-remote-interface
C:\Program Files (x86)\Google\Chrome\Application>chrome --remote-debugging-port=9222
C:\Windows\system32>chrome-remote-interface inspect --host localhost --port 9222
Cannot connect to Chrome: Error: socket hang up
C:\Windows\system32>node -v
v6.9.1
C:\Windows\system32>npm -v
3.10.8
C:\Windows\system32>git --version
git version 2.10.1.windows.1
Browser: Chrome/54.0.2840.71
Microsoft Windows: Version 10.0.10586
I am having 200 nw-js instances and every instance has a different port. I am connecting with this library to them dependent on port. The issue is, that I cannot have more then 113-115 connections opened.
Is there some sort of a limit on the library?
We know it is not the hardware, we still have a lot in reserve.
Hi there,
I am trying to access the SystemInfo
through the chrome-remote-interface, and when running the code snippet pasted below I get the following return values:
returnValue1 = true
returnValue2 = { code: -32601, message: '\'SystemInfo.getInfo\' wasn\'t found' }
While I understand that systemInfo
is experimental currently in the tip-of-tree API, I am trying to figure out if the returned error is from the chrome-remote-interface, or from the remote debugging protocol itself as I had hard time tracking down this error code in either..
My hunch is the later, but just wanted to confirm. Any info you could provide here would be greatly appreciated. Thanks again.
Code Snippet ran to gather SystemInfo..
var Chrome = require('chrome-remote-interface');
Chrome(function (chrome) {
with (chrome) {
Page.enable();
Page.navigate({'url': 'http://example.com'});
Page.loadEventFired(function () {
SystemInfo.getInfo(function(returnValue1, returnValue2, returnValue3) {
console.log(returnValue1, returnValue2, returnValue3);
close();
});
});
}
}).on('error', function (e) {
console.error('Cannot connect to Chrome', e);
});
When page is ready, I do Page.navigate({ url: new-url }) and then I try to evaluate code, but unfortunately I get an error:
/nwjs-ui-testing/node_modules/chrome-remote-interface/node_modules/ws/lib/WebSocket.js:219
else throw new Error('not opened');
^
Error: not opened
at WebSocket.send (/nwjs-ui-testing/node_modules/chrome-remote-interface/node_modules/ws/lib/WebSocket.js:219:16)
at Chrome.send (/nwjs-ui-testing/node_modules/chrome-remote-interface/lib/chrome.js:199:13)
at Object.self.(anonymous function).(anonymous function) [as evaluate] (/nwjs-ui-testing/node_modules/chrome-remote-interface/lib/chrome.js:227:14)
at evalFindPos (/wjs-ui-testing/test.js:56:16)
at nextTask (/nwjs-ui-testing/node_modules/async/dist/async.js:3921:18)
at Object.waterfall (/nwjs-ui-testing/node_modules/async/dist/async.js:3924:9)
at getElementPosition (/nwjs-ui-testing/test.js:52:8)
at null.<anonymous> (/nwjs-ui-testing/test.js:32:26)
at wrapper [as _onTimeout] (timers.js:265:14)
at Timer.listOnTimeout `(timers.js:110:15)
Browser and page are opened, what could be the reason for this issue?
//my test method
private static void Test()
{
try
{
string url = "ws://localhost:9222/devtools/page/66CB09FA-3637-4C41-A1D8-DC4A3EDE428D";//url is ok,point to a chrome process with debug port 9222.
ChromeSessionFactory sf = new ChromeSessionFactory();
IChromeSession chromeSession = sf.Create(url);
var x = chromeSession.SendAsync<GetDocumentCommand>().Result;
var y = x as CommandResponse<GetDocumentCommandResponse>;
//here ,y.Resut=null,y.Method=null。but y.Id has value.
WriteMessage(y.Result, "GetDocumentCommand=");
}
catch (Exception exp) { Console.WriteLine("exception="+exp.Message); }
Console.ReadKey();
}
I fix this , But I don't know why this happend, Is other where influence by this error?
1.open ChromeProcessFactory.cs
2. add some code into "Create" method as follow:
public ICommandResponse Create(string responseText)
{
var jObject = JObject.Parse(responseText);
if (null != jObject["error"])
{
return jObject.ToObject();
}
var methodString = GetMethod(jObject);
if (null == methodString)
{
return null;
}
var typeInferredFromMethod = _methodTypeMap.GetCommandResponse(methodString);
if (null == typeInferredFromMethod)
{
return null;
}
var genericEventType = typeof(CommandResponse<>);
var commandResponseType = genericEventType.MakeGenericType(typeInferredFromMethod);
var result = jObject.ToObject(commandResponseType);//here,don't know why: result.Result=null,result.Method=null
//new code begin
var cqs_r = jObject.GetValue("result");
var cqs_o = cqs_r.ToObject(typeInferredFromMethod);
commandResponseType.GetProperty("Result").SetValue(result, cqs_o);
commandResponseType.GetProperty("Method").SetValue(result, methodString);
//new code end
return result as ICommandResponse;
}
Is there any possibility of splitting this up so that chrome-remote-interface is just an npm package containing the library only? i.e. get rid of the repl client and move it into a separate npm package which depends on this one?
For tools that are controlling DevTools directly, having the repl client built into this package doesn't make much sense.
http://src.chromium.org/viewvc/blink/trunk/Source/devtools/protocol.json
Currently we use Inspector.json from webkit source. It seems that chrome version includes lots of devtools methods/events missing in webkit's one.
need to update Inspector.json to protocol.json + link in checkout script
My use case: tried to find documentation for inspectNodeRequested
I am trying to inject the html from another page into a blank tab. Below is the code I am trying to use to do so. When I put a simple element <div>something</div>
the script works as expected. However when I use something more complex, like the body below, it fails silently. Any thoughts?
Chrome.New(() => {
Chrome((chromeInstance: any) => {
chromeInstance.Runtime.evaluate({
'expression': `document.getElementsByTagName('html')[0].innerHTML = ${body}`
}, function (error: any, params: any) {
if (!error) {
imageExport(chromeInstance, res, {})
}
});
});
})
const body = `
<script async="" src="//www.google-analytics.com/analytics.js"></script><script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-9369909-101', 'auto');
ga('send', 'pageview');
</script>
<div class="top-bar">The one and only Goat.com<div class="visible-xs"><br></div><div class="hidden-xs"> - </div>is available <a href="https://domainnamesales.com/domain/goat.com" target="_blank">For Lease</a></div>
<h1>Goat.com</h1>
<div class="goat-holder">
<img src="assets/img/goat.png" alt="Greatest of All Time" onclick="document.getElementById('goatPlay').play()">
</div>
<div id="beaver" style="bottom: -10px;">
<a href="http://beaver.com" target="_blank">
<img src="assets/img/beaver-canada.png" alt="beaver.com">
</a>
</div>
<audio id="goatPlay" autoplay="">
<source src="assets/audio/wav/goat.wav" id="wavSource" type="audio/wav">
<source src="assets/audio/mp3/goat.mp3" id="mp3Source" type="audio/mpeg">
<source src="assets/audio/ogg/goat.ogg" id="oggSource" type="audio/ogg">
Your browser does not support the audio element.
</audio>
<script src="bower_components/jquery/dist/jquery.min.js"></script>
<script src="assets/js/main.js"></script>
`
I am pasting an error, don't know exactly how this happened.
/app/node_modules/chrome-remote-interface/lib/chrome.js:60
callback();
^
TypeError: callback is not a function
at WebSocket. (/app/node_modules/chrome-remote-interface/lib/chrome.js:60:13)
at WebSocket.g (events.js:286:16)
at emitTwo (events.js:106:13)
at WebSocket.emit (events.js:191:7)
at WebSocket.cleanupWebsocketResources (/app/node_modules/ws/lib/WebSocket.js:950:8)
at emitNone (events.js:91:20)
at Socket.emit (events.js:185:7)
at endReadableNT (_stream_readable.js:926:12)
at _combinedTickCallback (internal/process/next_tick.js:74:11)
at process._tickCallback (internal/process/next_tick.js:98:9)
(node:84862) fs: re-evaluating native module sources is not supported. If you are using the graceful-fs module, please update it to a more recent version.
List tabs (as a copy from connection phase or as a new http request) and switch to a new connection.
What do you think.. if we allowed a means for you to grab the current protocol directly from Chrome?
Is there any plans to support safari webviews inspection support like iwdp?
chrome.Console.enable();
chrome.Page.enable();
chrome.Console.clearMessages();
Even if I put clearMessages before Console.enable, it still doesnt clear them.
Is there a way to abort certain requests? ( based on the url for example )
So we can block unnecessary ads and images loading in a "headless" browser...
There is the requestWillBeSent
hook, but I didn't figure out any way to abort the request.
Thanks.
inspired from https://github.com/cyrus-and/chrome-har-capturer/blob/a62406a5a32bb6a4ef0b5fbcc8e64fd6dba78552/lib/client.js#L82
the following:
chromeInstance.Runtime.evaluate({expression: CLEANUP_SCRIPT})
will pass the following error to the 2nd argument of the callback or to a .then
{ result:
{ type: 'object',
subtype: 'error',
className: 'ReferenceError',
description: 'ReferenceError: chrome is not defined\n at <anonymous>:1:1',
objectId: '{"injectedScriptId":1,"id":1}' },
exceptionDetails:
{ exceptionId: 1,
text: 'Uncaught',
lineNumber: 0,
columnNumber: 0,
scriptId: '30',
exception:
{ type: 'object',
subtype: 'error',
className: 'ReferenceError',
description: 'ReferenceError: chrome is not defined\n at <anonymous>:1:1',
objectId: '{"injectedScriptId":1,"id":2}' } } }
I'd like to be able to connect to android device without intermediate local port-forwarding adb server. With https://github.com/sidorares/node-adbhost a can create duplex node stream connected to chrome devtools on android device.
From initial research it looks like it's possible to pass custom Agent as an option to ws client, which should use android-connected stream instead of creating new tcp socket from url parameter.
Now that we have multiple adaptors, http://remotedebug.org/adaptors/, in place for RemoteDebug, which all use the chrome remote debugging protocol, I was considering writing a Promise-based node client, as the "official RemoteDebug client", ala webdriver.io
Since you already did most of the work I'm thinking if you were interesting in collaborating? To me it's mostly a naming thing, as it doesn't make sense to use a "chrome client" when talking to IE11 via an adapter.
Unfortunattly I don't know how this error was produced, only that it was logged in exceptions and I thought you may want to know about it.
/chrome-remote-interface/lib/devtools.js:23:25","
at /chrome-remote-interface/lib/devtools.js:94:13","
at IncomingMessage.<anonymous> (/chrome-remote-interface/lib/devtools.js:142:17)","
at emitNone (events.js:85:20)","
at IncomingMessage.emit (events.js:179:7)","
at endReadableNT (_stream_readable.js:913:12)","
at _combinedTickCallback (internal/process/next_tick.js:74:11)","
at process._tickCallback (internal/process/next_tick.js:98:9)"],"level":"error","message":"uncaughtException: Cannot read property 'startsWith' of undefined","timestamp":"2016-06-14T04:45:55.134Z"}
I tried to analysis layer memory using cri. I have not found method that return layerid in protocol.json. How can i get a LayerID?
Thank you.
Is it possible to have a function setCookie that will allow us to set Cookie (https://chromedevtools.github.io/debugger-protocol-viewer/1-1/Page/#type-Cookie)
Hi,
I used this interface with success in a ubuntu based docker container.
I've upgraded now the system to the latest docker version and I have this error...
ReferenceError: Promise is not defined. See bellow
Not sure where to start... Or what is the cause of this. Any ideas?
root@b17e220955cf:/producer# node /scripts/capture-test.js
/node_modules/chrome-remote-interface/lib/chrome.js:42
return new Promise(function (fulfill, reject) {
^
ReferenceError: Promise is not defined
at Chrome.send (/node_modules/chrome-remote-interface/lib/chrome.js:42:20)
at Object.handler [as enable] (/node_modules/chrome-remote-interface/lib/chrome.js:108:21)
at EventEmitter.<anonymous> (/scripts/capture-test.js:9:17)
at EventEmitter.emit (events.js:95:17)
at WebSocket.<anonymous> (/node_modules/chrome-remote-interface/lib/chrome.js:251:23)
at WebSocket.EventEmitter.emit (events.js:92:17)
at WebSocket.establishConnection (/node_modules/chrome-remote-interface/node_modules/ws/lib/WebSocket.js:887:8)
at ClientRequest.upgrade (/node_modules/chrome-remote-interface/node_modules/ws/lib/WebSocket.js:778:25)
at ClientRequest.g (events.js:180:16)
at ClientRequest.EventEmitter.emit (events.js:106:17)
capture-test.js - contains your sample API usage code. Copy pasted.
I see you have a test for this very case, but I am still getting some issues where I am closing a connection and opening a new one in my test suite, and it has issues sometimes.
I'm not sure what the root cause is, the only thing I can think is it isn't completely finished closing before starting to open a new connection. Since it also removes all listeners when calling chrome.close()
, I can't add my own to the websocket.
I'm bypassing that method and just using this for now:
closeConnection(){
return new Promise((resolve, reject) => {
this.chrome.ws.onclose = function(event){
event.target.removeAllListeners();
resolve(true);
}
this.chrome.ws.close();
});
}
Would you be interested in a pull request adding a promise/callback to chrome.close()
?
When trying to get body of a request, body is always boolean and base64Encoded is the body response.
Body: false
base64Encoded: { body: '<html><body style="margin:0;padding:0"></body></html>',
base64Encoded: false }
Hi there,
I am currently running into errors when trying to connect the chrome-remote-interface module to the debug server running on 'http://localhost:9222/' when it has been started with the iOS WebKit Debug Proxy.
I feel this might be a compatibility issue but just wanted to confirm that I am not missing anything obvious here, since to my understanding the iOS WebKit Debug Proxy uses the Chrome Remote Debugging Protocol and therefore the chrome-remote-interface should be able to connect. Also confirming that I can open the Dev Tools Frontend Url and see the proper network requests from my local iPhone simulator being emitted, so I know that this part is working as expected.
When running this code:
var chrome = require('chrome-remote-interface')
var url = 'https://github.com/'
var options = {
chooseTab: function(tabs) {
var targetTab = tabs.filter(function(tab) {
return tab.url == url
})
if(targetTab.length) {
return tabs.indexOf(targetTab[0])
}
return 0
}
}
chrome(options, function(client) {
console.log('Connected!');
client.Page.enable();
client.once('ready', function () {
client.Page.navigate({
'url': 'https://github.com'
});
});
}).on('error', function(err) {
console.error('Cannot connect to IOS:');
console.log(err);
});
I get this error (with no other console messages, it does not make it to the callback):
[Error: <html><title>Error 404 (Not Found)</title>
<p><b>404.</b> <ins>That's an error.</ins>
<p>The requested URL <code>/json/list</code> was not found.
</html>]
I seems the root of the issue is that the debug server for iwdp returns a 404 error when visiting route 'json/list'.
My main question is, should iwdp be providing the route 'json/list' for the chrome-remote-interface to be able to connect, or am I missing something else in setting up this connection?
Thanks again for your help here.
if (message.result) {
callback(false, message.result);
} else if (message.error) {
callback(true, message.error);
}
For Debugger.stepInto()
the resulting promise is neither fulfilled nor rejected, because server replies with {id: #}
return object. Tested for node-inspector
.
Hello,
I guess chrome-remote-interface needs an update, now version 1.1 supports doing some Input (keystrokes and mouse clicks).
https://developers.google.com/chrome-developer-tools/docs/protocol/1.1/
Thank you
While the event "Debugger.scriptParsed" is correctly handled, getScriptSource() always returns "undefined" value.
I guess I was invoking the method (getScriptSource()) in a wrong way as inspector.js of blink is calling the getScriptSource() via DebuggerAgent, which seems to be the wrapper of Debugger interface.
var spawn=require('child_process').spawn;
var Chrome = require('chrome-remote-interface');
var initWaitTime = 2000;
var ChromePath = "/usr/bin/chromium-browser";
function runChrome(extensionDir) {
var args = [];
args.push("--remote-debugging-port=9222");
args.push("--user-data-dir=remote-profile");
args.push("-no-default-browser-check");
spawn(ChromePath, args)
};
function runChromeDebugger(urlToVisit) {
console.log("runChromeDebugger");
options = {};
Chrome(options, function (chrome) {
with (chrome) {
on('Debugger.scriptParsed', function (msg) {
console.log("==================================");
console.log(JSON.stringify(msg));
console.log("scriptParsed scriptId: " + msg.scriptId); // scriptId is correctly returned
var ssrc = chrome.Debugger.getScriptSource({'scriptId':msg.scriptId});
console.log("scriptSource :" + ssrc); // bug? always undefined
});
Page.enable();
Debugger.enable();
Page.navigate({'url': urlToVisit});
console.log("[*] opened [" + urlToVisit + "]");
}
}).on('error', function () {
console.error('Cannot connect to Chrome');
});
}
if (require.main == module) {
runChrome("/home/blee/project/chrome-extension-integrity/sample/buzzdoc");
var urlToVisit = "http://google.com"
setTimeout(function() {runChromeDebugger(urlToVisit)}, initWaitTime);
}
I would like to get the body or a response, but callback is never called.
Network.getResponseBody('21842.39', function (body, base64Encoded) {});
Am I doing something wrong?
Is it possible to connect to multiple chromium windows at the same time? Now we connect to a chromium browser through --remote-debugging-port, and we would like to run multiple evaluation tests on multiple windows at the same time.
Any suggestions?
Hello "cyrus-and",
I am trying to catch the event when an existing remote chrome debugger session is terminated because the user opened in the tab the chrome developer tools.
chrome.Inspector.enable();
chrome.Page.enable();
chrome.once('ready', function() {
chrome.on('event', function (message) {
console.log("chrome event:"+JSON.stringify(message));
});
chrome.Inspector.detached(function(response){
console.log('Inspector for tab detached');
});
});
This code will capture events like "Page.loadEventFired" without any issue but it will never capture "Inspector.detached".
I am using "chrome-remote-interface": "^0.12.3", thank you for your help.
For reference:
Upon disconnnection, the outgoing client will receive a detached event. For example: {"method":"Inspector.detached","params":{"reason":"replaced_with_devtools"}}
From: https://developer.chrome.com/devtools/docs/debugger-protocol
We at Microsoft has now made it possible to debug Microsoft Edge via Edge Diagnostics Adaptor over the Chrome Debugging Protocol.
It has a protocol.json
file which could be fetched from the repo at https://github.com/Microsoft/edge-diagnostics-adaptor/blob/master/protocol.json, or we could add an HTTP endpoint to fetch it from something like /json/protocol
directly from the adaptor.
We think it cold be exciting to have this library working with multiple browsers supporting the Chrome Debugging Protocol.
Are you interested in collaboration?
How would someone change user agent of the browser?
'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)'
Here's a fun one. Trying to console.log
the chrome instance throws an error
Chrome(function (chrome) {
console.log(chrome);
})
In node, if you console.log an object that has a property named inspect
with a function as the value, it will try to call that function (source code, documentation).
Anyways, in the case of this library, chrome.Inspector.inspect
happens to be a function so trying to console.log the chrome instance will call that function as it recurses through the properties. This results in an error being thrown because chrome.Inspector.inspect
expects to get an event handler as an argument.
TypeError: listener must be a function
at TypeError (native)
at Chrome.addListener (events.js:142:11)
at Object.self.(anonymous function).(anonymous function) [as inspect] (.../node_modules/chrome-remote-interface/lib/chrome.js:163:14)
...
Hello, how can I connect to the chrome in the phone via usb or emulator android on hyper-v?
Now when I want to connect to multiple chromium instances in one file, only the last connect works, all other are returning
Cannot connect to Chrome { [Error: connect ECONNREFUSED]
code: 'ECONNREFUSED',
errno: 'ECONNREFUSED',
syscall: 'connect' }
Is there a way to connect to multiple chromium instances at the same time?
Hello,
It happens that a document returns a font element
This occurs when there will be two or more inspectors, how to choose the right?
chrome.DOM.getDocument(function (error, params) {
console.log(error, params);
chrome.DOM.querySelectorAll({
'nodeId': params.root.nodeId,
'selector': 'img'
}, function (error, params) {
console.log(params);
chrome.close();
});
});
{ root:
{ nodeId: 1,
nodeType: 9,
nodeName: '#document',
localName: '',
nodeValue: '',
childNodeCount: 1,
children: [ [Object] ],
documentURL: 'https://fonts.googleapis.com/css?family=Roboto:400,300,500,700|Neucha&subset=latin,greek,cyrillic,greek-ext,cyrillic-ext,latin-ext',
baseURL: 'https://fonts.googleapis.com/css?family=Roboto:400,300,500,700|Neucha&subset=latin,greek,cyrillic,greek-ext,cyrillic-ext,latin-ext',
xmlVersion: '' } }
I am having 200 nw-js instances and every instance has a different port. I am connecting with this library to them dependent on port. The issue is, that I cannot have more then 115 connections opened.
Is there some sort of a limit on the library?
We know it is not the hardware, we still have a lot in reserve.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.