cmdop 0.1.19__py3-none-any.whl → 0.1.21__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 CHANGED
@@ -124,7 +124,7 @@ from cmdop.logging import (
124
124
  get_log_dir,
125
125
  )
126
126
 
127
- __version__ = "0.1.19"
127
+ __version__ = "0.1.21"
128
128
 
129
129
  __all__ = [
130
130
  # Version
@@ -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\"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')
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\"\x80\x01\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\x12\x13\n\x0bmove_cursor\x18\x05 \x01(\x08\"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)
@@ -50,84 +50,84 @@ if not _descriptor._USE_C_DESCRIPTORS:
50
50
  _globals['_BROWSERNAVIGATEREQUEST']._serialized_end=536
51
51
  _globals['_BROWSERNAVIGATERESPONSE']._serialized_start=538
52
52
  _globals['_BROWSERNAVIGATERESPONSE']._serialized_end=614
53
- _globals['_BROWSERCLICKREQUEST']._serialized_start=616
54
- _globals['_BROWSERCLICKREQUEST']._serialized_end=723
55
- _globals['_BROWSERCLICKRESPONSE']._serialized_start=725
56
- _globals['_BROWSERCLICKRESPONSE']._serialized_end=779
57
- _globals['_BROWSERTYPEREQUEST']._serialized_start=782
58
- _globals['_BROWSERTYPEREQUEST']._serialized_end=923
59
- _globals['_BROWSERTYPERESPONSE']._serialized_start=925
60
- _globals['_BROWSERTYPERESPONSE']._serialized_end=978
61
- _globals['_BROWSERWAITREQUEST']._serialized_start=980
62
- _globals['_BROWSERWAITREQUEST']._serialized_end=1086
63
- _globals['_BROWSERWAITRESPONSE']._serialized_start=1088
64
- _globals['_BROWSERWAITRESPONSE']._serialized_end=1156
65
- _globals['_BROWSEREXTRACTREQUEST']._serialized_start=1158
66
- _globals['_BROWSEREXTRACTREQUEST']._serialized_end=1281
67
- _globals['_BROWSEREXTRACTRESPONSE']._serialized_start=1283
68
- _globals['_BROWSEREXTRACTRESPONSE']._serialized_end=1370
69
- _globals['_BROWSEREXTRACTREGEXREQUEST']._serialized_start=1372
70
- _globals['_BROWSEREXTRACTREGEXREQUEST']._serialized_end=1499
71
- _globals['_BROWSEREXTRACTREGEXRESPONSE']._serialized_start=1501
72
- _globals['_BROWSEREXTRACTREGEXRESPONSE']._serialized_end=1594
73
- _globals['_BROWSERGETHTMLREQUEST']._serialized_start=1596
74
- _globals['_BROWSERGETHTMLREQUEST']._serialized_end=1685
75
- _globals['_BROWSERGETHTMLRESPONSE']._serialized_start=1687
76
- _globals['_BROWSERGETHTMLRESPONSE']._serialized_end=1757
77
- _globals['_BROWSERGETTEXTREQUEST']._serialized_start=1759
78
- _globals['_BROWSERGETTEXTREQUEST']._serialized_end=1848
79
- _globals['_BROWSERGETTEXTRESPONSE']._serialized_start=1850
80
- _globals['_BROWSERGETTEXTRESPONSE']._serialized_end=1920
81
- _globals['_BROWSEREXECUTESCRIPTREQUEST']._serialized_start=1922
82
- _globals['_BROWSEREXECUTESCRIPTREQUEST']._serialized_end=2015
83
- _globals['_BROWSEREXECUTESCRIPTRESPONSE']._serialized_start=2017
84
- _globals['_BROWSEREXECUTESCRIPTRESPONSE']._serialized_end=2095
85
- _globals['_BROWSERSCREENSHOTREQUEST']._serialized_start=2097
86
- _globals['_BROWSERSCREENSHOTREQUEST']._serialized_end=2223
87
- _globals['_BROWSERSCREENSHOTRESPONSE']._serialized_start=2225
88
- _globals['_BROWSERSCREENSHOTRESPONSE']._serialized_end=2298
89
- _globals['_BROWSERGETSTATEREQUEST']._serialized_start=2300
90
- _globals['_BROWSERGETSTATEREQUEST']._serialized_end=2372
91
- _globals['_BROWSERGETSTATERESPONSE']._serialized_start=2374
92
- _globals['_BROWSERGETSTATERESPONSE']._serialized_end=2459
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
53
+ _globals['_BROWSERCLICKREQUEST']._serialized_start=617
54
+ _globals['_BROWSERCLICKREQUEST']._serialized_end=745
55
+ _globals['_BROWSERCLICKRESPONSE']._serialized_start=747
56
+ _globals['_BROWSERCLICKRESPONSE']._serialized_end=801
57
+ _globals['_BROWSERTYPEREQUEST']._serialized_start=804
58
+ _globals['_BROWSERTYPEREQUEST']._serialized_end=945
59
+ _globals['_BROWSERTYPERESPONSE']._serialized_start=947
60
+ _globals['_BROWSERTYPERESPONSE']._serialized_end=1000
61
+ _globals['_BROWSERWAITREQUEST']._serialized_start=1002
62
+ _globals['_BROWSERWAITREQUEST']._serialized_end=1108
63
+ _globals['_BROWSERWAITRESPONSE']._serialized_start=1110
64
+ _globals['_BROWSERWAITRESPONSE']._serialized_end=1178
65
+ _globals['_BROWSEREXTRACTREQUEST']._serialized_start=1180
66
+ _globals['_BROWSEREXTRACTREQUEST']._serialized_end=1303
67
+ _globals['_BROWSEREXTRACTRESPONSE']._serialized_start=1305
68
+ _globals['_BROWSEREXTRACTRESPONSE']._serialized_end=1392
69
+ _globals['_BROWSEREXTRACTREGEXREQUEST']._serialized_start=1394
70
+ _globals['_BROWSEREXTRACTREGEXREQUEST']._serialized_end=1521
71
+ _globals['_BROWSEREXTRACTREGEXRESPONSE']._serialized_start=1523
72
+ _globals['_BROWSEREXTRACTREGEXRESPONSE']._serialized_end=1616
73
+ _globals['_BROWSERGETHTMLREQUEST']._serialized_start=1618
74
+ _globals['_BROWSERGETHTMLREQUEST']._serialized_end=1707
75
+ _globals['_BROWSERGETHTMLRESPONSE']._serialized_start=1709
76
+ _globals['_BROWSERGETHTMLRESPONSE']._serialized_end=1779
77
+ _globals['_BROWSERGETTEXTREQUEST']._serialized_start=1781
78
+ _globals['_BROWSERGETTEXTREQUEST']._serialized_end=1870
79
+ _globals['_BROWSERGETTEXTRESPONSE']._serialized_start=1872
80
+ _globals['_BROWSERGETTEXTRESPONSE']._serialized_end=1942
81
+ _globals['_BROWSEREXECUTESCRIPTREQUEST']._serialized_start=1944
82
+ _globals['_BROWSEREXECUTESCRIPTREQUEST']._serialized_end=2037
83
+ _globals['_BROWSEREXECUTESCRIPTRESPONSE']._serialized_start=2039
84
+ _globals['_BROWSEREXECUTESCRIPTRESPONSE']._serialized_end=2117
85
+ _globals['_BROWSERSCREENSHOTREQUEST']._serialized_start=2119
86
+ _globals['_BROWSERSCREENSHOTREQUEST']._serialized_end=2245
87
+ _globals['_BROWSERSCREENSHOTRESPONSE']._serialized_start=2247
88
+ _globals['_BROWSERSCREENSHOTRESPONSE']._serialized_end=2320
89
+ _globals['_BROWSERGETSTATEREQUEST']._serialized_start=2322
90
+ _globals['_BROWSERGETSTATEREQUEST']._serialized_end=2394
91
+ _globals['_BROWSERGETSTATERESPONSE']._serialized_start=2396
92
+ _globals['_BROWSERGETSTATERESPONSE']._serialized_end=2481
93
+ _globals['_BROWSERGETPAGEINFOREQUEST']._serialized_start=2483
94
+ _globals['_BROWSERGETPAGEINFOREQUEST']._serialized_end=2558
95
+ _globals['_BROWSERGETPAGEINFORESPONSE']._serialized_start=2561
96
+ _globals['_BROWSERGETPAGEINFORESPONSE']._serialized_end=3004
97
+ _globals['_BROWSERCOOKIE']._serialized_start=3007
98
+ _globals['_BROWSERCOOKIE']._serialized_end=3152
99
+ _globals['_BROWSERSETCOOKIESREQUEST']._serialized_start=3154
100
+ _globals['_BROWSERSETCOOKIESREQUEST']._serialized_end=3270
101
+ _globals['_BROWSERSETCOOKIESRESPONSE']._serialized_start=3272
102
+ _globals['_BROWSERSETCOOKIESRESPONSE']._serialized_end=3331
103
+ _globals['_BROWSERGETCOOKIESREQUEST']._serialized_start=3333
104
+ _globals['_BROWSERGETCOOKIESREQUEST']._serialized_end=3423
105
+ _globals['_BROWSERGETCOOKIESRESPONSE']._serialized_start=3425
106
+ _globals['_BROWSERGETCOOKIESRESPONSE']._serialized_end=3526
107
+ _globals['_BROWSERMOUSEMOVEREQUEST']._serialized_start=3528
108
+ _globals['_BROWSERMOUSEMOVEREQUEST']._serialized_end=3638
109
+ _globals['_BROWSERMOUSEMOVERESPONSE']._serialized_start=3640
110
+ _globals['_BROWSERMOUSEMOVERESPONSE']._serialized_end=3698
111
+ _globals['_BROWSERHOVERREQUEST']._serialized_start=3700
112
+ _globals['_BROWSERHOVERREQUEST']._serialized_end=3807
113
+ _globals['_BROWSERHOVERRESPONSE']._serialized_start=3809
114
+ _globals['_BROWSERHOVERRESPONSE']._serialized_end=3863
115
+ _globals['_BROWSERSCROLLREQUEST']._serialized_start=3866
116
+ _globals['_BROWSERSCROLLREQUEST']._serialized_end=4024
117
+ _globals['_BROWSERSCROLLRESPONSE']._serialized_start=4027
118
+ _globals['_BROWSERSCROLLRESPONSE']._serialized_end=4204
119
+ _globals['_BROWSERVALIDATESELECTORSREQUEST']._serialized_start=4207
120
+ _globals['_BROWSERVALIDATESELECTORSREQUEST']._serialized_end=4420
121
+ _globals['_BROWSERVALIDATESELECTORSREQUEST_FIELDSENTRY']._serialized_start=4375
122
+ _globals['_BROWSERVALIDATESELECTORSREQUEST_FIELDSENTRY']._serialized_end=4420
123
+ _globals['_BROWSERVALIDATESELECTORSRESPONSE']._serialized_start=4423
124
+ _globals['_BROWSERVALIDATESELECTORSRESPONSE']._serialized_end=4761
125
+ _globals['_BROWSERVALIDATESELECTORSRESPONSE_COUNTSENTRY']._serialized_start=4668
126
+ _globals['_BROWSERVALIDATESELECTORSRESPONSE_COUNTSENTRY']._serialized_end=4713
127
+ _globals['_BROWSERVALIDATESELECTORSRESPONSE_SAMPLESENTRY']._serialized_start=4715
128
+ _globals['_BROWSERVALIDATESELECTORSRESPONSE_SAMPLESENTRY']._serialized_end=4761
129
+ _globals['_BROWSEREXTRACTDATAREQUEST']._serialized_start=4763
130
+ _globals['_BROWSEREXTRACTDATAREQUEST']._serialized_end=4888
131
+ _globals['_BROWSEREXTRACTDATARESPONSE']._serialized_start=4890
132
+ _globals['_BROWSEREXTRACTDATARESPONSE']._serialized_end=4985
133
133
  # @@protoc_insertion_point(module_scope)
@@ -73,16 +73,18 @@ class BrowserNavigateResponse(_message.Message):
73
73
  def __init__(self, success: bool = ..., final_url: _Optional[str] = ..., error: _Optional[str] = ...) -> None: ...
74
74
 
75
75
  class BrowserClickRequest(_message.Message):
76
- __slots__ = ("session_id", "browser_session_id", "selector", "timeout_ms")
76
+ __slots__ = ("session_id", "browser_session_id", "selector", "timeout_ms", "move_cursor")
77
77
  SESSION_ID_FIELD_NUMBER: _ClassVar[int]
78
78
  BROWSER_SESSION_ID_FIELD_NUMBER: _ClassVar[int]
79
79
  SELECTOR_FIELD_NUMBER: _ClassVar[int]
80
80
  TIMEOUT_MS_FIELD_NUMBER: _ClassVar[int]
81
+ MOVE_CURSOR_FIELD_NUMBER: _ClassVar[int]
81
82
  session_id: str
82
83
  browser_session_id: str
83
84
  selector: str
84
85
  timeout_ms: int
85
- def __init__(self, session_id: _Optional[str] = ..., browser_session_id: _Optional[str] = ..., selector: _Optional[str] = ..., timeout_ms: _Optional[int] = ...) -> None: ...
86
+ move_cursor: bool
87
+ def __init__(self, session_id: _Optional[str] = ..., browser_session_id: _Optional[str] = ..., selector: _Optional[str] = ..., timeout_ms: _Optional[int] = ..., move_cursor: bool = ...) -> None: ...
86
88
 
87
89
  class BrowserClickResponse(_message.Message):
88
90
  __slots__ = ("success", "error")
@@ -88,11 +88,16 @@ class AsyncBrowserService(BaseService, BaseServiceMixin):
88
88
 
89
89
  return response.final_url
90
90
 
91
- async def click(self, session_id: str, selector: str, timeout_ms: int = 5000) -> None:
91
+ async def click(
92
+ self, session_id: str, selector: str, timeout_ms: int = 5000, move_cursor: bool = False
93
+ ) -> None:
92
94
  from cmdop._generated.rpc_messages.browser_pb2 import BrowserClickRequest
93
95
 
94
96
  request = BrowserClickRequest(
95
- browser_session_id=session_id, selector=selector, timeout_ms=timeout_ms
97
+ browser_session_id=session_id,
98
+ selector=selector,
99
+ timeout_ms=timeout_ms,
100
+ move_cursor=move_cursor,
96
101
  )
97
102
  response = await self._call_async(self._get_stub.BrowserClick, request)
98
103
 
@@ -2,10 +2,16 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from typing import TYPE_CHECKING, Any
5
+ from typing import TYPE_CHECKING, Any, Awaitable, Callable, TypeVar
6
6
 
7
7
  import asyncio
8
8
 
9
+ from cmdop.logging import get_logger
10
+
11
+ _log = get_logger("cmdop.browser")
12
+
13
+ T = TypeVar("T")
14
+
9
15
  from cmdop.services.browser.base.session import BaseSession
10
16
  from cmdop.services.browser.models import (
11
17
  BrowserCookie,
@@ -58,9 +64,7 @@ class AsyncBrowserSession(BaseSession):
58
64
  timeout_ms: Timeout in milliseconds
59
65
  move_cursor: If True, move cursor to element before clicking (human-like)
60
66
  """
61
- if move_cursor:
62
- await self.hover(selector, timeout_ms)
63
- await self._service.click(self._session_id, selector, timeout_ms)
67
+ await self._service.click(self._session_id, selector, timeout_ms, move_cursor)
64
68
 
65
69
  async def type(
66
70
  self,
@@ -295,15 +299,78 @@ class AsyncBrowserSession(BaseSession):
295
299
  data = parse_json_result(result) or {}
296
300
  return data.get("success", False)
297
301
 
298
- async def wait_seconds(self, seconds: float) -> None:
299
- """Wait for specified seconds."""
300
- await asyncio.sleep(seconds)
302
+ async def wait(self, ms: int, jitter: float = 0.1) -> None:
303
+ """
304
+ Wait for specified milliseconds with optional jitter.
305
+
306
+ Args:
307
+ ms: Wait time in milliseconds
308
+ jitter: Random variation ±jitter (default 10%, so 1000ms becomes 900-1100ms)
309
+ """
310
+ import random
311
+ actual = (ms / 1000) * (1 + random.uniform(-jitter, jitter))
312
+ await asyncio.sleep(actual)
313
+
314
+ async def wait_seconds(self, seconds: float, jitter: float = 0.1) -> None:
315
+ """
316
+ Wait for specified seconds with optional jitter.
317
+
318
+ Args:
319
+ seconds: Base wait time in seconds
320
+ jitter: Random variation ±jitter (default 10%, so 1.0s becomes 0.9-1.1s)
321
+ """
322
+ await self.wait(int(seconds * 1000), jitter)
301
323
 
302
324
  async def wait_random(self, min_sec: float = 0.5, max_sec: float = 1.5) -> None:
303
325
  """Wait for random time between min and max seconds."""
304
326
  import random
305
327
  await asyncio.sleep(min_sec + random.random() * (max_sec - min_sec))
306
328
 
329
+ async def with_timeout(
330
+ self,
331
+ coro: Awaitable[T],
332
+ timeout_sec: float = 60.0,
333
+ on_timeout: Callable[[], Awaitable[None]] | None = None,
334
+ ) -> tuple[T | None, bool]:
335
+ """
336
+ Run a coroutine with a timeout. Skips if it hangs.
337
+
338
+ Args:
339
+ coro: Coroutine to run
340
+ timeout_sec: Timeout in seconds (default 60)
341
+ on_timeout: Optional async cleanup function to call on timeout
342
+
343
+ Returns:
344
+ Tuple of (result, success). If timeout, returns (None, False).
345
+
346
+ Example:
347
+ # Simple usage
348
+ result, ok = await browser.with_timeout(
349
+ process_listing(browser, listing),
350
+ timeout_sec=30,
351
+ )
352
+ if not ok:
353
+ print("Skipped due to timeout")
354
+
355
+ # With cleanup
356
+ result, ok = await browser.with_timeout(
357
+ enrich_listing(browser, item),
358
+ timeout_sec=60,
359
+ on_timeout=lambda: browser.press_key('Escape'),
360
+ )
361
+ """
362
+ try:
363
+ result = await asyncio.wait_for(coro, timeout=timeout_sec)
364
+ return result, True
365
+ except asyncio.TimeoutError:
366
+ _log.warning("[timeout] Coroutine timed out after %.1fs", timeout_sec)
367
+ if on_timeout:
368
+ try:
369
+ await on_timeout()
370
+ except Exception as e:
371
+ _log.debug("[timeout] Cleanup failed: %s", e)
372
+ return None, False
373
+
307
374
  async def click_all_by_text(self, text: str, role: str = "button") -> int:
308
375
  """Click all elements containing specific text."""
309
376
  js = self._build_click_all_by_text(text, role)
@@ -88,11 +88,16 @@ class BrowserService(BaseService, BaseServiceMixin):
88
88
 
89
89
  return response.final_url
90
90
 
91
- def click(self, session_id: str, selector: str, timeout_ms: int = 5000) -> None:
91
+ def click(
92
+ self, session_id: str, selector: str, timeout_ms: int = 5000, move_cursor: bool = False
93
+ ) -> None:
92
94
  from cmdop._generated.rpc_messages.browser_pb2 import BrowserClickRequest
93
95
 
94
96
  request = BrowserClickRequest(
95
- browser_session_id=session_id, selector=selector, timeout_ms=timeout_ms
97
+ browser_session_id=session_id,
98
+ selector=selector,
99
+ timeout_ms=timeout_ms,
100
+ move_cursor=move_cursor,
96
101
  )
97
102
  response = self._call_sync(self._get_stub.BrowserClick, request)
98
103
 
@@ -3,7 +3,10 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import time
6
- from typing import TYPE_CHECKING, Any, Callable
6
+ import threading
7
+ from typing import TYPE_CHECKING, Any, Callable, TypeVar
8
+
9
+ T = TypeVar("T")
7
10
 
8
11
  from cmdop.logging import get_logger
9
12
  from cmdop.services.browser.base.session import BaseSession
@@ -72,11 +75,8 @@ class BrowserSession(BaseSession):
72
75
  timeout_ms: Timeout in milliseconds
73
76
  move_cursor: If True, move cursor to element before clicking (human-like)
74
77
  """
75
- if move_cursor:
76
- _log.debug("[click] moving cursor to %s", selector[:60])
77
- self.hover(selector, timeout_ms)
78
- _log.debug("[click] %s", selector[:60])
79
- self._service.click(self._session_id, selector, timeout_ms)
78
+ _log.debug("[click] %s%s", selector[:60], " (move_cursor)" if move_cursor else "")
79
+ self._service.click(self._session_id, selector, timeout_ms, move_cursor)
80
80
 
81
81
  def type(
82
82
  self,
@@ -494,15 +494,97 @@ class BrowserSession(BaseSession):
494
494
  data = parse_json_result(result) or {}
495
495
  return data.get("success", False)
496
496
 
497
- def wait_seconds(self, seconds: float) -> None:
498
- """Wait for specified seconds."""
499
- time.sleep(seconds)
497
+ def wait(self, ms: int, jitter: float = 0.1) -> None:
498
+ """
499
+ Wait for specified milliseconds with optional jitter.
500
+
501
+ Args:
502
+ ms: Wait time in milliseconds
503
+ jitter: Random variation ±jitter (default 10%, so 1000ms becomes 900-1100ms)
504
+ """
505
+ import random
506
+ actual = (ms / 1000) * (1 + random.uniform(-jitter, jitter))
507
+ time.sleep(actual)
508
+
509
+ def wait_seconds(self, seconds: float, jitter: float = 0.1) -> None:
510
+ """
511
+ Wait for specified seconds with optional jitter.
512
+
513
+ Args:
514
+ seconds: Base wait time in seconds
515
+ jitter: Random variation ±jitter (default 10%, so 1.0s becomes 0.9-1.1s)
516
+ """
517
+ self.wait(int(seconds * 1000), jitter)
500
518
 
501
519
  def wait_random(self, min_sec: float = 0.5, max_sec: float = 1.5) -> None:
502
520
  """Wait for random time between min and max seconds."""
503
521
  import random
504
522
  time.sleep(min_sec + random.random() * (max_sec - min_sec))
505
523
 
524
+ def with_timeout(
525
+ self,
526
+ fn: Callable[[], T],
527
+ timeout_sec: float = 60.0,
528
+ on_timeout: Callable[[], None] | None = None,
529
+ ) -> tuple[T | None, bool]:
530
+ """
531
+ Run a function with a timeout. Skips if it hangs.
532
+
533
+ Args:
534
+ fn: Function to run (no arguments, use lambda/closure for args)
535
+ timeout_sec: Timeout in seconds (default 60)
536
+ on_timeout: Optional cleanup function to call on timeout
537
+
538
+ Returns:
539
+ Tuple of (result, success). If timeout, returns (None, False).
540
+
541
+ Example:
542
+ # Simple usage
543
+ result, ok = browser.with_timeout(
544
+ lambda: process_listing(browser, listing),
545
+ timeout_sec=30,
546
+ )
547
+ if not ok:
548
+ print("Skipped due to timeout")
549
+ continue
550
+
551
+ # With cleanup
552
+ result, ok = browser.with_timeout(
553
+ lambda: enrich_listing(browser, item),
554
+ timeout_sec=60,
555
+ on_timeout=lambda: browser.press_key('Escape'),
556
+ )
557
+ """
558
+ result_container: list[T | None] = [None]
559
+ exception_container: list[Exception | None] = [None]
560
+ completed = threading.Event()
561
+
562
+ def target() -> None:
563
+ try:
564
+ result_container[0] = fn()
565
+ except Exception as e:
566
+ exception_container[0] = e
567
+ finally:
568
+ completed.set()
569
+
570
+ thread = threading.Thread(target=target, daemon=True)
571
+ thread.start()
572
+
573
+ if completed.wait(timeout=timeout_sec):
574
+ # Completed in time
575
+ if exception_container[0]:
576
+ raise exception_container[0]
577
+ return result_container[0], True
578
+ else:
579
+ # Timeout - run cleanup if provided
580
+ _log.warning("[timeout] Function timed out after %.1fs", timeout_sec)
581
+ if on_timeout:
582
+ try:
583
+ on_timeout()
584
+ except Exception as e:
585
+ _log.debug("[timeout] Cleanup failed: %s", e)
586
+ return None, False
587
+
506
588
  def click_all_by_text(self, text: str, role: str = "button") -> int:
507
589
  """
508
590
  Click all elements containing specific text.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cmdop
3
- Version: 0.1.19
3
+ Version: 0.1.21
4
4
  Summary: Python SDK for CMDOP agent interaction
5
5
  Project-URL: Homepage, https://cmdop.com
6
6
  Project-URL: Documentation, https://cmdop.com
@@ -204,6 +204,26 @@ with client.browser.create_session() as b:
204
204
  | `close_modal()` | Close dialogs |
205
205
  | `press_key(key, selector)` | Press keyboard key |
206
206
  | `get/set_cookies()` | Cookie management |
207
+ | `with_timeout(fn, sec, cleanup)` | Run with timeout, skip if hangs |
208
+
209
+ **with_timeout() - Smart timeout for long operations:**
210
+ ```python
211
+ # Sync
212
+ result, ok = browser.with_timeout(
213
+ lambda: process_item(browser, item),
214
+ timeout_sec=60,
215
+ on_timeout=lambda: browser.press_key('Escape'),
216
+ )
217
+ if not ok:
218
+ print("Skipped - timed out")
219
+
220
+ # Async
221
+ result, ok = await browser.with_timeout(
222
+ process_item(browser, item), # coroutine
223
+ timeout_sec=60,
224
+ on_timeout=lambda: browser.press_key('Escape'),
225
+ )
226
+ ```
207
227
 
208
228
  **scroll() parameters:**
209
229
  - `direction`: "up", "down", "left", "right"
@@ -1,4 +1,4 @@
1
- cmdop/__init__.py,sha256=GIMSV8jpM2MhQN21a6h0vhllsJHdMOFrBWR4Oj2oW94,5200
1
+ cmdop/__init__.py,sha256=36xYFVpp83AE5E8N5T1qbrIaFCC2sSXQJRha5fXpyD0,5200
2
2
  cmdop/client.py,sha256=NzCBMIAj2vnVzwU1OUttW_kpgJh5aRtmixOwa9HUUUg,14924
3
3
  cmdop/config.py,sha256=vpw1aGCyS4NKlZyzVur81Lt06QmN3FnscZji0bypUi0,4398
4
4
  cmdop/discovery.py,sha256=HNxSOa5tSuG7ppfFs21XdviW5ucjpRswVPguhX5j8Dg,7479
@@ -80,8 +80,8 @@ cmdop/_generated/rpc_messages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5N
80
80
  cmdop/_generated/rpc_messages/agent_pb2.py,sha256=1KCs4kwuuTwZm9Y8ql7t6Jjsutuepbq85E6DGVDWa84,3393
81
81
  cmdop/_generated/rpc_messages/agent_pb2.pyi,sha256=F7gy0PQlJ4cRQCli7U4v5A87-Lsw2_x0nV4hFXG1qj0,3866
82
82
  cmdop/_generated/rpc_messages/agent_pb2_grpc.py,sha256=ABbaG1eMcaWPZKdPoom2F-IjjVqjYNMDOjMp8X6QLHE,898
83
- cmdop/_generated/rpc_messages/browser_pb2.py,sha256=nez7IJkPR5gsr2mHey-cE0UgeQB_H9PxAAfNB_gHALE,16823
84
- cmdop/_generated/rpc_messages/browser_pb2.pyi,sha256=aPKlDGOPxGZoFHSbMBziRvC4U--I6ZY0ZSFgtRTKm9A,25118
83
+ cmdop/_generated/rpc_messages/browser_pb2.py,sha256=VAmjY4WUDXkpYOkS-q6w5qplbpIQGLmqDiS6b3O6UYE,16875
84
+ cmdop/_generated/rpc_messages/browser_pb2.pyi,sha256=wA51sejGuiCfj9nEpAeymZwkvv1saQyIbAH5Ntlz0fc,25225
85
85
  cmdop/_generated/rpc_messages/browser_pb2_grpc.py,sha256=P8F8QYLT_kedGq7AXj37Us2hFQOaevdfYMHl0tTdY48,900
86
86
  cmdop/_generated/rpc_messages/device_pb2.py,sha256=nKj7axhR-FVSQoQUd4ENXpc5PU_UCjSlExajLIoeZY8,2435
87
87
  cmdop/_generated/rpc_messages/device_pb2.pyi,sha256=u5oLfTHuOSpYwMiVe2tw0vVQLLFvYgK3lxw-Vky1ZkA,1974
@@ -170,8 +170,8 @@ cmdop/services/browser/__init__.py,sha256=BFdrmtvWEiBztds-YITE-8aW4-7-B8jbsQaPsC
170
170
  cmdop/services/browser/models.py,sha256=qJ3da8hPvQn7Vtiqg3xg49G-GioidQGPPuLk2c_IBC4,2656
171
171
  cmdop/services/browser/parsing.py,sha256=0hQAy-0ZwJqtmhEqHO3EEdVB3iYmyhXRdouN_dCbig8,3820
172
172
  cmdop/services/browser/aio/__init__.py,sha256=7DI4Q0LZaAdu3fl8D1SaZ8E3LCGpTw97lqca1pOi5Kk,241
173
- cmdop/services/browser/aio/service.py,sha256=PTGBJtiS7xxU_4ApGqbyBQqGxqIPFlLcgJgU9GmCSk4,15071
174
- cmdop/services/browser/aio/session.py,sha256=zE6e2fztQL3LgoAm43z_sgbJ98QNoVTswfnvq9TDzCQ,12198
173
+ cmdop/services/browser/aio/service.py,sha256=YDn1n6SwZi2SUhooPROjT7WCJX05WFDh71pOSS10KMI,15174
174
+ cmdop/services/browser/aio/session.py,sha256=_aVbEQ8-KJWLC6e-R3DGwS3Stw9WzXyoKXdtOqm3xIU,14431
175
175
  cmdop/services/browser/base/__init__.py,sha256=mgG4y324zSDy-13uQiTg6rlFpaQFLc67ynbykRZuMms,227
176
176
  cmdop/services/browser/base/service.py,sha256=w8foDUGZcD4HyF5eyLZUFxbx_fctAFsYRovvsksi3l4,1584
177
177
  cmdop/services/browser/base/session.py,sha256=5-UiBxG3t5TtATih41JaPR9PdmIKfeICTM1RbhRdBok,3773
@@ -181,8 +181,8 @@ cmdop/services/browser/js/fetch.py,sha256=WPy_H4LLkneSx06wpfnx4Sx_0Okf2ENXi6bveC
181
181
  cmdop/services/browser/js/interaction.py,sha256=zdCy1l833k_a470qm3Q9QLKQrbSQ5tYgTUa4rVGailc,5444
182
182
  cmdop/services/browser/js/scroll.py,sha256=yiOMAaR8ac8jCiWgNCVIt1pUGxdvktMUtzv-AVAE-2Q,7823
183
183
  cmdop/services/browser/sync/__init__.py,sha256=sFePvIsWqhaeCU9fw_ZyOITeeEHvZx4Gtcp8W3KBKG0,222
184
- cmdop/services/browser/sync/service.py,sha256=HGLjGdAmmiljyub2q5KSkNSD2zB8tsk4n92vJT18mCs,15364
185
- cmdop/services/browser/sync/session.py,sha256=AnKNS-tjo5SNIC7DsQ6H6FNMG_C28_Uxd2R4J1z-v4Y,19047
184
+ cmdop/services/browser/sync/service.py,sha256=T-GnxIK2ZmE3KSe5eIsEj63ClQOyxJffxueHtq8BmPI,15467
185
+ cmdop/services/browser/sync/session.py,sha256=5wm5WXAQJFEv1R6B2ku0cNePLLbzEwojWqxSFxSBvw8,21786
186
186
  cmdop/streaming/__init__.py,sha256=kG9UlJRqv8ndcwKMzWUddPlZT61pFO_Uf_c08A_8TxA,877
187
187
  cmdop/streaming/base.py,sha256=r7Q2QlRxgULzs9vlSGcOC_fwAQ_cF3Z3M7WsPQtxG5I,2990
188
188
  cmdop/streaming/handlers.py,sha256=FDEhADmCEFRbifvr9dU1X3C-K_96noz89Bl3tuDa_rQ,2616
@@ -193,7 +193,7 @@ cmdop/transport/base.py,sha256=2pkV8i9epgp_21dyReCfX47abRUrnALm0W5BXb-Fuz0,5571
193
193
  cmdop/transport/discovery.py,sha256=rcGAuVrR1l6jwcP0dqZxVhX1NsFK7sRHygFMCLmmUbA,10673
194
194
  cmdop/transport/local.py,sha256=ob6tWVxSdKwblHSMK8CkgjyuSdQoAeWgy5OAUd5ZNuE,7411
195
195
  cmdop/transport/remote.py,sha256=FNVqus9wOv7LlxKarXjLmSyvJiHwhvPbNDOPv1IQkmE,4329
196
- cmdop-0.1.19.dist-info/METADATA,sha256=SCm7Flcv1Y_LYvoRvU-Kz3aOgxPnZCPF5CE-HcZK-z0,7019
197
- cmdop-0.1.19.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
198
- cmdop-0.1.19.dist-info/licenses/LICENSE,sha256=6hyzbI1QVXW6B-XT7PaQ6UG9lns11Y_nnap8uUKGUqo,1062
199
- cmdop-0.1.19.dist-info/RECORD,,
196
+ cmdop-0.1.21.dist-info/METADATA,sha256=Ewv9fVmpTmxU7NWpmQzyEWWB0ce6dBjpJnsuQ-n4mso,7532
197
+ cmdop-0.1.21.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
198
+ cmdop-0.1.21.dist-info/licenses/LICENSE,sha256=6hyzbI1QVXW6B-XT7PaQ6UG9lns11Y_nnap8uUKGUqo,1062
199
+ cmdop-0.1.21.dist-info/RECORD,,
File without changes