cmdop 0.1.17__py3-none-any.whl → 0.1.19__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- cmdop/__init__.py +1 -1
- cmdop/_generated/rpc_messages/browser_pb2.py +41 -25
- cmdop/_generated/rpc_messages/browser_pb2.pyi +132 -0
- cmdop/_generated/rpc_messages_pb2.pyi +8 -0
- cmdop/_generated/service_pb2.py +2 -2
- cmdop/_generated/service_pb2_grpc.py +130 -0
- cmdop/services/browser/__init__.py +3 -1
- cmdop/services/browser/aio/service.py +93 -1
- cmdop/services/browser/aio/session.py +172 -3
- cmdop/services/browser/base/session.py +52 -0
- cmdop/services/browser/js/__init__.py +4 -0
- cmdop/services/browser/js/interaction.py +71 -0
- cmdop/services/browser/js/scroll.py +117 -24
- cmdop/services/browser/models.py +36 -1
- cmdop/services/browser/sync/service.py +119 -1
- cmdop/services/browser/sync/session.py +169 -39
- {cmdop-0.1.17.dist-info → cmdop-0.1.19.dist-info}/METADATA +39 -26
- {cmdop-0.1.17.dist-info → cmdop-0.1.19.dist-info}/RECORD +20 -20
- {cmdop-0.1.17.dist-info → cmdop-0.1.19.dist-info}/WHEEL +0 -0
- {cmdop-0.1.17.dist-info → cmdop-0.1.19.dist-info}/licenses/LICENSE +0 -0
cmdop/__init__.py
CHANGED
|
@@ -24,7 +24,7 @@ _sym_db = _symbol_database.Default()
|
|
|
24
24
|
|
|
25
25
|
|
|
26
26
|
|
|
27
|
-
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1arpc_messages/browser.proto\x12\x08terminal\"\x9b\x01\n\x1b\x42rowserCreateSessionRequest\x12\x12\n\nsession_id\x18\x01 \x01(\t\x12\x10\n\x08provider\x18\x02 \x01(\t\x12\x12\n\nprofile_id\x18\x03 \x01(\t\x12\x11\n\tstart_url\x18\x04 \x01(\t\x12\x10\n\x08headless\x18\x05 \x01(\x08\x12\r\n\x05width\x18\x06 \x01(\x05\x12\x0e\n\x06height\x18\x07 \x01(\x05\"Z\n\x1c\x42rowserCreateSessionResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x1a\n\x12\x62rowser_session_id\x18\x02 \x01(\t\x12\r\n\x05\x65rror\x18\x03 \x01(\t\"L\n\x1a\x42rowserCloseSessionRequest\x12\x12\n\nsession_id\x18\x01 \x01(\t\x12\x1a\n\x12\x62rowser_session_id\x18\x02 \x01(\t\"=\n\x1b\x42rowserCloseSessionResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"i\n\x16\x42rowserNavigateRequest\x12\x12\n\nsession_id\x18\x01 \x01(\t\x12\x1a\n\x12\x62rowser_session_id\x18\x02 \x01(\t\x12\x0b\n\x03url\x18\x03 \x01(\t\x12\x12\n\ntimeout_ms\x18\x04 \x01(\x05\"L\n\x17\x42rowserNavigateResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x11\n\tfinal_url\x18\x02 \x01(\t\x12\r\n\x05\x65rror\x18\x03 \x01(\t\"k\n\x13\x42rowserClickRequest\x12\x12\n\nsession_id\x18\x01 \x01(\t\x12\x1a\n\x12\x62rowser_session_id\x18\x02 \x01(\t\x12\x10\n\x08selector\x18\x03 \x01(\t\x12\x12\n\ntimeout_ms\x18\x04 \x01(\x05\"6\n\x14\x42rowserClickResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"\x8d\x01\n\x12\x42rowserTypeRequest\x12\x12\n\nsession_id\x18\x01 \x01(\t\x12\x1a\n\x12\x62rowser_session_id\x18\x02 \x01(\t\x12\x10\n\x08selector\x18\x03 \x01(\t\x12\x0c\n\x04text\x18\x04 \x01(\t\x12\x12\n\nhuman_like\x18\x05 \x01(\x08\x12\x13\n\x0b\x63lear_first\x18\x06 \x01(\x08\"5\n\x13\x42rowserTypeResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"j\n\x12\x42rowserWaitRequest\x12\x12\n\nsession_id\x18\x01 \x01(\t\x12\x1a\n\x12\x62rowser_session_id\x18\x02 \x01(\t\x12\x10\n\x08selector\x18\x03 \x01(\t\x12\x12\n\ntimeout_ms\x18\x04 \x01(\x05\"D\n\x13\x42rowserWaitResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\r\n\x05\x66ound\x18\x02 \x01(\x08\x12\r\n\x05\x65rror\x18\x03 \x01(\t\"{\n\x15\x42rowserExtractRequest\x12\x12\n\nsession_id\x18\x01 \x01(\t\x12\x1a\n\x12\x62rowser_session_id\x18\x02 \x01(\t\x12\x10\n\x08selector\x18\x03 \x01(\t\x12\x11\n\tattribute\x18\x04 \x01(\t\x12\r\n\x05limit\x18\x05 \x01(\x05\"W\n\x16\x42rowserExtractResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x0e\n\x06values\x18\x02 \x03(\t\x12\r\n\x05\x63ount\x18\x03 \x01(\x05\x12\r\n\x05\x65rror\x18\x04 \x01(\t\"\x7f\n\x1a\x42rowserExtractRegexRequest\x12\x12\n\nsession_id\x18\x01 \x01(\t\x12\x1a\n\x12\x62rowser_session_id\x18\x02 \x01(\t\x12\x0f\n\x07pattern\x18\x03 \x01(\t\x12\x11\n\tfrom_html\x18\x04 \x01(\x08\x12\r\n\x05limit\x18\x05 \x01(\x05\"]\n\x1b\x42rowserExtractRegexResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x0f\n\x07matches\x18\x02 \x03(\t\x12\r\n\x05\x63ount\x18\x03 \x01(\x05\x12\r\n\x05\x65rror\x18\x04 \x01(\t\"Y\n\x15\x42rowserGetHTMLRequest\x12\x12\n\nsession_id\x18\x01 \x01(\t\x12\x1a\n\x12\x62rowser_session_id\x18\x02 \x01(\t\x12\x10\n\x08selector\x18\x03 \x01(\t\"F\n\x16\x42rowserGetHTMLResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x0c\n\x04html\x18\x02 \x01(\t\x12\r\n\x05\x65rror\x18\x03 \x01(\t\"Y\n\x15\x42rowserGetTextRequest\x12\x12\n\nsession_id\x18\x01 \x01(\t\x12\x1a\n\x12\x62rowser_session_id\x18\x02 \x01(\t\x12\x10\n\x08selector\x18\x03 \x01(\t\"F\n\x16\x42rowserGetTextResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x0c\n\x04text\x18\x02 \x01(\t\x12\r\n\x05\x65rror\x18\x03 \x01(\t\"]\n\x1b\x42rowserExecuteScriptRequest\x12\x12\n\nsession_id\x18\x01 \x01(\t\x12\x1a\n\x12\x62rowser_session_id\x18\x02 \x01(\t\x12\x0e\n\x06script\x18\x03 \x01(\t\"N\n\x1c\x42rowserExecuteScriptResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x0e\n\x06result\x18\x02 \x01(\t\x12\r\n\x05\x65rror\x18\x03 \x01(\t\"~\n\x18\x42rowserScreenshotRequest\x12\x12\n\nsession_id\x18\x01 \x01(\t\x12\x1a\n\x12\x62rowser_session_id\x18\x02 \x01(\t\x12\x11\n\tfull_page\x18\x03 \x01(\x08\x12\x0e\n\x06\x66ormat\x18\x04 \x01(\t\x12\x0f\n\x07quality\x18\x05 \x01(\x05\"I\n\x19\x42rowserScreenshotResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x12\r\n\x05\x65rror\x18\x03 \x01(\t\"H\n\x16\x42rowserGetStateRequest\x12\x12\n\nsession_id\x18\x01 \x01(\t\x12\x1a\n\x12\x62rowser_session_id\x18\x02 \x01(\t\"U\n\x17\x42rowserGetStateResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x0b\n\x03url\x18\x02 \x01(\t\x12\r\n\x05title\x18\x03 \x01(\t\x12\r\n\x05\x65rror\x18\x04 \x01(\t\"\x91\x01\n\rBrowserCookie\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\x12\x0e\n\x06\x64omain\x18\x03 \x01(\t\x12\x0c\n\x04path\x18\x04 \x01(\t\x12\x0e\n\x06secure\x18\x05 \x01(\x08\x12\x11\n\thttp_only\x18\x06 \x01(\x08\x12\x11\n\tsame_site\x18\x07 \x01(\t\x12\x0f\n\x07\x65xpires\x18\x08 \x01(\x03\"t\n\x18\x42rowserSetCookiesRequest\x12\x12\n\nsession_id\x18\x01 \x01(\t\x12\x1a\n\x12\x62rowser_session_id\x18\x02 \x01(\t\x12(\n\x07\x63ookies\x18\x03 \x03(\x0b\x32\x17.terminal.BrowserCookie\";\n\x19\x42rowserSetCookiesResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"Z\n\x18\x42rowserGetCookiesRequest\x12\x12\n\nsession_id\x18\x01 \x01(\t\x12\x1a\n\x12\x62rowser_session_id\x18\x02 \x01(\t\x12\x0e\n\x06\x64omain\x18\x03 \x01(\t\"e\n\x19\x42rowserGetCookiesResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12(\n\x07\x63ookies\x18\x02 \x03(\x0b\x32\x17.terminal.BrowserCookie\x12\r\n\x05\x65rror\x18\x03 \x01(\t\"\xd5\x01\n\x1f\x42rowserValidateSelectorsRequest\x12\x12\n\nsession_id\x18\x01 \x01(\t\x12\x1a\n\x12\x62rowser_session_id\x18\x02 \x01(\t\x12\x0c\n\x04item\x18\x03 \x01(\t\x12\x45\n\x06\x66ields\x18\x04 \x03(\x0b\x32\x35.terminal.BrowserValidateSelectorsRequest.FieldsEntry\x1a-\n\x0b\x46ieldsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xd2\x02\n BrowserValidateSelectorsResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\r\n\x05valid\x18\x02 \x01(\x08\x12\x46\n\x06\x63ounts\x18\x03 \x03(\x0b\x32\x36.terminal.BrowserValidateSelectorsResponse.CountsEntry\x12H\n\x07samples\x18\x04 \x03(\x0b\x32\x37.terminal.BrowserValidateSelectorsResponse.SamplesEntry\x12\x0e\n\x06\x65rrors\x18\x05 \x03(\t\x12\r\n\x05\x65rror\x18\x06 \x01(\t\x1a-\n\x0b\x43ountsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x05:\x02\x38\x01\x1a.\n\x0cSamplesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"}\n\x19\x42rowserExtractDataRequest\x12\x12\n\nsession_id\x18\x01 \x01(\t\x12\x1a\n\x12\x62rowser_session_id\x18\x02 \x01(\t\x12\x0c\n\x04item\x18\x03 \x01(\t\x12\x13\n\x0b\x66ields_json\x18\x04 \x01(\t\x12\r\n\x05limit\x18\x05 \x01(\x05\"_\n\x1a\x42rowserExtractDataResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x12\n\nitems_json\x18\x02 \x01(\t\x12\r\n\x05\x63ount\x18\x03 \x01(\x05\x12\r\n\x05\x65rror\x18\x04 \x01(\tB\x10Z\x0eterminal/protob\x06proto3')
|
|
27
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1arpc_messages/browser.proto\x12\x08terminal\"\x9b\x01\n\x1b\x42rowserCreateSessionRequest\x12\x12\n\nsession_id\x18\x01 \x01(\t\x12\x10\n\x08provider\x18\x02 \x01(\t\x12\x12\n\nprofile_id\x18\x03 \x01(\t\x12\x11\n\tstart_url\x18\x04 \x01(\t\x12\x10\n\x08headless\x18\x05 \x01(\x08\x12\r\n\x05width\x18\x06 \x01(\x05\x12\x0e\n\x06height\x18\x07 \x01(\x05\"Z\n\x1c\x42rowserCreateSessionResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x1a\n\x12\x62rowser_session_id\x18\x02 \x01(\t\x12\r\n\x05\x65rror\x18\x03 \x01(\t\"L\n\x1a\x42rowserCloseSessionRequest\x12\x12\n\nsession_id\x18\x01 \x01(\t\x12\x1a\n\x12\x62rowser_session_id\x18\x02 \x01(\t\"=\n\x1b\x42rowserCloseSessionResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"i\n\x16\x42rowserNavigateRequest\x12\x12\n\nsession_id\x18\x01 \x01(\t\x12\x1a\n\x12\x62rowser_session_id\x18\x02 \x01(\t\x12\x0b\n\x03url\x18\x03 \x01(\t\x12\x12\n\ntimeout_ms\x18\x04 \x01(\x05\"L\n\x17\x42rowserNavigateResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x11\n\tfinal_url\x18\x02 \x01(\t\x12\r\n\x05\x65rror\x18\x03 \x01(\t\"k\n\x13\x42rowserClickRequest\x12\x12\n\nsession_id\x18\x01 \x01(\t\x12\x1a\n\x12\x62rowser_session_id\x18\x02 \x01(\t\x12\x10\n\x08selector\x18\x03 \x01(\t\x12\x12\n\ntimeout_ms\x18\x04 \x01(\x05\"6\n\x14\x42rowserClickResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"\x8d\x01\n\x12\x42rowserTypeRequest\x12\x12\n\nsession_id\x18\x01 \x01(\t\x12\x1a\n\x12\x62rowser_session_id\x18\x02 \x01(\t\x12\x10\n\x08selector\x18\x03 \x01(\t\x12\x0c\n\x04text\x18\x04 \x01(\t\x12\x12\n\nhuman_like\x18\x05 \x01(\x08\x12\x13\n\x0b\x63lear_first\x18\x06 \x01(\x08\"5\n\x13\x42rowserTypeResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"j\n\x12\x42rowserWaitRequest\x12\x12\n\nsession_id\x18\x01 \x01(\t\x12\x1a\n\x12\x62rowser_session_id\x18\x02 \x01(\t\x12\x10\n\x08selector\x18\x03 \x01(\t\x12\x12\n\ntimeout_ms\x18\x04 \x01(\x05\"D\n\x13\x42rowserWaitResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\r\n\x05\x66ound\x18\x02 \x01(\x08\x12\r\n\x05\x65rror\x18\x03 \x01(\t\"{\n\x15\x42rowserExtractRequest\x12\x12\n\nsession_id\x18\x01 \x01(\t\x12\x1a\n\x12\x62rowser_session_id\x18\x02 \x01(\t\x12\x10\n\x08selector\x18\x03 \x01(\t\x12\x11\n\tattribute\x18\x04 \x01(\t\x12\r\n\x05limit\x18\x05 \x01(\x05\"W\n\x16\x42rowserExtractResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x0e\n\x06values\x18\x02 \x03(\t\x12\r\n\x05\x63ount\x18\x03 \x01(\x05\x12\r\n\x05\x65rror\x18\x04 \x01(\t\"\x7f\n\x1a\x42rowserExtractRegexRequest\x12\x12\n\nsession_id\x18\x01 \x01(\t\x12\x1a\n\x12\x62rowser_session_id\x18\x02 \x01(\t\x12\x0f\n\x07pattern\x18\x03 \x01(\t\x12\x11\n\tfrom_html\x18\x04 \x01(\x08\x12\r\n\x05limit\x18\x05 \x01(\x05\"]\n\x1b\x42rowserExtractRegexResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x0f\n\x07matches\x18\x02 \x03(\t\x12\r\n\x05\x63ount\x18\x03 \x01(\x05\x12\r\n\x05\x65rror\x18\x04 \x01(\t\"Y\n\x15\x42rowserGetHTMLRequest\x12\x12\n\nsession_id\x18\x01 \x01(\t\x12\x1a\n\x12\x62rowser_session_id\x18\x02 \x01(\t\x12\x10\n\x08selector\x18\x03 \x01(\t\"F\n\x16\x42rowserGetHTMLResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x0c\n\x04html\x18\x02 \x01(\t\x12\r\n\x05\x65rror\x18\x03 \x01(\t\"Y\n\x15\x42rowserGetTextRequest\x12\x12\n\nsession_id\x18\x01 \x01(\t\x12\x1a\n\x12\x62rowser_session_id\x18\x02 \x01(\t\x12\x10\n\x08selector\x18\x03 \x01(\t\"F\n\x16\x42rowserGetTextResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x0c\n\x04text\x18\x02 \x01(\t\x12\r\n\x05\x65rror\x18\x03 \x01(\t\"]\n\x1b\x42rowserExecuteScriptRequest\x12\x12\n\nsession_id\x18\x01 \x01(\t\x12\x1a\n\x12\x62rowser_session_id\x18\x02 \x01(\t\x12\x0e\n\x06script\x18\x03 \x01(\t\"N\n\x1c\x42rowserExecuteScriptResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x0e\n\x06result\x18\x02 \x01(\t\x12\r\n\x05\x65rror\x18\x03 \x01(\t\"~\n\x18\x42rowserScreenshotRequest\x12\x12\n\nsession_id\x18\x01 \x01(\t\x12\x1a\n\x12\x62rowser_session_id\x18\x02 \x01(\t\x12\x11\n\tfull_page\x18\x03 \x01(\x08\x12\x0e\n\x06\x66ormat\x18\x04 \x01(\t\x12\x0f\n\x07quality\x18\x05 \x01(\x05\"I\n\x19\x42rowserScreenshotResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x12\r\n\x05\x65rror\x18\x03 \x01(\t\"H\n\x16\x42rowserGetStateRequest\x12\x12\n\nsession_id\x18\x01 \x01(\t\x12\x1a\n\x12\x62rowser_session_id\x18\x02 \x01(\t\"U\n\x17\x42rowserGetStateResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x0b\n\x03url\x18\x02 \x01(\t\x12\r\n\x05title\x18\x03 \x01(\t\x12\r\n\x05\x65rror\x18\x04 \x01(\t\"K\n\x19\x42rowserGetPageInfoRequest\x12\x12\n\nsession_id\x18\x01 \x01(\t\x12\x1a\n\x12\x62rowser_session_id\x18\x02 \x01(\t\"\xbb\x03\n\x1a\x42rowserGetPageInfoResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\r\n\x05\x65rror\x18\x02 \x01(\t\x12\x0b\n\x03url\x18\x03 \x01(\t\x12\r\n\x05title\x18\x04 \x01(\t\x12\x13\n\x0bpage_height\x18\x05 \x01(\x05\x12\x17\n\x0fviewport_height\x18\x06 \x01(\x05\x12\x16\n\x0eviewport_width\x18\x07 \x01(\x05\x12\x10\n\x08scroll_x\x18\x08 \x01(\x05\x12\x10\n\x08scroll_y\x18\t \x01(\x05\x12\x0e\n\x06\x61t_top\x18\n \x01(\x08\x12\x11\n\tat_bottom\x18\x0b \x01(\x08\x12\x14\n\x0cload_time_ms\x18\x0c \x01(\x05\x12\x15\n\rcookies_count\x18\r \x01(\x05\x12\x10\n\x08is_https\x18\x0e \x01(\x08\x12\x13\n\x0bhas_iframes\x18\x0f \x01(\x08\x12\x15\n\rdom_nodes_raw\x18\x10 \x01(\x05\x12\x19\n\x11\x64om_nodes_cleaned\x18\x11 \x01(\x05\x12\x17\n\x0ftokens_estimate\x18\x12 \x01(\x05\x12\x1b\n\x13\x63loudflare_detected\x18\x13 \x01(\x08\x12\x18\n\x10\x63\x61ptcha_detected\x18\x14 \x01(\x08\"\x91\x01\n\rBrowserCookie\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\x12\x0e\n\x06\x64omain\x18\x03 \x01(\t\x12\x0c\n\x04path\x18\x04 \x01(\t\x12\x0e\n\x06secure\x18\x05 \x01(\x08\x12\x11\n\thttp_only\x18\x06 \x01(\x08\x12\x11\n\tsame_site\x18\x07 \x01(\t\x12\x0f\n\x07\x65xpires\x18\x08 \x01(\x03\"t\n\x18\x42rowserSetCookiesRequest\x12\x12\n\nsession_id\x18\x01 \x01(\t\x12\x1a\n\x12\x62rowser_session_id\x18\x02 \x01(\t\x12(\n\x07\x63ookies\x18\x03 \x03(\x0b\x32\x17.terminal.BrowserCookie\";\n\x19\x42rowserSetCookiesResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"Z\n\x18\x42rowserGetCookiesRequest\x12\x12\n\nsession_id\x18\x01 \x01(\t\x12\x1a\n\x12\x62rowser_session_id\x18\x02 \x01(\t\x12\x0e\n\x06\x64omain\x18\x03 \x01(\t\"e\n\x19\x42rowserGetCookiesResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12(\n\x07\x63ookies\x18\x02 \x03(\x0b\x32\x17.terminal.BrowserCookie\x12\r\n\x05\x65rror\x18\x03 \x01(\t\"n\n\x17\x42rowserMouseMoveRequest\x12\x12\n\nsession_id\x18\x01 \x01(\t\x12\x1a\n\x12\x62rowser_session_id\x18\x02 \x01(\t\x12\t\n\x01x\x18\x03 \x01(\x05\x12\t\n\x01y\x18\x04 \x01(\x05\x12\r\n\x05steps\x18\x05 \x01(\x05\":\n\x18\x42rowserMouseMoveResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"k\n\x13\x42rowserHoverRequest\x12\x12\n\nsession_id\x18\x01 \x01(\t\x12\x1a\n\x12\x62rowser_session_id\x18\x02 \x01(\t\x12\x10\n\x08selector\x18\x03 \x01(\t\x12\x12\n\ntimeout_ms\x18\x04 \x01(\x05\"6\n\x14\x42rowserHoverResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\r\n\x05\x65rror\x18\x02 \x01(\t\"\x9e\x01\n\x14\x42rowserScrollRequest\x12\x12\n\nsession_id\x18\x01 \x01(\t\x12\x1a\n\x12\x62rowser_session_id\x18\x02 \x01(\t\x12\x11\n\tdirection\x18\x03 \x01(\t\x12\x0e\n\x06\x61mount\x18\x04 \x01(\x05\x12\x10\n\x08selector\x18\x05 \x01(\t\x12\x11\n\tcontainer\x18\x06 \x01(\t\x12\x0e\n\x06smooth\x18\x07 \x01(\x08\"\xb1\x01\n\x15\x42rowserScrollResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x10\n\x08scroll_x\x18\x02 \x01(\x05\x12\x10\n\x08scroll_y\x18\x03 \x01(\x05\x12\x13\n\x0bscrolled_by\x18\x04 \x01(\x05\x12\x13\n\x0bpage_height\x18\x05 \x01(\x05\x12\x17\n\x0fviewport_height\x18\x06 \x01(\x05\x12\x11\n\tat_bottom\x18\x07 \x01(\x08\x12\r\n\x05\x65rror\x18\x08 \x01(\t\"\xd5\x01\n\x1f\x42rowserValidateSelectorsRequest\x12\x12\n\nsession_id\x18\x01 \x01(\t\x12\x1a\n\x12\x62rowser_session_id\x18\x02 \x01(\t\x12\x0c\n\x04item\x18\x03 \x01(\t\x12\x45\n\x06\x66ields\x18\x04 \x03(\x0b\x32\x35.terminal.BrowserValidateSelectorsRequest.FieldsEntry\x1a-\n\x0b\x46ieldsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xd2\x02\n BrowserValidateSelectorsResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\r\n\x05valid\x18\x02 \x01(\x08\x12\x46\n\x06\x63ounts\x18\x03 \x03(\x0b\x32\x36.terminal.BrowserValidateSelectorsResponse.CountsEntry\x12H\n\x07samples\x18\x04 \x03(\x0b\x32\x37.terminal.BrowserValidateSelectorsResponse.SamplesEntry\x12\x0e\n\x06\x65rrors\x18\x05 \x03(\t\x12\r\n\x05\x65rror\x18\x06 \x01(\t\x1a-\n\x0b\x43ountsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x05:\x02\x38\x01\x1a.\n\x0cSamplesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"}\n\x19\x42rowserExtractDataRequest\x12\x12\n\nsession_id\x18\x01 \x01(\t\x12\x1a\n\x12\x62rowser_session_id\x18\x02 \x01(\t\x12\x0c\n\x04item\x18\x03 \x01(\t\x12\x13\n\x0b\x66ields_json\x18\x04 \x01(\t\x12\r\n\x05limit\x18\x05 \x01(\x05\"_\n\x1a\x42rowserExtractDataResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x12\n\nitems_json\x18\x02 \x01(\t\x12\r\n\x05\x63ount\x18\x03 \x01(\x05\x12\r\n\x05\x65rror\x18\x04 \x01(\tB\x10Z\x0eterminal/protob\x06proto3')
|
|
28
28
|
|
|
29
29
|
_globals = globals()
|
|
30
30
|
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
|
@@ -90,28 +90,44 @@ if not _descriptor._USE_C_DESCRIPTORS:
|
|
|
90
90
|
_globals['_BROWSERGETSTATEREQUEST']._serialized_end=2372
|
|
91
91
|
_globals['_BROWSERGETSTATERESPONSE']._serialized_start=2374
|
|
92
92
|
_globals['_BROWSERGETSTATERESPONSE']._serialized_end=2459
|
|
93
|
-
_globals['
|
|
94
|
-
_globals['
|
|
95
|
-
_globals['
|
|
96
|
-
_globals['
|
|
97
|
-
_globals['
|
|
98
|
-
_globals['
|
|
99
|
-
_globals['
|
|
100
|
-
_globals['
|
|
101
|
-
_globals['
|
|
102
|
-
_globals['
|
|
103
|
-
_globals['
|
|
104
|
-
_globals['
|
|
105
|
-
_globals['
|
|
106
|
-
_globals['
|
|
107
|
-
_globals['
|
|
108
|
-
_globals['
|
|
109
|
-
_globals['
|
|
110
|
-
_globals['
|
|
111
|
-
_globals['
|
|
112
|
-
_globals['
|
|
113
|
-
_globals['
|
|
114
|
-
_globals['
|
|
115
|
-
_globals['
|
|
116
|
-
_globals['
|
|
93
|
+
_globals['_BROWSERGETPAGEINFOREQUEST']._serialized_start=2461
|
|
94
|
+
_globals['_BROWSERGETPAGEINFOREQUEST']._serialized_end=2536
|
|
95
|
+
_globals['_BROWSERGETPAGEINFORESPONSE']._serialized_start=2539
|
|
96
|
+
_globals['_BROWSERGETPAGEINFORESPONSE']._serialized_end=2982
|
|
97
|
+
_globals['_BROWSERCOOKIE']._serialized_start=2985
|
|
98
|
+
_globals['_BROWSERCOOKIE']._serialized_end=3130
|
|
99
|
+
_globals['_BROWSERSETCOOKIESREQUEST']._serialized_start=3132
|
|
100
|
+
_globals['_BROWSERSETCOOKIESREQUEST']._serialized_end=3248
|
|
101
|
+
_globals['_BROWSERSETCOOKIESRESPONSE']._serialized_start=3250
|
|
102
|
+
_globals['_BROWSERSETCOOKIESRESPONSE']._serialized_end=3309
|
|
103
|
+
_globals['_BROWSERGETCOOKIESREQUEST']._serialized_start=3311
|
|
104
|
+
_globals['_BROWSERGETCOOKIESREQUEST']._serialized_end=3401
|
|
105
|
+
_globals['_BROWSERGETCOOKIESRESPONSE']._serialized_start=3403
|
|
106
|
+
_globals['_BROWSERGETCOOKIESRESPONSE']._serialized_end=3504
|
|
107
|
+
_globals['_BROWSERMOUSEMOVEREQUEST']._serialized_start=3506
|
|
108
|
+
_globals['_BROWSERMOUSEMOVEREQUEST']._serialized_end=3616
|
|
109
|
+
_globals['_BROWSERMOUSEMOVERESPONSE']._serialized_start=3618
|
|
110
|
+
_globals['_BROWSERMOUSEMOVERESPONSE']._serialized_end=3676
|
|
111
|
+
_globals['_BROWSERHOVERREQUEST']._serialized_start=3678
|
|
112
|
+
_globals['_BROWSERHOVERREQUEST']._serialized_end=3785
|
|
113
|
+
_globals['_BROWSERHOVERRESPONSE']._serialized_start=3787
|
|
114
|
+
_globals['_BROWSERHOVERRESPONSE']._serialized_end=3841
|
|
115
|
+
_globals['_BROWSERSCROLLREQUEST']._serialized_start=3844
|
|
116
|
+
_globals['_BROWSERSCROLLREQUEST']._serialized_end=4002
|
|
117
|
+
_globals['_BROWSERSCROLLRESPONSE']._serialized_start=4005
|
|
118
|
+
_globals['_BROWSERSCROLLRESPONSE']._serialized_end=4182
|
|
119
|
+
_globals['_BROWSERVALIDATESELECTORSREQUEST']._serialized_start=4185
|
|
120
|
+
_globals['_BROWSERVALIDATESELECTORSREQUEST']._serialized_end=4398
|
|
121
|
+
_globals['_BROWSERVALIDATESELECTORSREQUEST_FIELDSENTRY']._serialized_start=4353
|
|
122
|
+
_globals['_BROWSERVALIDATESELECTORSREQUEST_FIELDSENTRY']._serialized_end=4398
|
|
123
|
+
_globals['_BROWSERVALIDATESELECTORSRESPONSE']._serialized_start=4401
|
|
124
|
+
_globals['_BROWSERVALIDATESELECTORSRESPONSE']._serialized_end=4739
|
|
125
|
+
_globals['_BROWSERVALIDATESELECTORSRESPONSE_COUNTSENTRY']._serialized_start=4646
|
|
126
|
+
_globals['_BROWSERVALIDATESELECTORSRESPONSE_COUNTSENTRY']._serialized_end=4691
|
|
127
|
+
_globals['_BROWSERVALIDATESELECTORSRESPONSE_SAMPLESENTRY']._serialized_start=4693
|
|
128
|
+
_globals['_BROWSERVALIDATESELECTORSRESPONSE_SAMPLESENTRY']._serialized_end=4739
|
|
129
|
+
_globals['_BROWSEREXTRACTDATAREQUEST']._serialized_start=4741
|
|
130
|
+
_globals['_BROWSEREXTRACTDATAREQUEST']._serialized_end=4866
|
|
131
|
+
_globals['_BROWSEREXTRACTDATARESPONSE']._serialized_start=4868
|
|
132
|
+
_globals['_BROWSEREXTRACTDATARESPONSE']._serialized_end=4963
|
|
117
133
|
# @@protoc_insertion_point(module_scope)
|
|
@@ -294,6 +294,58 @@ class BrowserGetStateResponse(_message.Message):
|
|
|
294
294
|
error: str
|
|
295
295
|
def __init__(self, success: bool = ..., url: _Optional[str] = ..., title: _Optional[str] = ..., error: _Optional[str] = ...) -> None: ...
|
|
296
296
|
|
|
297
|
+
class BrowserGetPageInfoRequest(_message.Message):
|
|
298
|
+
__slots__ = ("session_id", "browser_session_id")
|
|
299
|
+
SESSION_ID_FIELD_NUMBER: _ClassVar[int]
|
|
300
|
+
BROWSER_SESSION_ID_FIELD_NUMBER: _ClassVar[int]
|
|
301
|
+
session_id: str
|
|
302
|
+
browser_session_id: str
|
|
303
|
+
def __init__(self, session_id: _Optional[str] = ..., browser_session_id: _Optional[str] = ...) -> None: ...
|
|
304
|
+
|
|
305
|
+
class BrowserGetPageInfoResponse(_message.Message):
|
|
306
|
+
__slots__ = ("success", "error", "url", "title", "page_height", "viewport_height", "viewport_width", "scroll_x", "scroll_y", "at_top", "at_bottom", "load_time_ms", "cookies_count", "is_https", "has_iframes", "dom_nodes_raw", "dom_nodes_cleaned", "tokens_estimate", "cloudflare_detected", "captcha_detected")
|
|
307
|
+
SUCCESS_FIELD_NUMBER: _ClassVar[int]
|
|
308
|
+
ERROR_FIELD_NUMBER: _ClassVar[int]
|
|
309
|
+
URL_FIELD_NUMBER: _ClassVar[int]
|
|
310
|
+
TITLE_FIELD_NUMBER: _ClassVar[int]
|
|
311
|
+
PAGE_HEIGHT_FIELD_NUMBER: _ClassVar[int]
|
|
312
|
+
VIEWPORT_HEIGHT_FIELD_NUMBER: _ClassVar[int]
|
|
313
|
+
VIEWPORT_WIDTH_FIELD_NUMBER: _ClassVar[int]
|
|
314
|
+
SCROLL_X_FIELD_NUMBER: _ClassVar[int]
|
|
315
|
+
SCROLL_Y_FIELD_NUMBER: _ClassVar[int]
|
|
316
|
+
AT_TOP_FIELD_NUMBER: _ClassVar[int]
|
|
317
|
+
AT_BOTTOM_FIELD_NUMBER: _ClassVar[int]
|
|
318
|
+
LOAD_TIME_MS_FIELD_NUMBER: _ClassVar[int]
|
|
319
|
+
COOKIES_COUNT_FIELD_NUMBER: _ClassVar[int]
|
|
320
|
+
IS_HTTPS_FIELD_NUMBER: _ClassVar[int]
|
|
321
|
+
HAS_IFRAMES_FIELD_NUMBER: _ClassVar[int]
|
|
322
|
+
DOM_NODES_RAW_FIELD_NUMBER: _ClassVar[int]
|
|
323
|
+
DOM_NODES_CLEANED_FIELD_NUMBER: _ClassVar[int]
|
|
324
|
+
TOKENS_ESTIMATE_FIELD_NUMBER: _ClassVar[int]
|
|
325
|
+
CLOUDFLARE_DETECTED_FIELD_NUMBER: _ClassVar[int]
|
|
326
|
+
CAPTCHA_DETECTED_FIELD_NUMBER: _ClassVar[int]
|
|
327
|
+
success: bool
|
|
328
|
+
error: str
|
|
329
|
+
url: str
|
|
330
|
+
title: str
|
|
331
|
+
page_height: int
|
|
332
|
+
viewport_height: int
|
|
333
|
+
viewport_width: int
|
|
334
|
+
scroll_x: int
|
|
335
|
+
scroll_y: int
|
|
336
|
+
at_top: bool
|
|
337
|
+
at_bottom: bool
|
|
338
|
+
load_time_ms: int
|
|
339
|
+
cookies_count: int
|
|
340
|
+
is_https: bool
|
|
341
|
+
has_iframes: bool
|
|
342
|
+
dom_nodes_raw: int
|
|
343
|
+
dom_nodes_cleaned: int
|
|
344
|
+
tokens_estimate: int
|
|
345
|
+
cloudflare_detected: bool
|
|
346
|
+
captcha_detected: bool
|
|
347
|
+
def __init__(self, success: bool = ..., error: _Optional[str] = ..., url: _Optional[str] = ..., title: _Optional[str] = ..., page_height: _Optional[int] = ..., viewport_height: _Optional[int] = ..., viewport_width: _Optional[int] = ..., scroll_x: _Optional[int] = ..., scroll_y: _Optional[int] = ..., at_top: bool = ..., at_bottom: bool = ..., load_time_ms: _Optional[int] = ..., cookies_count: _Optional[int] = ..., is_https: bool = ..., has_iframes: bool = ..., dom_nodes_raw: _Optional[int] = ..., dom_nodes_cleaned: _Optional[int] = ..., tokens_estimate: _Optional[int] = ..., cloudflare_detected: bool = ..., captcha_detected: bool = ...) -> None: ...
|
|
348
|
+
|
|
297
349
|
class BrowserCookie(_message.Message):
|
|
298
350
|
__slots__ = ("name", "value", "domain", "path", "secure", "http_only", "same_site", "expires")
|
|
299
351
|
NAME_FIELD_NUMBER: _ClassVar[int]
|
|
@@ -352,6 +404,86 @@ class BrowserGetCookiesResponse(_message.Message):
|
|
|
352
404
|
error: str
|
|
353
405
|
def __init__(self, success: bool = ..., cookies: _Optional[_Iterable[_Union[BrowserCookie, _Mapping]]] = ..., error: _Optional[str] = ...) -> None: ...
|
|
354
406
|
|
|
407
|
+
class BrowserMouseMoveRequest(_message.Message):
|
|
408
|
+
__slots__ = ("session_id", "browser_session_id", "x", "y", "steps")
|
|
409
|
+
SESSION_ID_FIELD_NUMBER: _ClassVar[int]
|
|
410
|
+
BROWSER_SESSION_ID_FIELD_NUMBER: _ClassVar[int]
|
|
411
|
+
X_FIELD_NUMBER: _ClassVar[int]
|
|
412
|
+
Y_FIELD_NUMBER: _ClassVar[int]
|
|
413
|
+
STEPS_FIELD_NUMBER: _ClassVar[int]
|
|
414
|
+
session_id: str
|
|
415
|
+
browser_session_id: str
|
|
416
|
+
x: int
|
|
417
|
+
y: int
|
|
418
|
+
steps: int
|
|
419
|
+
def __init__(self, session_id: _Optional[str] = ..., browser_session_id: _Optional[str] = ..., x: _Optional[int] = ..., y: _Optional[int] = ..., steps: _Optional[int] = ...) -> None: ...
|
|
420
|
+
|
|
421
|
+
class BrowserMouseMoveResponse(_message.Message):
|
|
422
|
+
__slots__ = ("success", "error")
|
|
423
|
+
SUCCESS_FIELD_NUMBER: _ClassVar[int]
|
|
424
|
+
ERROR_FIELD_NUMBER: _ClassVar[int]
|
|
425
|
+
success: bool
|
|
426
|
+
error: str
|
|
427
|
+
def __init__(self, success: bool = ..., error: _Optional[str] = ...) -> None: ...
|
|
428
|
+
|
|
429
|
+
class BrowserHoverRequest(_message.Message):
|
|
430
|
+
__slots__ = ("session_id", "browser_session_id", "selector", "timeout_ms")
|
|
431
|
+
SESSION_ID_FIELD_NUMBER: _ClassVar[int]
|
|
432
|
+
BROWSER_SESSION_ID_FIELD_NUMBER: _ClassVar[int]
|
|
433
|
+
SELECTOR_FIELD_NUMBER: _ClassVar[int]
|
|
434
|
+
TIMEOUT_MS_FIELD_NUMBER: _ClassVar[int]
|
|
435
|
+
session_id: str
|
|
436
|
+
browser_session_id: str
|
|
437
|
+
selector: str
|
|
438
|
+
timeout_ms: int
|
|
439
|
+
def __init__(self, session_id: _Optional[str] = ..., browser_session_id: _Optional[str] = ..., selector: _Optional[str] = ..., timeout_ms: _Optional[int] = ...) -> None: ...
|
|
440
|
+
|
|
441
|
+
class BrowserHoverResponse(_message.Message):
|
|
442
|
+
__slots__ = ("success", "error")
|
|
443
|
+
SUCCESS_FIELD_NUMBER: _ClassVar[int]
|
|
444
|
+
ERROR_FIELD_NUMBER: _ClassVar[int]
|
|
445
|
+
success: bool
|
|
446
|
+
error: str
|
|
447
|
+
def __init__(self, success: bool = ..., error: _Optional[str] = ...) -> None: ...
|
|
448
|
+
|
|
449
|
+
class BrowserScrollRequest(_message.Message):
|
|
450
|
+
__slots__ = ("session_id", "browser_session_id", "direction", "amount", "selector", "container", "smooth")
|
|
451
|
+
SESSION_ID_FIELD_NUMBER: _ClassVar[int]
|
|
452
|
+
BROWSER_SESSION_ID_FIELD_NUMBER: _ClassVar[int]
|
|
453
|
+
DIRECTION_FIELD_NUMBER: _ClassVar[int]
|
|
454
|
+
AMOUNT_FIELD_NUMBER: _ClassVar[int]
|
|
455
|
+
SELECTOR_FIELD_NUMBER: _ClassVar[int]
|
|
456
|
+
CONTAINER_FIELD_NUMBER: _ClassVar[int]
|
|
457
|
+
SMOOTH_FIELD_NUMBER: _ClassVar[int]
|
|
458
|
+
session_id: str
|
|
459
|
+
browser_session_id: str
|
|
460
|
+
direction: str
|
|
461
|
+
amount: int
|
|
462
|
+
selector: str
|
|
463
|
+
container: str
|
|
464
|
+
smooth: bool
|
|
465
|
+
def __init__(self, session_id: _Optional[str] = ..., browser_session_id: _Optional[str] = ..., direction: _Optional[str] = ..., amount: _Optional[int] = ..., selector: _Optional[str] = ..., container: _Optional[str] = ..., smooth: bool = ...) -> None: ...
|
|
466
|
+
|
|
467
|
+
class BrowserScrollResponse(_message.Message):
|
|
468
|
+
__slots__ = ("success", "scroll_x", "scroll_y", "scrolled_by", "page_height", "viewport_height", "at_bottom", "error")
|
|
469
|
+
SUCCESS_FIELD_NUMBER: _ClassVar[int]
|
|
470
|
+
SCROLL_X_FIELD_NUMBER: _ClassVar[int]
|
|
471
|
+
SCROLL_Y_FIELD_NUMBER: _ClassVar[int]
|
|
472
|
+
SCROLLED_BY_FIELD_NUMBER: _ClassVar[int]
|
|
473
|
+
PAGE_HEIGHT_FIELD_NUMBER: _ClassVar[int]
|
|
474
|
+
VIEWPORT_HEIGHT_FIELD_NUMBER: _ClassVar[int]
|
|
475
|
+
AT_BOTTOM_FIELD_NUMBER: _ClassVar[int]
|
|
476
|
+
ERROR_FIELD_NUMBER: _ClassVar[int]
|
|
477
|
+
success: bool
|
|
478
|
+
scroll_x: int
|
|
479
|
+
scroll_y: int
|
|
480
|
+
scrolled_by: int
|
|
481
|
+
page_height: int
|
|
482
|
+
viewport_height: int
|
|
483
|
+
at_bottom: bool
|
|
484
|
+
error: str
|
|
485
|
+
def __init__(self, success: bool = ..., scroll_x: _Optional[int] = ..., scroll_y: _Optional[int] = ..., scrolled_by: _Optional[int] = ..., page_height: _Optional[int] = ..., viewport_height: _Optional[int] = ..., at_bottom: bool = ..., error: _Optional[str] = ...) -> None: ...
|
|
486
|
+
|
|
355
487
|
class BrowserValidateSelectorsRequest(_message.Message):
|
|
356
488
|
__slots__ = ("session_id", "browser_session_id", "item", "fields")
|
|
357
489
|
class FieldsEntry(_message.Message):
|
|
@@ -78,11 +78,19 @@ from rpc_messages.browser_pb2 import BrowserScreenshotRequest as BrowserScreensh
|
|
|
78
78
|
from rpc_messages.browser_pb2 import BrowserScreenshotResponse as BrowserScreenshotResponse
|
|
79
79
|
from rpc_messages.browser_pb2 import BrowserGetStateRequest as BrowserGetStateRequest
|
|
80
80
|
from rpc_messages.browser_pb2 import BrowserGetStateResponse as BrowserGetStateResponse
|
|
81
|
+
from rpc_messages.browser_pb2 import BrowserGetPageInfoRequest as BrowserGetPageInfoRequest
|
|
82
|
+
from rpc_messages.browser_pb2 import BrowserGetPageInfoResponse as BrowserGetPageInfoResponse
|
|
81
83
|
from rpc_messages.browser_pb2 import BrowserCookie as BrowserCookie
|
|
82
84
|
from rpc_messages.browser_pb2 import BrowserSetCookiesRequest as BrowserSetCookiesRequest
|
|
83
85
|
from rpc_messages.browser_pb2 import BrowserSetCookiesResponse as BrowserSetCookiesResponse
|
|
84
86
|
from rpc_messages.browser_pb2 import BrowserGetCookiesRequest as BrowserGetCookiesRequest
|
|
85
87
|
from rpc_messages.browser_pb2 import BrowserGetCookiesResponse as BrowserGetCookiesResponse
|
|
88
|
+
from rpc_messages.browser_pb2 import BrowserMouseMoveRequest as BrowserMouseMoveRequest
|
|
89
|
+
from rpc_messages.browser_pb2 import BrowserMouseMoveResponse as BrowserMouseMoveResponse
|
|
90
|
+
from rpc_messages.browser_pb2 import BrowserHoverRequest as BrowserHoverRequest
|
|
91
|
+
from rpc_messages.browser_pb2 import BrowserHoverResponse as BrowserHoverResponse
|
|
92
|
+
from rpc_messages.browser_pb2 import BrowserScrollRequest as BrowserScrollRequest
|
|
93
|
+
from rpc_messages.browser_pb2 import BrowserScrollResponse as BrowserScrollResponse
|
|
86
94
|
from rpc_messages.browser_pb2 import BrowserValidateSelectorsRequest as BrowserValidateSelectorsRequest
|
|
87
95
|
from rpc_messages.browser_pb2 import BrowserValidateSelectorsResponse as BrowserValidateSelectorsResponse
|
|
88
96
|
from rpc_messages.browser_pb2 import BrowserExtractDataRequest as BrowserExtractDataRequest
|
cmdop/_generated/service_pb2.py
CHANGED
|
@@ -125,7 +125,7 @@ except AttributeError:
|
|
|
125
125
|
file__operations_dot_requests__pb2 = file__operations__pb2.file_operations.requests_pb2
|
|
126
126
|
|
|
127
127
|
|
|
128
|
-
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\rservice.proto\x12\x08terminal\x1a\x14\x61gent_messages.proto\x1a\x16\x63ontrol_messages.proto\x1a\x12rpc_messages.proto\x1a\x0e\x66ile_rpc.proto\x1a\x15\x66ile_operations.proto2\
|
|
128
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\rservice.proto\x12\x08terminal\x1a\x14\x61gent_messages.proto\x1a\x16\x63ontrol_messages.proto\x1a\x12rpc_messages.proto\x1a\x0e\x66ile_rpc.proto\x1a\x15\x66ile_operations.proto2\x84&\n\x18TerminalStreamingService\x12G\n\x0f\x43onnectTerminal\x12\x16.terminal.AgentMessage\x1a\x18.terminal.ControlMessage(\x01\x30\x01\x12P\n\rCreateSession\x12\x1e.terminal.CreateSessionRequest\x1a\x1f.terminal.CreateSessionResponse\x12M\n\x0c\x43loseSession\x12\x1d.terminal.CloseSessionRequest\x1a\x1e.terminal.CloseSessionResponse\x12Y\n\x10GetSessionStatus\x12!.terminal.GetSessionStatusRequest\x1a\".terminal.GetSessionStatusResponse\x12M\n\x0cListSessions\x12\x1d.terminal.ListSessionsRequest\x1a\x1e.terminal.ListSessionsResponse\x12\x44\n\tSendInput\x12\x1a.terminal.SendInputRequest\x1a\x1b.terminal.SendInputResponse\x12G\n\nSendResize\x12\x1b.terminal.SendResizeRequest\x1a\x1c.terminal.SendResizeResponse\x12G\n\nSendSignal\x12\x1b.terminal.SendSignalRequest\x1a\x1c.terminal.SendSignalResponse\x12G\n\nGetHistory\x12\x1b.terminal.GetHistoryRequest\x1a\x1c.terminal.GetHistoryResponse\x12J\n\x0bHealthCheck\x12\x1c.terminal.HealthCheckRequest\x1a\x1d.terminal.HealthCheckResponse\x12\x62\n\x13RegisterDeviceToken\x12$.terminal.RegisterDeviceTokenRequest\x1a%.terminal.RegisterDeviceTokenResponse\x12h\n\x15UnregisterDeviceToken\x12&.terminal.UnregisterDeviceTokenRequest\x1a\'.terminal.UnregisterDeviceTokenResponse\x12V\n\x0f\x45nterBackground\x12 .terminal.EnterBackgroundRequest\x1a!.terminal.EnterBackgroundResponse\x12_\n\x12WakeFromBackground\x12#.terminal.WakeFromBackgroundRequest\x1a$.terminal.WakeFromBackgroundResponse\x12M\n\x0cQueueCommand\x12\x1d.terminal.QueueCommandRequest\x1a\x1e.terminal.QueueCommandResponse\x12\x62\n\x11\x46ileListDirectory\x12%.terminal.FileListDirectoryRpcRequest\x1a&.terminal.FileListDirectoryRpcResponse\x12G\n\x08\x46ileRead\x12\x1c.terminal.FileReadRpcRequest\x1a\x1d.terminal.FileReadRpcResponse\x12J\n\tFileWrite\x12\x1d.terminal.FileWriteRpcRequest\x1a\x1e.terminal.FileWriteRpcResponse\x12h\n\x13\x46ileCreateDirectory\x12\'.terminal.FileCreateDirectoryRpcRequest\x1a(.terminal.FileCreateDirectoryRpcResponse\x12M\n\nFileDelete\x12\x1e.terminal.FileDeleteRpcRequest\x1a\x1f.terminal.FileDeleteRpcResponse\x12G\n\x08\x46ileMove\x12\x1c.terminal.FileMoveRpcRequest\x1a\x1d.terminal.FileMoveRpcResponse\x12G\n\x08\x46ileCopy\x12\x1c.terminal.FileCopyRpcRequest\x1a\x1d.terminal.FileCopyRpcResponse\x12P\n\x0b\x46ileGetInfo\x12\x1f.terminal.FileGetInfoRpcRequest\x1a .terminal.FileGetInfoRpcResponse\x12\x62\n\x11\x46ileCreateArchive\x12%.terminal.FileCreateArchiveRpcRequest\x1a&.terminal.FileCreateArchiveRpcResponse\x12M\n\nFileSearch\x12\x1e.terminal.FileSearchRpcRequest\x1a\x1f.terminal.FileSearchRpcResponse\x12Y\n\x0eHlsGetPlaylist\x12\".terminal.HlsGetPlaylistRpcRequest\x1a#.terminal.HlsGetPlaylistRpcResponse\x12V\n\rHlsGetSegment\x12!.terminal.HlsGetSegmentRpcRequest\x1a\".terminal.HlsGetSegmentRpcResponse\x12Y\n\x0eHlsStopSession\x12\".terminal.HlsStopSessionRpcRequest\x1a#.terminal.HlsStopSessionRpcResponse\x12[\n\x16InitiateStreamingRelay\x12\x1f.terminal.StreamingRelayRequest\x1a .terminal.StreamingRelayResponse\x12H\n\nRelayChunk\x12\x1d.terminal.StreamingRelayChunk\x1a\x1b.terminal.StreamingRelayAck\x12`\n\x17GetStreamingRelayStatus\x12%.terminal.StreamingRelayStatusRequest\x1a\x1e.terminal.StreamingRelayStatus\x12\x65\n\x14\x43\x61ncelStreamingRelay\x12%.terminal.StreamingRelayCancelRequest\x1a&.terminal.StreamingRelayCancelResponse\x12\x65\n\x14SendPushNotification\x12%.terminal.SendPushNotificationRequest\x1a&.terminal.SendPushNotificationResponse\x12>\n\x07\x45xtract\x12\x18.terminal.ExtractRequest\x1a\x19.terminal.ExtractResponse\x12\x41\n\x08RunAgent\x12\x19.terminal.RunAgentRequest\x1a\x1a.terminal.RunAgentResponse\x12J\n\x0b\x43\x61ncelAgent\x12\x1c.terminal.CancelAgentRequest\x1a\x1d.terminal.CancelAgentResponse\x12\x65\n\x14\x42rowserCreateSession\x12%.terminal.BrowserCreateSessionRequest\x1a&.terminal.BrowserCreateSessionResponse\x12\x62\n\x13\x42rowserCloseSession\x12$.terminal.BrowserCloseSessionRequest\x1a%.terminal.BrowserCloseSessionResponse\x12V\n\x0f\x42rowserNavigate\x12 .terminal.BrowserNavigateRequest\x1a!.terminal.BrowserNavigateResponse\x12M\n\x0c\x42rowserClick\x12\x1d.terminal.BrowserClickRequest\x1a\x1e.terminal.BrowserClickResponse\x12J\n\x0b\x42rowserType\x12\x1c.terminal.BrowserTypeRequest\x1a\x1d.terminal.BrowserTypeResponse\x12J\n\x0b\x42rowserWait\x12\x1c.terminal.BrowserWaitRequest\x1a\x1d.terminal.BrowserWaitResponse\x12S\n\x0e\x42rowserExtract\x12\x1f.terminal.BrowserExtractRequest\x1a .terminal.BrowserExtractResponse\x12\x62\n\x13\x42rowserExtractRegex\x12$.terminal.BrowserExtractRegexRequest\x1a%.terminal.BrowserExtractRegexResponse\x12S\n\x0e\x42rowserGetHTML\x12\x1f.terminal.BrowserGetHTMLRequest\x1a .terminal.BrowserGetHTMLResponse\x12S\n\x0e\x42rowserGetText\x12\x1f.terminal.BrowserGetTextRequest\x1a .terminal.BrowserGetTextResponse\x12\x65\n\x14\x42rowserExecuteScript\x12%.terminal.BrowserExecuteScriptRequest\x1a&.terminal.BrowserExecuteScriptResponse\x12\\\n\x11\x42rowserScreenshot\x12\".terminal.BrowserScreenshotRequest\x1a#.terminal.BrowserScreenshotResponse\x12V\n\x0f\x42rowserGetState\x12 .terminal.BrowserGetStateRequest\x1a!.terminal.BrowserGetStateResponse\x12\\\n\x11\x42rowserSetCookies\x12\".terminal.BrowserSetCookiesRequest\x1a#.terminal.BrowserSetCookiesResponse\x12\\\n\x11\x42rowserGetCookies\x12\".terminal.BrowserGetCookiesRequest\x1a#.terminal.BrowserGetCookiesResponse\x12q\n\x18\x42rowserValidateSelectors\x12).terminal.BrowserValidateSelectorsRequest\x1a*.terminal.BrowserValidateSelectorsResponse\x12_\n\x12\x42rowserExtractData\x12#.terminal.BrowserExtractDataRequest\x1a$.terminal.BrowserExtractDataResponse\x12Y\n\x10\x42rowserMouseMove\x12!.terminal.BrowserMouseMoveRequest\x1a\".terminal.BrowserMouseMoveResponse\x12M\n\x0c\x42rowserHover\x12\x1d.terminal.BrowserHoverRequest\x1a\x1e.terminal.BrowserHoverResponse\x12P\n\rBrowserScroll\x12\x1e.terminal.BrowserScrollRequest\x1a\x1f.terminal.BrowserScrollResponseB\x10Z\x0eterminal/protob\x06proto3')
|
|
129
129
|
|
|
130
130
|
_globals = globals()
|
|
131
131
|
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
|
@@ -134,5 +134,5 @@ if not _descriptor._USE_C_DESCRIPTORS:
|
|
|
134
134
|
_globals['DESCRIPTOR']._loaded_options = None
|
|
135
135
|
_globals['DESCRIPTOR']._serialized_options = b'Z\016terminal/proto'
|
|
136
136
|
_globals['_TERMINALSTREAMINGSERVICE']._serialized_start=133
|
|
137
|
-
_globals['_TERMINALSTREAMINGSERVICE']._serialized_end=
|
|
137
|
+
_globals['_TERMINALSTREAMINGSERVICE']._serialized_end=5001
|
|
138
138
|
# @@protoc_insertion_point(module_scope)
|
|
@@ -320,6 +320,21 @@ class TerminalStreamingServiceStub(object):
|
|
|
320
320
|
request_serializer=rpc__messages_dot_browser__pb2.BrowserExtractDataRequest.SerializeToString,
|
|
321
321
|
response_deserializer=rpc__messages_dot_browser__pb2.BrowserExtractDataResponse.FromString,
|
|
322
322
|
_registered_method=True)
|
|
323
|
+
self.BrowserMouseMove = channel.unary_unary(
|
|
324
|
+
'/terminal.TerminalStreamingService/BrowserMouseMove',
|
|
325
|
+
request_serializer=rpc__messages_dot_browser__pb2.BrowserMouseMoveRequest.SerializeToString,
|
|
326
|
+
response_deserializer=rpc__messages_dot_browser__pb2.BrowserMouseMoveResponse.FromString,
|
|
327
|
+
_registered_method=True)
|
|
328
|
+
self.BrowserHover = channel.unary_unary(
|
|
329
|
+
'/terminal.TerminalStreamingService/BrowserHover',
|
|
330
|
+
request_serializer=rpc__messages_dot_browser__pb2.BrowserHoverRequest.SerializeToString,
|
|
331
|
+
response_deserializer=rpc__messages_dot_browser__pb2.BrowserHoverResponse.FromString,
|
|
332
|
+
_registered_method=True)
|
|
333
|
+
self.BrowserScroll = channel.unary_unary(
|
|
334
|
+
'/terminal.TerminalStreamingService/BrowserScroll',
|
|
335
|
+
request_serializer=rpc__messages_dot_browser__pb2.BrowserScrollRequest.SerializeToString,
|
|
336
|
+
response_deserializer=rpc__messages_dot_browser__pb2.BrowserScrollResponse.FromString,
|
|
337
|
+
_registered_method=True)
|
|
323
338
|
|
|
324
339
|
|
|
325
340
|
class TerminalStreamingServiceServicer(object):
|
|
@@ -679,6 +694,25 @@ class TerminalStreamingServiceServicer(object):
|
|
|
679
694
|
context.set_details('Method not implemented!')
|
|
680
695
|
raise NotImplementedError('Method not implemented!')
|
|
681
696
|
|
|
697
|
+
def BrowserMouseMove(self, request, context):
|
|
698
|
+
"""Mouse & Input (v2.18.0)
|
|
699
|
+
"""
|
|
700
|
+
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
|
|
701
|
+
context.set_details('Method not implemented!')
|
|
702
|
+
raise NotImplementedError('Method not implemented!')
|
|
703
|
+
|
|
704
|
+
def BrowserHover(self, request, context):
|
|
705
|
+
"""Missing associated documentation comment in .proto file."""
|
|
706
|
+
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
|
|
707
|
+
context.set_details('Method not implemented!')
|
|
708
|
+
raise NotImplementedError('Method not implemented!')
|
|
709
|
+
|
|
710
|
+
def BrowserScroll(self, request, context):
|
|
711
|
+
"""Missing associated documentation comment in .proto file."""
|
|
712
|
+
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
|
|
713
|
+
context.set_details('Method not implemented!')
|
|
714
|
+
raise NotImplementedError('Method not implemented!')
|
|
715
|
+
|
|
682
716
|
|
|
683
717
|
def add_TerminalStreamingServiceServicer_to_server(servicer, server):
|
|
684
718
|
rpc_method_handlers = {
|
|
@@ -947,6 +981,21 @@ def add_TerminalStreamingServiceServicer_to_server(servicer, server):
|
|
|
947
981
|
request_deserializer=rpc__messages_dot_browser__pb2.BrowserExtractDataRequest.FromString,
|
|
948
982
|
response_serializer=rpc__messages_dot_browser__pb2.BrowserExtractDataResponse.SerializeToString,
|
|
949
983
|
),
|
|
984
|
+
'BrowserMouseMove': grpc.unary_unary_rpc_method_handler(
|
|
985
|
+
servicer.BrowserMouseMove,
|
|
986
|
+
request_deserializer=rpc__messages_dot_browser__pb2.BrowserMouseMoveRequest.FromString,
|
|
987
|
+
response_serializer=rpc__messages_dot_browser__pb2.BrowserMouseMoveResponse.SerializeToString,
|
|
988
|
+
),
|
|
989
|
+
'BrowserHover': grpc.unary_unary_rpc_method_handler(
|
|
990
|
+
servicer.BrowserHover,
|
|
991
|
+
request_deserializer=rpc__messages_dot_browser__pb2.BrowserHoverRequest.FromString,
|
|
992
|
+
response_serializer=rpc__messages_dot_browser__pb2.BrowserHoverResponse.SerializeToString,
|
|
993
|
+
),
|
|
994
|
+
'BrowserScroll': grpc.unary_unary_rpc_method_handler(
|
|
995
|
+
servicer.BrowserScroll,
|
|
996
|
+
request_deserializer=rpc__messages_dot_browser__pb2.BrowserScrollRequest.FromString,
|
|
997
|
+
response_serializer=rpc__messages_dot_browser__pb2.BrowserScrollResponse.SerializeToString,
|
|
998
|
+
),
|
|
950
999
|
}
|
|
951
1000
|
generic_handler = grpc.method_handlers_generic_handler(
|
|
952
1001
|
'terminal.TerminalStreamingService', rpc_method_handlers)
|
|
@@ -2392,3 +2441,84 @@ class TerminalStreamingService(object):
|
|
|
2392
2441
|
timeout,
|
|
2393
2442
|
metadata,
|
|
2394
2443
|
_registered_method=True)
|
|
2444
|
+
|
|
2445
|
+
@staticmethod
|
|
2446
|
+
def BrowserMouseMove(request,
|
|
2447
|
+
target,
|
|
2448
|
+
options=(),
|
|
2449
|
+
channel_credentials=None,
|
|
2450
|
+
call_credentials=None,
|
|
2451
|
+
insecure=False,
|
|
2452
|
+
compression=None,
|
|
2453
|
+
wait_for_ready=None,
|
|
2454
|
+
timeout=None,
|
|
2455
|
+
metadata=None):
|
|
2456
|
+
return grpc.experimental.unary_unary(
|
|
2457
|
+
request,
|
|
2458
|
+
target,
|
|
2459
|
+
'/terminal.TerminalStreamingService/BrowserMouseMove',
|
|
2460
|
+
rpc__messages_dot_browser__pb2.BrowserMouseMoveRequest.SerializeToString,
|
|
2461
|
+
rpc__messages_dot_browser__pb2.BrowserMouseMoveResponse.FromString,
|
|
2462
|
+
options,
|
|
2463
|
+
channel_credentials,
|
|
2464
|
+
insecure,
|
|
2465
|
+
call_credentials,
|
|
2466
|
+
compression,
|
|
2467
|
+
wait_for_ready,
|
|
2468
|
+
timeout,
|
|
2469
|
+
metadata,
|
|
2470
|
+
_registered_method=True)
|
|
2471
|
+
|
|
2472
|
+
@staticmethod
|
|
2473
|
+
def BrowserHover(request,
|
|
2474
|
+
target,
|
|
2475
|
+
options=(),
|
|
2476
|
+
channel_credentials=None,
|
|
2477
|
+
call_credentials=None,
|
|
2478
|
+
insecure=False,
|
|
2479
|
+
compression=None,
|
|
2480
|
+
wait_for_ready=None,
|
|
2481
|
+
timeout=None,
|
|
2482
|
+
metadata=None):
|
|
2483
|
+
return grpc.experimental.unary_unary(
|
|
2484
|
+
request,
|
|
2485
|
+
target,
|
|
2486
|
+
'/terminal.TerminalStreamingService/BrowserHover',
|
|
2487
|
+
rpc__messages_dot_browser__pb2.BrowserHoverRequest.SerializeToString,
|
|
2488
|
+
rpc__messages_dot_browser__pb2.BrowserHoverResponse.FromString,
|
|
2489
|
+
options,
|
|
2490
|
+
channel_credentials,
|
|
2491
|
+
insecure,
|
|
2492
|
+
call_credentials,
|
|
2493
|
+
compression,
|
|
2494
|
+
wait_for_ready,
|
|
2495
|
+
timeout,
|
|
2496
|
+
metadata,
|
|
2497
|
+
_registered_method=True)
|
|
2498
|
+
|
|
2499
|
+
@staticmethod
|
|
2500
|
+
def BrowserScroll(request,
|
|
2501
|
+
target,
|
|
2502
|
+
options=(),
|
|
2503
|
+
channel_credentials=None,
|
|
2504
|
+
call_credentials=None,
|
|
2505
|
+
insecure=False,
|
|
2506
|
+
compression=None,
|
|
2507
|
+
wait_for_ready=None,
|
|
2508
|
+
timeout=None,
|
|
2509
|
+
metadata=None):
|
|
2510
|
+
return grpc.experimental.unary_unary(
|
|
2511
|
+
request,
|
|
2512
|
+
target,
|
|
2513
|
+
'/terminal.TerminalStreamingService/BrowserScroll',
|
|
2514
|
+
rpc__messages_dot_browser__pb2.BrowserScrollRequest.SerializeToString,
|
|
2515
|
+
rpc__messages_dot_browser__pb2.BrowserScrollResponse.FromString,
|
|
2516
|
+
options,
|
|
2517
|
+
channel_credentials,
|
|
2518
|
+
insecure,
|
|
2519
|
+
call_credentials,
|
|
2520
|
+
compression,
|
|
2521
|
+
wait_for_ready,
|
|
2522
|
+
timeout,
|
|
2523
|
+
metadata,
|
|
2524
|
+
_registered_method=True)
|
|
@@ -20,7 +20,7 @@ Usage:
|
|
|
20
20
|
data = await session.fetch_all(urls, headers={"Accept": "application/json"})
|
|
21
21
|
"""
|
|
22
22
|
|
|
23
|
-
from cmdop.services.browser.models import BrowserCookie, BrowserState, raise_browser_error
|
|
23
|
+
from cmdop.services.browser.models import BrowserCookie, BrowserState, PageInfo, ScrollResult, raise_browser_error
|
|
24
24
|
|
|
25
25
|
# Sync
|
|
26
26
|
from cmdop.services.browser.sync.session import BrowserSession
|
|
@@ -34,6 +34,8 @@ __all__ = [
|
|
|
34
34
|
# Models
|
|
35
35
|
"BrowserCookie",
|
|
36
36
|
"BrowserState",
|
|
37
|
+
"PageInfo",
|
|
38
|
+
"ScrollResult",
|
|
37
39
|
"raise_browser_error",
|
|
38
40
|
# Sync
|
|
39
41
|
"BrowserSession",
|
|
@@ -7,7 +7,7 @@ from typing import TYPE_CHECKING, Any
|
|
|
7
7
|
|
|
8
8
|
from cmdop.services.base import BaseService
|
|
9
9
|
from cmdop.services.browser.base.service import BaseServiceMixin, cookie_to_pb, pb_to_cookie
|
|
10
|
-
from cmdop.services.browser.models import BrowserCookie, BrowserState, raise_browser_error
|
|
10
|
+
from cmdop.services.browser.models import BrowserCookie, BrowserState, PageInfo, ScrollResult, raise_browser_error
|
|
11
11
|
|
|
12
12
|
if TYPE_CHECKING:
|
|
13
13
|
from cmdop.transport.base import BaseTransport
|
|
@@ -321,3 +321,95 @@ class AsyncBrowserService(BaseService, BaseServiceMixin):
|
|
|
321
321
|
"items": json.loads(response.items_json) if response.items_json else [],
|
|
322
322
|
"count": response.count,
|
|
323
323
|
}
|
|
324
|
+
|
|
325
|
+
# === Mouse & Scroll (v2.18.0) ===
|
|
326
|
+
|
|
327
|
+
async def mouse_move(
|
|
328
|
+
self, session_id: str, x: int, y: int, steps: int = 10
|
|
329
|
+
) -> None:
|
|
330
|
+
"""Move cursor to coordinates with smooth movement."""
|
|
331
|
+
from cmdop._generated.rpc_messages.browser_pb2 import BrowserMouseMoveRequest
|
|
332
|
+
|
|
333
|
+
request = BrowserMouseMoveRequest(
|
|
334
|
+
browser_session_id=session_id, x=x, y=y, steps=steps
|
|
335
|
+
)
|
|
336
|
+
response = await self._call_async(self._get_stub.BrowserMouseMove, request)
|
|
337
|
+
|
|
338
|
+
if not response.success:
|
|
339
|
+
raise RuntimeError(f"MouseMove failed: {response.error}")
|
|
340
|
+
|
|
341
|
+
async def hover(self, session_id: str, selector: str, timeout_ms: int = 5000) -> None:
|
|
342
|
+
"""Hover over element by selector."""
|
|
343
|
+
from cmdop._generated.rpc_messages.browser_pb2 import BrowserHoverRequest
|
|
344
|
+
|
|
345
|
+
request = BrowserHoverRequest(
|
|
346
|
+
browser_session_id=session_id, selector=selector, timeout_ms=timeout_ms
|
|
347
|
+
)
|
|
348
|
+
response = await self._call_async(self._get_stub.BrowserHover, request)
|
|
349
|
+
|
|
350
|
+
if not response.success:
|
|
351
|
+
raise_browser_error(response.error, "hover", selector=selector)
|
|
352
|
+
|
|
353
|
+
async def scroll(
|
|
354
|
+
self,
|
|
355
|
+
session_id: str,
|
|
356
|
+
direction: str = "down",
|
|
357
|
+
amount: int = 500,
|
|
358
|
+
selector: str = "",
|
|
359
|
+
smooth: bool = True,
|
|
360
|
+
) -> ScrollResult:
|
|
361
|
+
"""Scroll page or element into view."""
|
|
362
|
+
from cmdop._generated.rpc_messages.browser_pb2 import BrowserScrollRequest
|
|
363
|
+
|
|
364
|
+
request = BrowserScrollRequest(
|
|
365
|
+
browser_session_id=session_id,
|
|
366
|
+
direction=direction,
|
|
367
|
+
amount=amount,
|
|
368
|
+
selector=selector,
|
|
369
|
+
smooth=smooth,
|
|
370
|
+
)
|
|
371
|
+
response = await self._call_async(self._get_stub.BrowserScroll, request)
|
|
372
|
+
|
|
373
|
+
if not response.success:
|
|
374
|
+
return ScrollResult(success=False, error=response.error)
|
|
375
|
+
|
|
376
|
+
return ScrollResult(
|
|
377
|
+
success=True,
|
|
378
|
+
scroll_x=response.scroll_x,
|
|
379
|
+
scroll_y=response.scroll_y,
|
|
380
|
+
scrolled_by=response.scrolled_by,
|
|
381
|
+
page_height=response.page_height,
|
|
382
|
+
viewport_height=response.viewport_height,
|
|
383
|
+
at_bottom=response.at_bottom,
|
|
384
|
+
)
|
|
385
|
+
|
|
386
|
+
async def get_page_info(self, session_id: str) -> PageInfo:
|
|
387
|
+
"""Get comprehensive page information."""
|
|
388
|
+
from cmdop._generated.rpc_messages.browser_pb2 import BrowserGetPageInfoRequest
|
|
389
|
+
|
|
390
|
+
request = BrowserGetPageInfoRequest(browser_session_id=session_id)
|
|
391
|
+
response = await self._call_async(self._get_stub.BrowserGetPageInfo, request)
|
|
392
|
+
|
|
393
|
+
if not response.success:
|
|
394
|
+
raise RuntimeError(f"GetPageInfo failed: {response.error}")
|
|
395
|
+
|
|
396
|
+
return PageInfo(
|
|
397
|
+
url=response.url,
|
|
398
|
+
title=response.title,
|
|
399
|
+
page_height=response.page_height,
|
|
400
|
+
viewport_height=response.viewport_height,
|
|
401
|
+
viewport_width=response.viewport_width,
|
|
402
|
+
scroll_x=response.scroll_x,
|
|
403
|
+
scroll_y=response.scroll_y,
|
|
404
|
+
at_top=response.at_top,
|
|
405
|
+
at_bottom=response.at_bottom,
|
|
406
|
+
load_time_ms=response.load_time_ms,
|
|
407
|
+
cookies_count=response.cookies_count,
|
|
408
|
+
is_https=response.is_https,
|
|
409
|
+
has_iframes=response.has_iframes,
|
|
410
|
+
dom_nodes_raw=response.dom_nodes_raw,
|
|
411
|
+
dom_nodes_cleaned=response.dom_nodes_cleaned,
|
|
412
|
+
tokens_estimate=response.tokens_estimate,
|
|
413
|
+
cloudflare_detected=response.cloudflare_detected,
|
|
414
|
+
captcha_detected=response.captcha_detected,
|
|
415
|
+
)
|