hardkoded / puppeteer-sharp

Headless Chrome .NET API
https://www.puppeteersharp.com
MIT License
3.36k stars 440 forks source link

Send direct messages #2638

Open bambinorest1 opened 4 months ago

bambinorest1 commented 4 months ago

What if i want to use Storage domain directly https://chromedevtools.github.io/devtools-protocol/tot/Storage/. It seems to me that at the moment direct SendAsync messages can be sent linked to a specific session id. But Storage for example i'snt linked to session id

kblok commented 4 months ago

What do you get if you make a call from a session?

bambinorest1 commented 4 months ago

What do you get if you make a call from a session?

For example method https://chromedevtools.github.io/devtools-protocol/tot/Storage/#method-clearCookies takes optional argument browserContextId, how could it bind to session?

kblok commented 4 months ago

@bambinorest1 you have the BrowserContext.Id

bambinorest1 commented 4 months ago

@bambinorest1 you have the BrowserContext.Id

I still don’t understand why you think that I should call methods from the Storage domain from the session?? Some methods from Storage, it seemed to me, do not work locally with one page or other similar target that can linked to session, but work globally with the entire browser.

kblok commented 4 months ago

@bambinorest1 you have the BrowserContext.Id

I still don’t understand why you think that I should call methods from the Storage domain from the session?? Some methods from Storage, it seemed to me, do not work locally with one page or other similar target that can linked to session, but work globally with the entire browser.

Did you at least give it a try? I could expose the Connection from the Context. But you might need to wait for a new version.

bambinorest1 commented 4 months ago

Did you at least give it a try?

Yeah, for example this code works:

const WebSocket = require('ws');
const axios = require('axios');

(async () => {
    const response = await axios.get('http://localhost:21316/json');
    const debuggerUrl = response.data[0].webSocketDebuggerUrl;

    const ws = new WebSocket(debuggerUrl);

    ws.on('open', function open() {
        console.log('Connected to the browser');

        const storageMessage = {
            id: 1,
            method: 'Storage.getCookies'
        };
        ws.send(JSON.stringify(storageMessage));
    });

    ws.on('message', function incoming(data) {
        const cookies = JSON.parse(data.toString()).result.cookies;

        for (const cookie of cookies) {
            console.log(cookie);
        }
    });

    ws.on('close', function close() {
        console.log('Disconnected from the browser');
    });

    ws.on('error', function error(err) {
        console.error('WebSocket error:', err);
    });
})();

I could expose the Connection from the Context.

I think this will be useful in many cases