Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

The underlying protocol data in CDP is sent with an error when the type is MethodDestination::Target. #435

Open
ImmortalD opened this issue Nov 8, 2023 · 0 comments

Comments

@ImmortalD
Copy link

I compared the data sent by chromedp at the underlying level and found that there is an error in the handling by handless-chrome when the type is MethodDestination::Target. The data comparison is as follows.

chromedp data:

-> {"id":3,"sessionId":"1BA8CA430D6B3C717038B13FCB3808BE","method":"Runtime.enable"}
-> {"id":4,"sessionId":"1BA8CA430D6B3C717038B13FCB3808BE","method":"Runtime.evaluate","params":{"expression":"self"}}
-> {"id":5,"sessionId":"1BA8CA430D6B3C717038B13FCB3808BE","method":"Log.enable"}
-> {"id":6,"sessionId":"1BA8CA430D6B3C717038B13FCB3808BE","method":"Network.enable","params":{}}
-> {"id":7,"sessionId":"1BA8CA430D6B3C717038B13FCB3808BE","method":"Inspector.enable"}
-> {"id":8,"sessionId":"1BA8CA430D6B3C717038B13FCB3808BE","method":"Page.enable"}
-> {"id":9,"sessionId":"1BA8CA430D6B3C717038B13FCB3808BE","method":"DOM.enable","params":{}}
-> {"id":10,"sessionId":"1BA8CA430D6B3C717038B13FCB3808BE","method":"CSS.enable"}
-> {"id":11,"sessionId":"1BA8CA430D6B3C717038B13FCB3808BE","method":"Target.setDiscoverTargets","params":{"discover":true}}
-> {"id":12,"sessionId":"1BA8CA430D6B3C717038B13FCB3808BE","method":"Target.setAutoAttach","params":{"autoAttach":true,"waitForDebuggerOnStart":false,"flatten":true}}
-> {"id":13,"sessionId":"1BA8CA430D6B3C717038B13FCB3808BE","method":"Page.setLifecycleEventsEnabled","params":{"enabled":true}}
-> {"id":14,"sessionId":"1BA8CA430D6B3C717038B13FCB3808BE","method":"Fetch.enable","params":{"patterns":[{"urlPattern":"*.js"}]}}
-> {"id":15,"sessionId":"1BA8CA430D6B3C717038B13FCB3808BE","method":"Network.setBypassServiceWorker","params":{"bypass":true}}
-> {"id":16,"sessionId":"1BA8CA430D6B3C717038B13FCB3808BE","method":"Page.navigate","params":{"url":"https://github.com"}}

modify headless-chrome code:
https://github.com/rust-headless-chrome/rust-headless-chrome/blob/main/src/browser/transport/mod.rs#L140-L156

        match destination {
            MethodDestination::Target(session_id) => {
                println!("--> {}", message_text);    // modify here !  add log
                let message = message_text.clone();
                let target_method = Target::SendMessageToTarget {
                    target_id: None,
                    session_id: Some(session_id.0),
                    message,
                };
                trace!(
                    "Msg to tab: {}",
                    message_text.chars().take(300).collect::<String>()
                );
                if let Err(e) = self.call_method_on_browser(target_method) {
                    warn!("Failed to call method on browser: {:?}", e);
                    self.waiting_call_registry.unregister_call(call.id);
                    trace!("Unregistered callback: {:?}", call.id);
                    return Err(e);
                }
            }

            MethodDestination::Browser => {
                println!("-> {}", message_text);   // modify here !  add log
                if let Err(e) = self.web_socket_connection.send_message(&message_text) {
                    self.waiting_call_registry.unregister_call(call.id);
                    return Err(e);
                }
                trace!("sent method call to browser via websocket");
            }
        }

handless-chrome data:

-> {"method":"Target.setDiscoverTargets","id":0,"params":{"discover":true}}
-> {"method":"Target.createTarget","id":1,"params":{"url":"about:blank"}}
-> {"method":"Target.attachToTarget","id":2,"params":{"targetId":"FB9F6999A5BEC7F7FE04DAAB609996F5"}}
--> {"method":"Page.enable","id":3,"params":null}
-> {"method":"Target.sendMessageToTarget","id":4,"params":{"message":"{\"method\":\"Page.enable\",\"id\":3,\"params\":null}","sessionId":"E42FB4211052EAB4B0D1E8CEE726C87D"}}
--> {"method":"Page.setLifecycleEventsEnabled","id":5,"params":{"enabled":true}}
-> {"method":"Target.sendMessageToTarget","id":6,"params":{"message":"{\"method\":\"Page.setLifecycleEventsEnabled\",\"id\":5,\"params\":{\"enabled\":true}}","sessionId":"E42FB4211052EAB4B0D1E8CEE726C87D"}}
--> {"method":"DOM.enable","id":7,"params":null}
-> {"method":"Target.sendMessageToTarget","id":8,"params":{"message":"{\"method\":\"DOM.enable\",\"id\":7,\"params\":null}","sessionId":"E42FB4211052EAB4B0D1E8CEE726C87D"}}
--> {"method":"CSS.enable","id":9,"params":null}
-> {"method":"Target.sendMessageToTarget","id":10,"params":{"message":"{\"method\":\"CSS.enable\",\"id\":9,\"params\":null}","sessionId":"E42FB4211052EAB4B0D1E8CEE726C87D"}}
-> {"method":"Target.createTarget","id":11,"params":{"url":"about:blank","width":1024,"height":800}}
-> {"method":"Target.attachToTarget","id":12,"params":{"targetId":"6A1E1A0D64290919A3E0CE57CFE0B648"}}
--> {"method":"Page.enable","id":13,"params":null}
-> {"method":"Target.sendMessageToTarget","id":14,"params":{"message":"{\"method\":\"Page.enable\",\"id\":13,\"params\":null}","sessionId":"F4A5DF92E336C6BB45F3B85AC79EFB07"}}
--> {"method":"Page.setLifecycleEventsEnabled","id":15,"params":{"enabled":true}}
-> {"method":"Target.sendMessageToTarget","id":16,"params":{"message":"{\"method\":\"Page.setLifecycleEventsEnabled\",\"id\":15,\"params\":{\"enabled\":true}}","sessionId":"F4A5DF92E336C6BB45F3B85AC79EFB07"}}
--> {"method":"Log.enable","id":17,"params":null}
-> {"method":"Target.sendMessageToTarget","id":18,"params":{"message":"{\"method\":\"Log.enable\",\"id\":17,\"params\":null}","sessionId":"F4A5DF92E336C6BB45F3B85AC79EFB07"}}
--> {"method":"Fetch.enable","id":19,"params":{"patterns":[{"urlPattern":"*9898.a45c487b.js","resourceType":"Script","requestStage":"Request"}],"handleAuthRequests":true}}
-> {"method":"Target.sendMessageToTarget","id":20,"params":{"message":"{\"method\":\"Fetch.enable\",\"id\":19,\"params\":{\"patterns\":[{\"urlPattern\":\"*.js\",\"resourceType\":\"Script\",\"requestStage\":\"Request\"}],\"handleAuthRequests\":true}}","sessionId":"F4A5DF92E336C6BB45F3B85AC79EFB07"}}
--> {"method":"Network.setBypassServiceWorker","id":21,"params":{"bypass":true}}
-> {"method":"Target.sendMessageToTarget","id":22,"params":{"message":"{\"method\":\"Network.setBypassServiceWorker\",\"id\":21,\"params\":{\"bypass\":true}}","sessionId":"F4A5DF92E336C6BB45F3B85AC79EFB07"}}

When comparing the last two lines of headless-chrome with the last line of chromedp, it is clear that headless-chrome only needs to add the sessionId field, while in reality, the JSON data is wrapped with an additional layer. causing some function calls to be ineffective , eg: #429

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant