jpramosi / geckordp Goto Github PK
View Code? Open in Web Editor NEWA client implementation of Firefox DevTools over remote debug protocol in python
Home Page: https://jpramosi.github.io/geckordp/
License: MIT License
A client implementation of Firefox DevTools over remote debug protocol in python
Home Page: https://jpramosi.github.io/geckordp/
License: MIT License
I know as per #9 and #10 that there are definitely tab reading methods but is there any way to create new tabs, and further possibly unload or discard those tabs during creation?
For example I'd like to be able to do something like what the does but dynamically ๐
For some examples ideally we could use some of these subsys apis to accomplish this:
Actor.eval()
method allow us to call APIs like this?marionette
has an WindoManagerMixin.open_tab()
which seems to call the "web driver API" underneath which in turn means calling a self._send_message("WebDriver:NewWindow", body)
which is making an underlying protocol request but i have no idea if this protocol or its APIs are accessible over RDP?Probably more discussion / research results to come..
Looking at that method it seems you actually just return None
on failure (which seems semantically confusing as well as not super pythonic) : https://github.com/jpramosi/geckordp/blob/master/geckordp/profile.py#L478
I presume I've got some env setup or firefox thingy done wrong?
Hi, thanks for this very promising tool!
I would be interested in using it for accessibility testing, by using the features available in the accessibility tab of the devtools.
I followed the instructions on the develop section of your readme.md, but I did not succeed to start 2 parallel instances of firefox on Linux and on MacOS.
The issue is that the geckordp profile was not yet created. May I send a PR with some update to the documentation to bring some precisions about this step?
I can do the sync work for using time.sleep and loop to get the results, but still, it will be more nice if you can provide this function built in, thanks!
Keep getting this error after restarted the firefox:
2022-06-03 11:09:24,550 [geckordp][ERROR] - wait_process_loaded(): waiting for process[5876] failed, wait 15 seconds:
process no longer exists (pid=5876)
I want to execute js code in Browser Console(Ctrl+Shift+J) rather than invoke it in single tab, is that possible?
And how can I call the extension API to execute something like localStorage
?
Thanks
Hello, I'm trying to run the cookie_storage.py
example script, but it seems to fail out of the box. Here are the console logs after enabling debug mode:
2023-10-15 23:57:41,394 [geckordp][DEBUG] - wait_process_loaded(): expired=False
2023-10-15 23:57:41,407 [geckordp][DEBUG] - connect():
2023-10-15 23:57:41,407 [geckordp][DEBUG] - __connect(): Queue read task
2023-10-15 23:57:41,407 [geckordp][DEBUG] - __connect(): Run IO loop
2023-10-15 23:57:41,407 [geckordp][DEBUG] - __open_connection(): Try to open connection
2023-10-15 23:57:41,412 [geckordp][DEBUG] - __open_connection(): Start listening
2023-10-15 23:57:41,422 [geckordp][DEBUG] - __read(): message complete (226 == 226)
2023-10-15 23:57:41,422 [geckordp][INFO] - __print_response(): RESPONSE<-
{
"from": "root",
"applicationType": "browser",
"testConnectionPrefix": "server1.conn0.",
"traits": {
"networkMonitor": true,
"resources": {
"extensions-backgroundscript-status": true
},
"workerConsoleApiMessagesDispatchedToMainThread": true
}
}
2023-10-15 23:57:41,422 [geckordp][DEBUG] - __handle_single_request(): response valid, set result
2023-10-15 23:57:41,422 [geckordp][DEBUG] - __sync_send_receive():
2023-10-15 23:57:41,422 [geckordp][INFO] - __send(): REQUEST->
{
"to": "root",
"type": "listTabs"
}
2023-10-15 23:57:41,425 [geckordp][DEBUG] - __read(): message complete (292 == 292)
2023-10-15 23:57:41,425 [geckordp][INFO] - __print_response(): RESPONSE<-
{
"tabs": [
{
"actor": "server1.conn0.tabDescriptor1",
"browserId": 3,
"browsingContextID": 4,
"isZombieTab": false,
"outerWindowID": 8,
"selected": true,
"title": "SameSite Cookies Tester",
"traits": {
"watcher": true,
"supportsReloadDescriptor": true
},
"url": "https://samesitetest.com/cookies/set"
}
],
"from": "root"
}
2023-10-15 23:57:41,425 [geckordp][DEBUG] - __handle_single_request(): response valid, set result
2023-10-15 23:57:41,425 [geckordp][DEBUG] - __sync_send_receive():
2023-10-15 23:57:41,425 [geckordp][INFO] - __send(): REQUEST->
{
"to": "server1.conn0.tabDescriptor1",
"type": "getWatcher",
"isServerTargetSwitchingEnabled": null,
"isPopupDebuggingEnabled": null
}
2023-10-15 23:57:41,428 [geckordp][DEBUG] - __read(): message complete (596 == 596)
2023-10-15 23:57:41,429 [geckordp][INFO] - __print_response(): RESPONSE<-
{
"actor": "server1.conn0.watcher2",
"traits": {
"frame": true,
"process": true,
"worker": true,
"resources": {
"console-message": true,
"css-change": true,
"css-message": true,
"document-event": true,
"Cache": true,
"cookies": true,
"error-message": true,
"extension-storage": true,
"indexed-db": true,
"local-storage": true,
"session-storage": true,
"platform-message": true,
"network-event": true,
"network-event-stacktrace": true,
"reflow": true,
"stylesheet": true,
"source": true,
"thread-state": true,
"server-sent-event": true,
"websocket": true,
"tracing-state": true,
"last-private-context-exit": true
}
},
"from": "server1.conn0.tabDescriptor1"
}
2023-10-15 23:57:41,429 [geckordp][DEBUG] - __handle_single_request(): response valid, set result
2023-10-15 23:57:41,429 [geckordp][DEBUG] - __sync_send_receive():
2023-10-15 23:57:41,429 [geckordp][INFO] - __send(): REQUEST->
{
"to": "server1.conn0.watcher2",
"type": "watchTargets",
"targetType": "frame"
}
2023-10-15 23:57:41,431 [geckordp][DEBUG] - __read(): message complete (33 == 33)
2023-10-15 23:57:41,431 [geckordp][INFO] - __print_response(): RESPONSE<-
{
"from": "server1.conn0.watcher2"
}
2023-10-15 23:57:41,431 [geckordp][DEBUG] - __handle_single_request(): response valid, set result
2023-10-15 23:57:41,431 [geckordp][DEBUG] - __sync_send_receive():
2023-10-15 23:57:41,431 [geckordp][INFO] - __send(): REQUEST->
{
"to": "server1.conn0.watcher2",
"type": "watchResources",
"resourceTypes": [
"cookies"
]
}
2023-10-15 23:57:41,436 [geckordp][DEBUG] - __read(): message complete (384 == 384)
2023-10-15 23:57:41,436 [geckordp][INFO] - __print_response(): RESPONSE<-
{
"type": "resource-available-form",
"resources": [
{
"actor": "server1.conn0.cookies3",
"hosts": {
"https://samesitetest.com": []
},
"traits": {
"supportsAddItem": true,
"supportsRemoveItem": true,
"supportsRemoveAll": true,
"supportsRemoveAllSessionCookies": true
},
"resourceType": "cookies",
"resourceId": "cookies-2147483650",
"resourceKey": "cookies",
"browsingContextID": 4
}
],
"from": "server1.conn0.watcher2"
}
2023-10-15 23:57:41,436 [geckordp][DEBUG] - __handle_events(): [server1.conn0.watcher2][resource-available-form] handled
2023-10-15 23:57:41,436 [geckordp][DEBUG] - __read(): message complete (33 == 33)
2023-10-15 23:57:41,436 [geckordp][INFO] - __print_response(): RESPONSE<-
{
"from": "server1.conn0.watcher2"
}
2023-10-15 23:57:41,437 [geckordp][DEBUG] - __handle_single_request(): response valid, set result
2023-10-15 23:57:41,437 [geckordp][DEBUG] - __sync_send_receive():
2023-10-15 23:57:41,437 [geckordp][INFO] - __send(): REQUEST->
{
"to": "server1.conn0.cookies3",
"type": "getStoreObjects",
"host": "https://samesitetest.com",
"names": null,
"options": {}
}
2023-10-15 23:57:41,438 [geckordp][DEBUG] - __read(): message complete (181 == 181)
2023-10-15 23:57:41,438 [geckordp][INFO] - __print_response(): RESPONSE<-
{
"from": "server1.conn0.cookies3",
"error": "TypeError",
"message": "sessionString is undefined",
"fileName": "resource://devtools/shared/natural-sort.js",
"lineNumber": 50,
"columnNumber": 5
}
2023-10-15 23:57:41,438 [geckordp][DEBUG] - __handle_single_request(): response valid, set result
2023-10-15 23:57:41,438 [geckordp][ERROR] - __sync_send_receive(): Error on request:
{'to': 'server1.conn0.cookies3', 'type': 'getStoreObjects', 'host': 'https://samesitetest.com', 'names': None, 'options': {}}
{
"from": "server1.conn0.cookies3",
"error": "TypeError",
"message": "sessionString is undefined",
"fileName": "resource://devtools/shared/natural-sort.js",
"lineNumber": 50,
"columnNumber": 5
}
{
"from": "server1.conn0.cookies3",
"error": "TypeError",
"message": "sessionString is undefined",
"fileName": "resource://devtools/shared/natural-sort.js",
"lineNumber": 50,
"columnNumber": 5
}
2023-10-15 23:57:41,438 [geckordp][DEBUG] - __sync_send_receive():
2023-10-15 23:57:41,438 [geckordp][INFO] - __send(): REQUEST->
{
"to": "server1.conn0.cookies3",
"type": "editItem",
"data": {
"host": "https://samesitetest.com",
"key": "uniqueKey",
"field": "value",
"oldValue": "",
"newValue": "my_new_value",
"items": {}
}
}
2023-10-15 23:57:41,439 [geckordp][DEBUG] - __read(): message complete (33 == 33)
2023-10-15 23:57:41,439 [geckordp][INFO] - __print_response(): RESPONSE<-
{
"from": "server1.conn0.cookies3"
}
2023-10-15 23:57:41,439 [geckordp][DEBUG] - __handle_single_request(): response valid, set result
Traceback (most recent call last):
File "cookie_storage.py", line 200, in <module>
main()
File "cookie_storage.py", line 152, in main
_data = stores_update_fut.result(1.0)
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/concurrent/futures/_base.py", line 460, in result
raise TimeoutError()
concurrent.futures._base.TimeoutError
I'm using Python 3.10.8 and Firefox 115.3.1esr (64 bit) on macOS 10.14.
Do you have any guidance for debugging the script and making it work? Thanks.
Can we have to
field after calling the Web.navigate_to function? If not, I can only reget tab actor info from the client.
I can locate an element via WALKER.query_selector, but with this node element, I wonder if it can provide more info? Like the location and size of this element?
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.