diff --git a/packages/midscene/src/ai-model/automation/planning.ts b/packages/midscene/src/ai-model/automation/planning.ts index e25a379f..797e2ec4 100644 --- a/packages/midscene/src/ai-model/automation/planning.ts +++ b/packages/midscene/src/ai-model/automation/planning.ts @@ -32,7 +32,7 @@ export function systemPromptToTaskPlanning() { 1. The actions you composed MUST be based on the page context information you get. Instead of making up actions that are not related to the page context. 2. In most cases, you should Locate one element first, then do other actions on it. For example, alway Find one element, then hover on it. But if you think it's necessary to do other actions first (like global scroll, global key press), you can do that. - If the planned tasks are sequential and tasks may appear only after the execution of previous tasks, this is considered normal. If any errors occur during task planning (such as the page content being irrelevant to the task or the mentioned element not existing), please return the error message with an explanation in the errors field. Thoughts, prompts, and error messages should all be in the same language as the user query. + If the planned tasks are sequential and tasks may appear only after the execution of previous tasks, this is considered normal. Thoughts, prompts, and error messages should all be in the same language as the user query. Return in the following JSON format: { diff --git a/packages/midscene/tests/ai/automation/__snapshots__/planning.test.ts.snap b/packages/midscene/tests/ai/automation/__snapshots__/planning.test.ts.snap index 76cc72ca..1bc807ff 100644 --- a/packages/midscene/tests/ai/automation/__snapshots__/planning.test.ts.snap +++ b/packages/midscene/tests/ai/automation/__snapshots__/planning.test.ts.snap @@ -1,29 +1,5 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`automation - planning > basic run 1`] = ` -{ - "timeMs": 3500, -} -`; - -exports[`automation - planning > basic run 2`] = ` -{ - "value": "Enter", -} -`; - -exports[`automation - planning coze > basic run 1`] = ` -{ - "timeMs": 3500, -} -`; - -exports[`automation - planning coze > basic run 2`] = ` -{ - "value": "Enter", -} -`; - exports[`automation - planning openAI > basic run 1`] = ` { "timeMs": 3500, diff --git a/packages/midscene/tests/ai/extract/__snapshots__/extract.test.ts.snap b/packages/midscene/tests/ai/extract/__snapshots__/extract.test.ts.snap index 7c66617d..82bc8587 100644 --- a/packages/midscene/tests/ai/extract/__snapshots__/extract.test.ts.snap +++ b/packages/midscene/tests/ai/extract/__snapshots__/extract.test.ts.snap @@ -1,38 +1,5 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`assert coze > todo 1`] = ` -{ - "data": [ - "Learn Python", - "Learn Rust", - "Learn AI", - ], - "errors": [], - "language": "en", -} -`; - -exports[`assert coze > todo obj 1`] = ` -{ - "data": [ - { - "checked": false, - "text": "Learn Python", - }, - { - "checked": false, - "text": "Learn Rust", - }, - { - "checked": false, - "text": "Learn AI", - }, - ], - "errors": [], - "language": "en", -} -`; - exports[`assert openAI > online order 1`] = ` { "data": [ diff --git a/packages/midscene/tests/ai/inspector/__snapshots__/online_order_inspector.test.ts.snap b/packages/midscene/tests/ai/inspector/__snapshots__/online_order_inspector.test.ts.snap index aa0619e0..f47ae389 100644 --- a/packages/midscene/tests/ai/inspector/__snapshots__/online_order_inspector.test.ts.snap +++ b/packages/midscene/tests/ai/inspector/__snapshots__/online_order_inspector.test.ts.snap @@ -12,7 +12,7 @@ { "elements": [ { - "id": "ba59909699", + "id": "e666c51ff8", "indexId": "2", }, ], @@ -46,11 +46,11 @@ { "elements": [ { - "id": "580cfae23c", + "id": "fadfa10182", "indexId": "23", }, { - "id": "925c254744", + "id": "001617dbf8", "indexId": "29", }, ], diff --git a/packages/midscene/tests/ai/inspector/__snapshots__/todo_inspector.test.ts.snap b/packages/midscene/tests/ai/inspector/__snapshots__/todo_inspector.test.ts.snap index ea51c717..50e43b28 100644 --- a/packages/midscene/tests/ai/inspector/__snapshots__/todo_inspector.test.ts.snap +++ b/packages/midscene/tests/ai/inspector/__snapshots__/todo_inspector.test.ts.snap @@ -12,7 +12,7 @@ { "elements": [ { - "id": "b5bacc879a", + "id": "e477ad490a", "indexId": "8", }, ], @@ -42,7 +42,7 @@ { "elements": [ { - "id": "0f8f471e06", + "id": "284ba7f2b3", "indexId": "15", }, ], diff --git a/packages/midscene/tests/ai/inspector/test-data/githubstatus/element-snapshot.json b/packages/midscene/tests/ai/inspector/test-data/githubstatus/element-snapshot.json index db9188b6..959c9ed1 100644 --- a/packages/midscene/tests/ai/inspector/test-data/githubstatus/element-snapshot.json +++ b/packages/midscene/tests/ai/inspector/test-data/githubstatus/element-snapshot.json @@ -1,214 +1,178 @@ [ { - "id": "2e61aa0fa8", + "id": "95bc8ef0a3", "indexId": "1", - "nodeHashId": "2e61aa0fa8", + "nodeHashId": "95bc8ef0a3", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".header.d-md-flex.flex-md-justify-between.flex-md-items-center.px-4.py-3.text-center.text-md-left.bg-white.box-shadow-large", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='2e61aa0fa8']", - "center": [960, 37], - "content": "GitHub Octicon logo\n \n \n Help\n Community\n Status\n \n \n \n GitHub.com\n Twitter\n \n \n \n\n \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n x\n \n \n \n \n \n Get email notifications whenever GitHub creates, updates or resolves an incident.\n \n \n \n \n Email address:\n \n \n \n Enter OTP:\n \n Resend OTP in: seconds \n \n Didn't receive the OTP?\n Resend OTP \n \n \n \n \n By subscribing you agree to our Privacy Policy. This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.\n \n\n \n \n Get text message notifications whenever GitHub creates or resolves an incident.\n \n \n \n \n \n \n \n Country code:\n \n Afghanistan (+93)\nAlbania (+355)\nAlgeria (+213)\nAmerican Samoa (+1)\nAndorra (+376)\nAngola (+244)\nAnguilla (+1)\nAntigua and Barbuda (+1)\nArgentina (+54)\nArmenia (+374)\nAruba (+297)\nAustralia/Cocos/Christmas Island (+61)\nAustria (+43)\nAzerbaijan (+994)\nBahamas (+1)\nBahrain (+973)\nBangladesh (+880)\nBarbados (+1)\nBelarus (+375)\nBelgium (+32)\nBelize (+501)\nBenin (+229)\nBermuda (+1)\nBolivia (+591)\nBosnia and Herzegovina (+387)\nBotswana (+267)\nBrazil (+55)\nBrunei (+673)\nBulgaria (+359)\nBurkina Faso (+226)\nBurundi (+257)\nCambodia (+855)\nCameroon (+237)\nCanada (+1)\nCape Verde (+238)\nCayman Islands (+1)\nCentral Africa (+236)\nChad (+235)\nChile (+56)\nChina (+86)\nColombia (+57)\nComoros (+269)\nCongo (+242)\nCongo, Dem Rep (+243)\nCosta Rica (+506)\nCroatia (+385)\nCyprus (+357)\nCzech Republic (+420)\nDenmark (+45)\nDjibouti (+253)\nDominica (+1)\nDominican Republic (+1)\nEgypt (+20)\nEl Salvador (+503)\nEquatorial Guinea (+240)\nEstonia (+372)\nEthiopia (+251)\nFaroe Islands (+298)\nFiji (+679)\nFinland/Aland Islands (+358)\nFrance (+33)\nFrench Guiana (+594)\nFrench Polynesia (+689)\nGabon (+241)\nGambia (+220)\nGeorgia (+995)\nGermany (+49)\nGhana (+233)\nGibraltar (+350)\nGreece (+30)\nGreenland (+299)\nGrenada (+1)\nGuadeloupe (+590)\nGuam (+1)\nGuatemala (+502)\nGuinea (+224)\nGuyana (+592)\nHaiti (+509)\nHonduras (+504)\nHong Kong (+852)\nHungary (+36)\nIceland (+354)\nIndia (+91)\nIndonesia (+62)\nIraq (+964)\nIreland (+353)\nIsrael (+972)\nItaly (+39)\nJamaica (+1)\nJapan (+81)\nJordan (+962)\nKenya (+254)\nKorea, Republic of (+82)\nKosovo (+383)\nKuwait (+965)\nKyrgyzstan (+996)\nLaos (+856)\nLatvia (+371)\nLebanon (+961)\nLesotho (+266)\nLiberia (+231)\nLibya (+218)\nLiechtenstein (+423)\nLithuania (+370)\nLuxembourg (+352)\nMacao (+853)\nMacedonia (+389)\nMadagascar (+261)\nMalawi (+265)\nMalaysia (+60)\nMaldives (+960)\nMali (+223)\nMalta (+356)\nMartinique (+596)\nMauritania (+222)\nMauritius (+230)\nMexico (+52)\nMonaco (+377)\nMongolia (+976)\nMontenegro (+382)\nMontserrat (+1)\nMorocco/Western Sahara (+212)\nMozambique (+258)\nNamibia (+264)\nNepal (+977)\nNetherlands (+31)\nNew Zealand (+64)\nNicaragua (+505)\nNiger (+227)\nNigeria (+234)\nNorway (+47)\nOman (+968)\nPakistan (+92)\nPalestinian Territory (+970)\nPanama (+507)\nParaguay (+595)\nPeru (+51)\nPhilippines (+63)\nPoland (+48)\nPortugal (+351)\nPuerto Rico (+1)\nQatar (+974)\nReunion/Mayotte (+262)\nRomania (+40)\nRussia/Kazakhstan (+7)\nRwanda (+250)\nSamoa (+685)\nSan Marino (+378)\nSaudi Arabia (+966)\nSenegal (+221)\nSerbia (+381)\nSeychelles (+248)\nSierra Leone (+232)\nSingapore (+65)\nSlovakia (+421)\nSlovenia (+386)\nSouth Africa (+27)\nSpain (+34)\nSri Lanka (+94)\nSt Kitts and Nevis (+1)\nSt Lucia (+1)\nSt Vincent Grenadines (+1)\nSudan (+249)\nSuriname (+597)\nSwaziland (+268)\nSweden (+46)\nSwitzerland (+41)\nTaiwan (+886)\nTajikistan (+992)\nTanzania (+255)\nThailand (+66)\nTogo (+228)\nTonga (+676)\nTrinidad and Tobago (+1)\nTunisia (+216)\nTurkey (+90)\nTurks and Caicos Islands (+1)\nUganda (+256)\nUkraine (+380)\nUnited Arab Emirates (+971)\nUnited Kingdom (+44)\nUnited States (+1)\nUruguay (+598)\nUzbekistan (+998)\nVenezuela (+58)\nVietnam (+84)\nVirgin Islands, British (+1)\nVirgin Islands, U.S. (+1)\nYemen (+967)\nZambia (+260)\nZimbabwe (+263)\n \n Phone number:\n \n \n \n \n Change number\n Enter OTP:\n \n Resend OTP in: 30 seconds \n \n Didn't receive the OTP?\n Resend OTP \n \n \n \n \n\n \n \n Message and data rates may apply. By subscribing you agree to our Privacy Policy, the Atlassian Terms of Service, and the Atlassian Privacy Policy. This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.\n \n\n \n \n Get incident updates and maintenance status messages in Slack.\n \n Subscribe via Slack\n By subscribing you acknowledge our Privacy Policy. In addition, you agree to the Atlassian Cloud Terms of Service and acknowledge Atlassian's Privacy Policy.\n \n\n\n \n \n Get webhook notifications whenever GitHub creates an incident, updates an incident, resolves an incident or changes a component status.\n \n \n \n \n Webhook URL:\n \n The URL we should send the webhooks to\n \n \n\n \n \n Email address:\n \n We'll send you email if your endpoint fails\n \n \n\n \n \n By subscribing you agree to our Privacy Policy. This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.\n\n \n\n \n \n or \n view our profile.\n \n .twitter-follow-button {\n margin-bottom: -6px;\n }\n \n\n !function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');\n \n\n \n Visit our support site.\n \n\n \n Get the Atom Feed or RSS Feed.", + "center": [41, 37], + "content": "Help", "rect": { - "left": 0, - "top": 0, - "width": 1920, - "height": 73 - } + "left": 24, + "top": 27, + "width": 34, + "height": 19 + }, + "htmlNode": null }, { - "id": "dea73b0ace", + "id": "d650cde5be", "indexId": "2", - "nodeHashId": "dea73b0ace", + "nodeHashId": "d650cde5be", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "href": "/", - "class": ".text-gray-dark", - "aria-label": "GitHub Octicon logo", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='dea73b0ace']", - "center": [960, 36], - "content": "GitHub Octicon logo", + "center": [84, 37], + "content": "", "rect": { - "left": 944, - "top": 20, - "width": 32, - "height": 32 - } + "left": 82, + "top": 27, + "width": 4, + "height": 19 + }, + "htmlNode": null }, { - "id": "5c2d0fc07e", + "id": "7a0b5ce201", "indexId": "3", - "nodeHashId": "5c2d0fc07e", + "nodeHashId": "7a0b5ce201", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".f4.list-style-none.py-2.mt-2.mt-md-0", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='5c2d0fc07e']", - "center": [399, 36], - "content": "Help\n Community\n Status", + "center": [128, 37], + "content": "Community", "rect": { - "left": 24, - "top": 16, - "width": 749, - "height": 40 - } + "left": 86, + "top": 27, + "width": 83, + "height": 19 + }, + "htmlNode": null }, { - "id": "7480b80cb3", + "id": "fca17c24e0", "indexId": "4", - "nodeHashId": "7480b80cb3", + "nodeHashId": "fca17c24e0", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".mr-3.mr-lg-4.py-2", - "href": "https://help.github.com", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='7480b80cb3']", - "center": [41, 37], - "content": "Help", + "center": [195, 37], + "content": "", "rect": { - "left": 24, - "top": 19, - "width": 34, - "height": 35 - } - }, - { - "id": "f3a0bad871", - "indexId": "5", - "nodeHashId": "f3a0bad871", - "attributes": { - "class": ".mr-3.mr-lg-4.py-2", - "href": "https://github.community", - "nodeType": "TEXT Node" + "left": 193, + "top": 27, + "width": 4, + "height": 19 }, - "locator": "[_midscene_retrieve_task_id='f3a0bad871']", - "center": [128, 37], - "content": "Community", - "rect": { - "left": 86, - "top": 19, - "width": 83, - "height": 35 - } + "htmlNode": null }, { - "id": "2b27b9d4f4", - "indexId": "6", - "nodeHashId": "2b27b9d4f4", + "id": "bf362a2d43", + "indexId": "5", + "nodeHashId": "bf362a2d43", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".py-2.text-gray", - "href": "/", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='2b27b9d4f4']", "center": [220, 37], "content": "Status", "rect": { "left": 197, - "top": 19, + "top": 27, "width": 46, - "height": 35 - } - }, - { - "id": "40bf454063", - "indexId": "7", - "nodeHashId": "40bf454063", - "attributes": { - "class": ".f4.list-style-none.py-2.text-md-right", - "nodeType": "TEXT Node" + "height": 19 }, - "locator": "[_midscene_retrieve_task_id='40bf454063']", - "center": [1522, 36], - "content": "GitHub.com\n Twitter\n \n \n \n\n \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n x\n \n \n \n \n \n Get email notifications whenever GitHub creates, updates or resolves an incident.\n \n \n \n \n Email address:\n \n \n \n Enter OTP:\n \n Resend OTP in: seconds \n \n Didn't receive the OTP?\n Resend OTP \n \n \n \n \n By subscribing you agree to our Privacy Policy. This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.\n \n\n \n \n Get text message notifications whenever GitHub creates or resolves an incident.\n \n \n \n \n \n \n \n Country code:\n \n Afghanistan (+93)\nAlbania (+355)\nAlgeria (+213)\nAmerican Samoa (+1)\nAndorra (+376)\nAngola (+244)\nAnguilla (+1)\nAntigua and Barbuda (+1)\nArgentina (+54)\nArmenia (+374)\nAruba (+297)\nAustralia/Cocos/Christmas Island (+61)\nAustria (+43)\nAzerbaijan (+994)\nBahamas (+1)\nBahrain (+973)\nBangladesh (+880)\nBarbados (+1)\nBelarus (+375)\nBelgium (+32)\nBelize (+501)\nBenin (+229)\nBermuda (+1)\nBolivia (+591)\nBosnia and Herzegovina (+387)\nBotswana (+267)\nBrazil (+55)\nBrunei (+673)\nBulgaria (+359)\nBurkina Faso (+226)\nBurundi (+257)\nCambodia (+855)\nCameroon (+237)\nCanada (+1)\nCape Verde (+238)\nCayman Islands (+1)\nCentral Africa (+236)\nChad (+235)\nChile (+56)\nChina (+86)\nColombia (+57)\nComoros (+269)\nCongo (+242)\nCongo, Dem Rep (+243)\nCosta Rica (+506)\nCroatia (+385)\nCyprus (+357)\nCzech Republic (+420)\nDenmark (+45)\nDjibouti (+253)\nDominica (+1)\nDominican Republic (+1)\nEgypt (+20)\nEl Salvador (+503)\nEquatorial Guinea (+240)\nEstonia (+372)\nEthiopia (+251)\nFaroe Islands (+298)\nFiji (+679)\nFinland/Aland Islands (+358)\nFrance (+33)\nFrench Guiana (+594)\nFrench Polynesia (+689)\nGabon (+241)\nGambia (+220)\nGeorgia (+995)\nGermany (+49)\nGhana (+233)\nGibraltar (+350)\nGreece (+30)\nGreenland (+299)\nGrenada (+1)\nGuadeloupe (+590)\nGuam (+1)\nGuatemala (+502)\nGuinea (+224)\nGuyana (+592)\nHaiti (+509)\nHonduras (+504)\nHong Kong (+852)\nHungary (+36)\nIceland (+354)\nIndia (+91)\nIndonesia (+62)\nIraq (+964)\nIreland (+353)\nIsrael (+972)\nItaly (+39)\nJamaica (+1)\nJapan (+81)\nJordan (+962)\nKenya (+254)\nKorea, Republic of (+82)\nKosovo (+383)\nKuwait (+965)\nKyrgyzstan (+996)\nLaos (+856)\nLatvia (+371)\nLebanon (+961)\nLesotho (+266)\nLiberia (+231)\nLibya (+218)\nLiechtenstein (+423)\nLithuania (+370)\nLuxembourg (+352)\nMacao (+853)\nMacedonia (+389)\nMadagascar (+261)\nMalawi (+265)\nMalaysia (+60)\nMaldives (+960)\nMali (+223)\nMalta (+356)\nMartinique (+596)\nMauritania (+222)\nMauritius (+230)\nMexico (+52)\nMonaco (+377)\nMongolia (+976)\nMontenegro (+382)\nMontserrat (+1)\nMorocco/Western Sahara (+212)\nMozambique (+258)\nNamibia (+264)\nNepal (+977)\nNetherlands (+31)\nNew Zealand (+64)\nNicaragua (+505)\nNiger (+227)\nNigeria (+234)\nNorway (+47)\nOman (+968)\nPakistan (+92)\nPalestinian Territory (+970)\nPanama (+507)\nParaguay (+595)\nPeru (+51)\nPhilippines (+63)\nPoland (+48)\nPortugal (+351)\nPuerto Rico (+1)\nQatar (+974)\nReunion/Mayotte (+262)\nRomania (+40)\nRussia/Kazakhstan (+7)\nRwanda (+250)\nSamoa (+685)\nSan Marino (+378)\nSaudi Arabia (+966)\nSenegal (+221)\nSerbia (+381)\nSeychelles (+248)\nSierra Leone (+232)\nSingapore (+65)\nSlovakia (+421)\nSlovenia (+386)\nSouth Africa (+27)\nSpain (+34)\nSri Lanka (+94)\nSt Kitts and Nevis (+1)\nSt Lucia (+1)\nSt Vincent Grenadines (+1)\nSudan (+249)\nSuriname (+597)\nSwaziland (+268)\nSweden (+46)\nSwitzerland (+41)\nTaiwan (+886)\nTajikistan (+992)\nTanzania (+255)\nThailand (+66)\nTogo (+228)\nTonga (+676)\nTrinidad and Tobago (+1)\nTunisia (+216)\nTurkey (+90)\nTurks and Caicos Islands (+1)\nUganda (+256)\nUkraine (+380)\nUnited Arab Emirates (+971)\nUnited Kingdom (+44)\nUnited States (+1)\nUruguay (+598)\nUzbekistan (+998)\nVenezuela (+58)\nVietnam (+84)\nVirgin Islands, British (+1)\nVirgin Islands, U.S. (+1)\nYemen (+967)\nZambia (+260)\nZimbabwe (+263)\n \n Phone number:\n \n \n \n \n Change number\n Enter OTP:\n \n Resend OTP in: 30 seconds \n \n Didn't receive the OTP?\n Resend OTP \n \n \n \n \n\n \n \n Message and data rates may apply. By subscribing you agree to our Privacy Policy, the Atlassian Terms of Service, and the Atlassian Privacy Policy. This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.\n \n\n \n \n Get incident updates and maintenance status messages in Slack.\n \n Subscribe via Slack\n By subscribing you acknowledge our Privacy Policy. In addition, you agree to the Atlassian Cloud Terms of Service and acknowledge Atlassian's Privacy Policy.\n \n\n\n \n \n Get webhook notifications whenever GitHub creates an incident, updates an incident, resolves an incident or changes a component status.\n \n \n \n \n Webhook URL:\n \n The URL we should send the webhooks to\n \n \n\n \n \n Email address:\n \n We'll send you email if your endpoint fails\n \n \n\n \n \n By subscribing you agree to our Privacy Policy. This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.\n\n \n\n \n \n or \n view our profile.\n \n .twitter-follow-button {\n margin-bottom: -6px;\n }\n \n\n !function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');\n \n\n \n Visit our support site.\n \n\n \n Get the Atom Feed or RSS Feed.", - "rect": { - "left": 1147, - "top": 16, - "width": 749, - "height": 40 - } + "htmlNode": null }, { - "id": "44c2ed902a", - "indexId": "8", - "nodeHashId": "44c2ed902a", + "id": "f8638670eb", + "indexId": "6", + "nodeHashId": "f8638670eb", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".py-2", - "href": "https://github.com", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='44c2ed902a']", "center": [1586, 37], "content": "GitHub.com", "rect": { "left": 1543, - "top": 19, + "top": 27, "width": 86, - "height": 35 - } + "height": 19 + }, + "htmlNode": null }, { - "id": "7d552ded8a", - "indexId": "9", - "nodeHashId": "7d552ded8a", + "id": "7cce020277", + "indexId": "7", + "nodeHashId": "7cce020277", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".py-2.ml-3.ml-lg-4", - "href": "https://twitter.com/githubstatus", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='7d552ded8a']", - "center": [1683, 37], - "content": "Twitter", + "center": [1632, 37], + "content": "", "rect": { - "left": 1658, - "top": 19, - "width": 50, - "height": 35 - } + "left": 1630, + "top": 27, + "width": 4, + "height": 19 + }, + "htmlNode": null }, { - "id": "c6687feb44", - "indexId": "10", - "nodeHashId": "c6687feb44", + "id": "1b362e9b9f", + "indexId": "8", + "nodeHashId": "1b362e9b9f", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".d-inline.py-2.ml-3.ml-lg-4", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='c6687feb44']", - "center": [1816, 37], - "content": "x\n \n \n \n \n \n Get email notifications whenever GitHub creates, updates or resolves an incident.\n \n \n \n \n Email address:\n \n \n \n Enter OTP:\n \n Resend OTP in: seconds \n \n Didn't receive the OTP?\n Resend OTP \n \n \n \n \n By subscribing you agree to our Privacy Policy. This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.\n \n\n \n \n Get text message notifications whenever GitHub creates or resolves an incident.\n \n \n \n \n \n \n \n Country code:\n \n Afghanistan (+93)\nAlbania (+355)\nAlgeria (+213)\nAmerican Samoa (+1)\nAndorra (+376)\nAngola (+244)\nAnguilla (+1)\nAntigua and Barbuda (+1)\nArgentina (+54)\nArmenia (+374)\nAruba (+297)\nAustralia/Cocos/Christmas Island (+61)\nAustria (+43)\nAzerbaijan (+994)\nBahamas (+1)\nBahrain (+973)\nBangladesh (+880)\nBarbados (+1)\nBelarus (+375)\nBelgium (+32)\nBelize (+501)\nBenin (+229)\nBermuda (+1)\nBolivia (+591)\nBosnia and Herzegovina (+387)\nBotswana (+267)\nBrazil (+55)\nBrunei (+673)\nBulgaria (+359)\nBurkina Faso (+226)\nBurundi (+257)\nCambodia (+855)\nCameroon (+237)\nCanada (+1)\nCape Verde (+238)\nCayman Islands (+1)\nCentral Africa (+236)\nChad (+235)\nChile (+56)\nChina (+86)\nColombia (+57)\nComoros (+269)\nCongo (+242)\nCongo, Dem Rep (+243)\nCosta Rica (+506)\nCroatia (+385)\nCyprus (+357)\nCzech Republic (+420)\nDenmark (+45)\nDjibouti (+253)\nDominica (+1)\nDominican Republic (+1)\nEgypt (+20)\nEl Salvador (+503)\nEquatorial Guinea (+240)\nEstonia (+372)\nEthiopia (+251)\nFaroe Islands (+298)\nFiji (+679)\nFinland/Aland Islands (+358)\nFrance (+33)\nFrench Guiana (+594)\nFrench Polynesia (+689)\nGabon (+241)\nGambia (+220)\nGeorgia (+995)\nGermany (+49)\nGhana (+233)\nGibraltar (+350)\nGreece (+30)\nGreenland (+299)\nGrenada (+1)\nGuadeloupe (+590)\nGuam (+1)\nGuatemala (+502)\nGuinea (+224)\nGuyana (+592)\nHaiti (+509)\nHonduras (+504)\nHong Kong (+852)\nHungary (+36)\nIceland (+354)\nIndia (+91)\nIndonesia (+62)\nIraq (+964)\nIreland (+353)\nIsrael (+972)\nItaly (+39)\nJamaica (+1)\nJapan (+81)\nJordan (+962)\nKenya (+254)\nKorea, Republic of (+82)\nKosovo (+383)\nKuwait (+965)\nKyrgyzstan (+996)\nLaos (+856)\nLatvia (+371)\nLebanon (+961)\nLesotho (+266)\nLiberia (+231)\nLibya (+218)\nLiechtenstein (+423)\nLithuania (+370)\nLuxembourg (+352)\nMacao (+853)\nMacedonia (+389)\nMadagascar (+261)\nMalawi (+265)\nMalaysia (+60)\nMaldives (+960)\nMali (+223)\nMalta (+356)\nMartinique (+596)\nMauritania (+222)\nMauritius (+230)\nMexico (+52)\nMonaco (+377)\nMongolia (+976)\nMontenegro (+382)\nMontserrat (+1)\nMorocco/Western Sahara (+212)\nMozambique (+258)\nNamibia (+264)\nNepal (+977)\nNetherlands (+31)\nNew Zealand (+64)\nNicaragua (+505)\nNiger (+227)\nNigeria (+234)\nNorway (+47)\nOman (+968)\nPakistan (+92)\nPalestinian Territory (+970)\nPanama (+507)\nParaguay (+595)\nPeru (+51)\nPhilippines (+63)\nPoland (+48)\nPortugal (+351)\nPuerto Rico (+1)\nQatar (+974)\nReunion/Mayotte (+262)\nRomania (+40)\nRussia/Kazakhstan (+7)\nRwanda (+250)\nSamoa (+685)\nSan Marino (+378)\nSaudi Arabia (+966)\nSenegal (+221)\nSerbia (+381)\nSeychelles (+248)\nSierra Leone (+232)\nSingapore (+65)\nSlovakia (+421)\nSlovenia (+386)\nSouth Africa (+27)\nSpain (+34)\nSri Lanka (+94)\nSt Kitts and Nevis (+1)\nSt Lucia (+1)\nSt Vincent Grenadines (+1)\nSudan (+249)\nSuriname (+597)\nSwaziland (+268)\nSweden (+46)\nSwitzerland (+41)\nTaiwan (+886)\nTajikistan (+992)\nTanzania (+255)\nThailand (+66)\nTogo (+228)\nTonga (+676)\nTrinidad and Tobago (+1)\nTunisia (+216)\nTurkey (+90)\nTurks and Caicos Islands (+1)\nUganda (+256)\nUkraine (+380)\nUnited Arab Emirates (+971)\nUnited Kingdom (+44)\nUnited States (+1)\nUruguay (+598)\nUzbekistan (+998)\nVenezuela (+58)\nVietnam (+84)\nVirgin Islands, British (+1)\nVirgin Islands, U.S. (+1)\nYemen (+967)\nZambia (+260)\nZimbabwe (+263)\n \n Phone number:\n \n \n \n \n Change number\n Enter OTP:\n \n Resend OTP in: 30 seconds \n \n Didn't receive the OTP?\n Resend OTP \n \n \n \n \n\n \n \n Message and data rates may apply. By subscribing you agree to our Privacy Policy, the Atlassian Terms of Service, and the Atlassian Privacy Policy. This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.\n \n\n \n \n Get incident updates and maintenance status messages in Slack.\n \n Subscribe via Slack\n By subscribing you acknowledge our Privacy Policy. In addition, you agree to the Atlassian Cloud Terms of Service and acknowledge Atlassian's Privacy Policy.\n \n\n\n \n \n Get webhook notifications whenever GitHub creates an incident, updates an incident, resolves an incident or changes a component status.\n \n \n \n \n Webhook URL:\n \n The URL we should send the webhooks to\n \n \n\n \n \n Email address:\n \n We'll send you email if your endpoint fails\n \n \n\n \n \n By subscribing you agree to our Privacy Policy. This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.\n\n \n\n \n \n or \n view our profile.\n \n .twitter-follow-button {\n margin-bottom: -6px;\n }\n \n\n !function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');\n \n\n \n Visit our support site.\n \n\n \n Get the Atom Feed or RSS Feed.", + "center": [1683, 37], + "content": "Twitter", "rect": { - "left": 1736, - "top": 19, - "width": 160, - "height": 35 - } + "left": 1658, + "top": 27, + "width": 50, + "height": 19 + }, + "htmlNode": null }, { - "id": "9bf8cb5fec", - "indexId": "11", - "nodeHashId": "9bf8cb5fec", + "id": "88a23e1c94", + "indexId": "9", + "nodeHashId": "88a23e1c94", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".updates-dropdown-container", - "data-js-hook": "updates-dropdown-container", - "style": "display: inline-block;", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='9bf8cb5fec']", - "center": [1816, 36], - "content": "x\n \n \n \n \n \n Get email notifications whenever GitHub creates, updates or resolves an incident.\n \n \n \n \n Email address:\n \n \n \n Enter OTP:\n \n Resend OTP in: seconds \n \n Didn't receive the OTP?\n Resend OTP \n \n \n \n \n By subscribing you agree to our Privacy Policy. This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.\n \n\n \n \n Get text message notifications whenever GitHub creates or resolves an incident.\n \n \n \n \n \n \n \n Country code:\n \n Afghanistan (+93)\nAlbania (+355)\nAlgeria (+213)\nAmerican Samoa (+1)\nAndorra (+376)\nAngola (+244)\nAnguilla (+1)\nAntigua and Barbuda (+1)\nArgentina (+54)\nArmenia (+374)\nAruba (+297)\nAustralia/Cocos/Christmas Island (+61)\nAustria (+43)\nAzerbaijan (+994)\nBahamas (+1)\nBahrain (+973)\nBangladesh (+880)\nBarbados (+1)\nBelarus (+375)\nBelgium (+32)\nBelize (+501)\nBenin (+229)\nBermuda (+1)\nBolivia (+591)\nBosnia and Herzegovina (+387)\nBotswana (+267)\nBrazil (+55)\nBrunei (+673)\nBulgaria (+359)\nBurkina Faso (+226)\nBurundi (+257)\nCambodia (+855)\nCameroon (+237)\nCanada (+1)\nCape Verde (+238)\nCayman Islands (+1)\nCentral Africa (+236)\nChad (+235)\nChile (+56)\nChina (+86)\nColombia (+57)\nComoros (+269)\nCongo (+242)\nCongo, Dem Rep (+243)\nCosta Rica (+506)\nCroatia (+385)\nCyprus (+357)\nCzech Republic (+420)\nDenmark (+45)\nDjibouti (+253)\nDominica (+1)\nDominican Republic (+1)\nEgypt (+20)\nEl Salvador (+503)\nEquatorial Guinea (+240)\nEstonia (+372)\nEthiopia (+251)\nFaroe Islands (+298)\nFiji (+679)\nFinland/Aland Islands (+358)\nFrance (+33)\nFrench Guiana (+594)\nFrench Polynesia (+689)\nGabon (+241)\nGambia (+220)\nGeorgia (+995)\nGermany (+49)\nGhana (+233)\nGibraltar (+350)\nGreece (+30)\nGreenland (+299)\nGrenada (+1)\nGuadeloupe (+590)\nGuam (+1)\nGuatemala (+502)\nGuinea (+224)\nGuyana (+592)\nHaiti (+509)\nHonduras (+504)\nHong Kong (+852)\nHungary (+36)\nIceland (+354)\nIndia (+91)\nIndonesia (+62)\nIraq (+964)\nIreland (+353)\nIsrael (+972)\nItaly (+39)\nJamaica (+1)\nJapan (+81)\nJordan (+962)\nKenya (+254)\nKorea, Republic of (+82)\nKosovo (+383)\nKuwait (+965)\nKyrgyzstan (+996)\nLaos (+856)\nLatvia (+371)\nLebanon (+961)\nLesotho (+266)\nLiberia (+231)\nLibya (+218)\nLiechtenstein (+423)\nLithuania (+370)\nLuxembourg (+352)\nMacao (+853)\nMacedonia (+389)\nMadagascar (+261)\nMalawi (+265)\nMalaysia (+60)\nMaldives (+960)\nMali (+223)\nMalta (+356)\nMartinique (+596)\nMauritania (+222)\nMauritius (+230)\nMexico (+52)\nMonaco (+377)\nMongolia (+976)\nMontenegro (+382)\nMontserrat (+1)\nMorocco/Western Sahara (+212)\nMozambique (+258)\nNamibia (+264)\nNepal (+977)\nNetherlands (+31)\nNew Zealand (+64)\nNicaragua (+505)\nNiger (+227)\nNigeria (+234)\nNorway (+47)\nOman (+968)\nPakistan (+92)\nPalestinian Territory (+970)\nPanama (+507)\nParaguay (+595)\nPeru (+51)\nPhilippines (+63)\nPoland (+48)\nPortugal (+351)\nPuerto Rico (+1)\nQatar (+974)\nReunion/Mayotte (+262)\nRomania (+40)\nRussia/Kazakhstan (+7)\nRwanda (+250)\nSamoa (+685)\nSan Marino (+378)\nSaudi Arabia (+966)\nSenegal (+221)\nSerbia (+381)\nSeychelles (+248)\nSierra Leone (+232)\nSingapore (+65)\nSlovakia (+421)\nSlovenia (+386)\nSouth Africa (+27)\nSpain (+34)\nSri Lanka (+94)\nSt Kitts and Nevis (+1)\nSt Lucia (+1)\nSt Vincent Grenadines (+1)\nSudan (+249)\nSuriname (+597)\nSwaziland (+268)\nSweden (+46)\nSwitzerland (+41)\nTaiwan (+886)\nTajikistan (+992)\nTanzania (+255)\nThailand (+66)\nTogo (+228)\nTonga (+676)\nTrinidad and Tobago (+1)\nTunisia (+216)\nTurkey (+90)\nTurks and Caicos Islands (+1)\nUganda (+256)\nUkraine (+380)\nUnited Arab Emirates (+971)\nUnited Kingdom (+44)\nUnited States (+1)\nUruguay (+598)\nUzbekistan (+998)\nVenezuela (+58)\nVietnam (+84)\nVirgin Islands, British (+1)\nVirgin Islands, U.S. (+1)\nYemen (+967)\nZambia (+260)\nZimbabwe (+263)\n \n Phone number:\n \n \n \n \n Change number\n Enter OTP:\n \n Resend OTP in: 30 seconds \n \n Didn't receive the OTP?\n Resend OTP \n \n \n \n \n\n \n \n Message and data rates may apply. By subscribing you agree to our Privacy Policy, the Atlassian Terms of Service, and the Atlassian Privacy Policy. This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.\n \n\n \n \n Get incident updates and maintenance status messages in Slack.\n \n Subscribe via Slack\n By subscribing you acknowledge our Privacy Policy. In addition, you agree to the Atlassian Cloud Terms of Service and acknowledge Atlassian's Privacy Policy.\n \n\n\n \n \n Get webhook notifications whenever GitHub creates an incident, updates an incident, resolves an incident or changes a component status.\n \n \n \n \n Webhook URL:\n \n The URL we should send the webhooks to\n \n \n\n \n \n Email address:\n \n We'll send you email if your endpoint fails\n \n \n\n \n \n By subscribing you agree to our Privacy Policy. This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.\n\n \n\n \n \n or \n view our profile.\n \n .twitter-follow-button {\n margin-bottom: -6px;\n }\n \n\n !function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');\n \n\n \n Visit our support site.\n \n\n \n Get the Atom Feed or RSS Feed.", + "center": [1710, 37], + "content": "", "rect": { - "left": 1736, - "top": 24, - "width": 160, - "height": 24 - } + "left": 1708, + "top": 27, + "width": 4, + "height": 19 + }, + "htmlNode": null }, { "id": "4e12022b70", - "indexId": "12", + "indexId": "10", "nodeHashId": "4e12022b70", "locator": "[_midscene_retrieve_task_id='4e12022b70']", "attributes": { @@ -218,6 +182,7 @@ "alt": "GitHub header", "nodeType": "IMG Node" }, + "nodeType": "IMG Node", "content": "", "rect": { "left": 0, @@ -225,35 +190,37 @@ "width": 1920, "height": 422 }, - "center": [960, 284] + "center": [960, 284], + "htmlNode": null }, { - "id": "33bccce59f", - "indexId": "13", - "nodeHashId": "33bccce59f", + "id": "dca2685b5c", + "indexId": "11", + "nodeHashId": "dca2685b5c", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".page-status.status-none", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='33bccce59f']", - "center": [960, 428], - "content": "All Systems Operational", + "center": [520, 430], + "content": "", "rect": { - "left": 470, - "top": 400, - "width": 980, - "height": 55 - } + "left": 518, + "top": 421, + "width": 4, + "height": 17 + }, + "htmlNode": null }, { "id": "221b0092a0", - "indexId": "14", + "indexId": "12", "nodeHashId": "221b0092a0", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".status.font-large", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='221b0092a0']", "center": [632, 427], "content": "All Systems Operational", "rect": { @@ -261,944 +228,767 @@ "top": 415, "width": 219, "height": 24 - } - }, - { - "id": "a1fed341ef", - "indexId": "15", - "nodeHashId": "a1fed341ef", - "attributes": { - "class": ".components-section.font-regular", - "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='a1fed341ef']", - "center": [960, 756], - "content": "Git Operations\n \n\n ?\n\n \n\n \n\nNormal\n\n \n \n \n\n\n \n Webhooks\n \n\n ?\n\n \n\n \n\nNormal\n\n \n \n \n\n\n \n Visit www.githubstatus.com for more information\n \n\n\n \n\n \n\nNormal\n\n \n \n \n\n\n \n API Requests\n \n\n ?\n\n \n\n \n\nNormal\n\n \n \n \n\n\n \n Issues\n \n\n ?\n\n \n\n \n\nNormal\n\n \n \n \n\n\n \n Pull Requests\n \n\n ?\n\n \n\n \n\nNormal\n\n \n \n \n\n\n \n Actions\n \n\n ?\n\n \n\n \n\nNormal\n\n \n \n \n\n\n \n Packages\n \n\n ?\n\n \n\n \n\nNormal\n\n \n \n \n\n\n \n Pages\n \n\n ?\n\n \n\n \n\nNormal\n\n \n \n \n\n\n \n Codespaces\n \n\n ?\n\n \n\n \n\nNormal\n\n \n \n \n\n\n \n Copilot\n \n\n\n \n\n \n\nNormal", - "rect": { - "left": 470, - "top": 503, - "width": 980, - "height": 505 - } + "htmlNode": null }, { - "id": "4a6c8aa387", - "indexId": "16", - "nodeHashId": "4a6c8aa387", - "attributes": { - "class": ".components-container.two-columns", - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='4a6c8aa387']", - "center": [960, 783], - "content": "Git Operations\n \n\n ?\n\n \n\n \n\nNormal\n\n \n \n \n\n\n \n Webhooks\n \n\n ?\n\n \n\n \n\nNormal\n\n \n \n \n\n\n \n Visit www.githubstatus.com for more information\n \n\n\n \n\n \n\nNormal\n\n \n \n \n\n\n \n API Requests\n \n\n ?\n\n \n\n \n\nNormal\n\n \n \n \n\n\n \n Issues\n \n\n ?\n\n \n\n \n\nNormal\n\n \n \n \n\n\n \n Pull Requests\n \n\n ?\n\n \n\n \n\nNormal\n\n \n \n \n\n\n \n Actions\n \n\n ?\n\n \n\n \n\nNormal\n\n \n \n \n\n\n \n Packages\n \n\n ?\n\n \n\n \n\nNormal\n\n \n \n \n\n\n \n Pages\n \n\n ?\n\n \n\n \n\nNormal\n\n \n \n \n\n\n \n Codespaces\n \n\n ?\n\n \n\n \n\nNormal\n\n \n \n \n\n\n \n Copilot\n \n\n\n \n\n \n\nNormal", - "rect": { - "left": 470, - "top": 558, - "width": 980, - "height": 449 - } - }, - { - "id": "1775a8e5ac", - "indexId": "17", - "nodeHashId": "1775a8e5ac", - "attributes": { - "class": ".component-container.border-color", - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='1775a8e5ac']", - "center": [717, 605], - "content": "Git Operations\n \n\n ?\n\n \n\n \n\nNormal", - "rect": { - "left": 472, - "top": 561, - "width": 489, - "height": 88 - } - }, - { - "id": "9b8133c565", - "indexId": "18", - "nodeHashId": "9b8133c565", + "id": "95b9f43018", + "indexId": "13", + "nodeHashId": "95b9f43018", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "data-component-id": "8l4ygp009s5s", - "class": ".component-inner-container.status-green.", - "data-component-status": "operational", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='9b8133c565']", - "center": [716, 606], - "content": "Git Operations\n \n\n ?\n\n \n\n \n\nNormal", + "center": [546, 593], + "content": "Git Operations", "rect": { "left": 492, - "top": 579, - "width": 448, - "height": 54 - } + "top": 583, + "width": 107, + "height": 19 + }, + "htmlNode": null }, { - "id": "786dafff55", - "indexId": "19", - "nodeHashId": "786dafff55", + "id": "75b3d616f1", + "indexId": "14", + "nodeHashId": "75b3d616f1", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".name", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='786dafff55']", - "center": [546, 593], - "content": "Git Operations", + "center": [601, 591], + "content": "", "rect": { - "left": 492, + "left": 599, "top": 581, - "width": 107, - "height": 24 - } + "width": 4, + "height": 19 + }, + "htmlNode": null }, { - "id": "9fd504c355", - "indexId": "20", - "nodeHashId": "9fd504c355", + "id": "7c98e1ca7b", + "indexId": "15", + "nodeHashId": "7c98e1ca7b", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".tooltip-base.tool.tooltipstered", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='9fd504c355']", - "center": [618, 591], + "center": [617, 592], "content": "?", "rect": { - "left": 609, - "top": 582, - "width": 18, - "height": 18 - } + "left": 614, + "top": 585, + "width": 6, + "height": 14 + }, + "htmlNode": null }, { - "id": "15865efd31", - "indexId": "21", - "nodeHashId": "15865efd31", + "id": "a99ec442d9", + "indexId": "16", + "nodeHashId": "a99ec442d9", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".status-msg", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='15865efd31']", - "center": [716, 619], + "center": [516, 619], "content": "Normal", "rect": { "left": 492, - "top": 605, - "width": 448, - "height": 28 - } - }, - { - "id": "500e0a173b", - "indexId": "22", - "nodeHashId": "500e0a173b", - "attributes": { - "class": ".component-container.border-color", - "nodeType": "TEXT Node" + "top": 610, + "width": 47, + "height": 17 }, - "locator": "[_midscene_retrieve_task_id='500e0a173b']", - "center": [1206, 605], - "content": "Webhooks\n \n\n ?\n\n \n\n \n\nNormal", - "rect": { - "left": 961, - "top": 561, - "width": 489, - "height": 88 - } + "htmlNode": null }, { - "id": "abf6dd5e4f", - "indexId": "23", - "nodeHashId": "abf6dd5e4f", + "id": "b07d45b975", + "indexId": "17", + "nodeHashId": "b07d45b975", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "data-component-id": "4230lsnqdsld", - "class": ".component-inner-container.status-green.", - "data-component-status": "operational", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='abf6dd5e4f']", - "center": [1205, 606], - "content": "Webhooks\n \n\n ?\n\n \n\n \n\nNormal", + "center": [1020, 593], + "content": "Webhooks", "rect": { "left": 981, - "top": 579, - "width": 448, - "height": 54 - } + "top": 583, + "width": 78, + "height": 19 + }, + "htmlNode": null }, { - "id": "ede595307e", - "indexId": "24", - "nodeHashId": "ede595307e", + "id": "57ca09ca4b", + "indexId": "18", + "nodeHashId": "57ca09ca4b", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".name", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='ede595307e']", - "center": [1020, 593], - "content": "Webhooks", + "center": [1061, 591], + "content": "", "rect": { - "left": 981, + "left": 1059, "top": 581, - "width": 78, - "height": 24 - } + "width": 4, + "height": 19 + }, + "htmlNode": null }, { - "id": "bde0cd332f", - "indexId": "25", - "nodeHashId": "bde0cd332f", + "id": "b53f51a908", + "indexId": "19", + "nodeHashId": "b53f51a908", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".tooltip-base.tool.tooltipstered", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='bde0cd332f']", - "center": [1077, 591], + "center": [1077, 592], "content": "?", "rect": { - "left": 1068, - "top": 582, - "width": 18, - "height": 18 - } + "left": 1074, + "top": 585, + "width": 6, + "height": 14 + }, + "htmlNode": null }, { - "id": "e4932f3f94", - "indexId": "26", - "nodeHashId": "e4932f3f94", + "id": "5878d74f0e", + "indexId": "20", + "nodeHashId": "5878d74f0e", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".status-msg", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='e4932f3f94']", - "center": [1205, 619], + "center": [1005, 619], "content": "Normal", "rect": { "left": 981, - "top": 605, - "width": 448, - "height": 28 - } - }, - { - "id": "f43e0ec645", - "indexId": "27", - "nodeHashId": "f43e0ec645", - "attributes": { - "class": ".component-container.border-color", - "nodeType": "TEXT Node" + "top": 610, + "width": 47, + "height": 17 }, - "locator": "[_midscene_retrieve_task_id='f43e0ec645']", - "center": [717, 695], - "content": "API Requests\n \n\n ?\n\n \n\n \n\nNormal", - "rect": { - "left": 472, - "top": 651, - "width": 489, - "height": 88 - } + "htmlNode": null }, { - "id": "5a9de69abf", - "indexId": "28", - "nodeHashId": "5a9de69abf", + "id": "b203a4970f", + "indexId": "21", + "nodeHashId": "b203a4970f", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "data-component-id": "brv1bkgrwx7q", - "class": ".component-inner-container.status-green.", - "data-component-status": "operational", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='5a9de69abf']", - "center": [716, 695], - "content": "API Requests\n \n\n ?\n\n \n\n \n\nNormal", + "center": [541, 683], + "content": "API Requests", "rect": { "left": 492, - "top": 668, - "width": 448, - "height": 54 - } + "top": 673, + "width": 98, + "height": 19 + }, + "htmlNode": null }, { - "id": "a40953194a", - "indexId": "29", - "nodeHashId": "a40953194a", + "id": "4f62032c5e", + "indexId": "22", + "nodeHashId": "4f62032c5e", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".name", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='a40953194a']", - "center": [541, 682], - "content": "API Requests", + "center": [592, 681], + "content": "", "rect": { - "left": 492, - "top": 670, - "width": 98, - "height": 24 - } + "left": 590, + "top": 671, + "width": 4, + "height": 19 + }, + "htmlNode": null }, { - "id": "768003aa2d", - "indexId": "30", - "nodeHashId": "768003aa2d", + "id": "d6e77d45c8", + "indexId": "23", + "nodeHashId": "d6e77d45c8", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".tooltip-base.tool.tooltipstered", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='768003aa2d']", - "center": [608, 681], + "center": [608, 682], "content": "?", "rect": { - "left": 599, - "top": 672, - "width": 18, - "height": 18 - } + "left": 605, + "top": 675, + "width": 6, + "height": 14 + }, + "htmlNode": null }, { - "id": "4abfbbde8a", - "indexId": "31", - "nodeHashId": "4abfbbde8a", + "id": "d559929340", + "indexId": "24", + "nodeHashId": "d559929340", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".status-msg", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='4abfbbde8a']", - "center": [716, 708], + "center": [516, 709], "content": "Normal", "rect": { "left": 492, - "top": 694, - "width": 448, - "height": 28 - } - }, - { - "id": "646e1d48fb", - "indexId": "32", - "nodeHashId": "646e1d48fb", - "attributes": { - "class": ".component-container.border-color", - "nodeType": "TEXT Node" + "top": 700, + "width": 47, + "height": 17 }, - "locator": "[_midscene_retrieve_task_id='646e1d48fb']", - "center": [1206, 695], - "content": "Issues\n \n\n ?\n\n \n\n \n\nNormal", - "rect": { - "left": 961, - "top": 651, - "width": 489, - "height": 88 - } + "htmlNode": null }, { - "id": "8b54cbe825", - "indexId": "33", - "nodeHashId": "8b54cbe825", + "id": "3d31ca20a8", + "indexId": "25", + "nodeHashId": "3d31ca20a8", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "data-component-id": "kr09ddfgbfsf", - "class": ".component-inner-container.status-green.", - "data-component-status": "operational", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='8b54cbe825']", - "center": [1205, 695], - "content": "Issues\n \n\n ?\n\n \n\n \n\nNormal", + "center": [1005, 683], + "content": "Issues", "rect": { "left": 981, - "top": 668, - "width": 448, - "height": 54 - } + "top": 673, + "width": 47, + "height": 19 + }, + "htmlNode": null }, { - "id": "49b1a5e3e1", - "indexId": "34", - "nodeHashId": "49b1a5e3e1", + "id": "1d05f53a62", + "indexId": "26", + "nodeHashId": "1d05f53a62", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".name", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='49b1a5e3e1']", - "center": [1005, 682], - "content": "Issues", + "center": [1030, 681], + "content": "", "rect": { - "left": 981, - "top": 670, - "width": 47, - "height": 24 - } + "left": 1028, + "top": 671, + "width": 4, + "height": 19 + }, + "htmlNode": null }, { - "id": "ce72a7bb29", - "indexId": "35", - "nodeHashId": "ce72a7bb29", + "id": "2d8a969c8d", + "indexId": "27", + "nodeHashId": "2d8a969c8d", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".tooltip-base.tool.tooltipstered", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='ce72a7bb29']", - "center": [1046, 681], + "center": [1046, 682], "content": "?", "rect": { - "left": 1037, - "top": 672, - "width": 18, - "height": 18 - } + "left": 1043, + "top": 675, + "width": 6, + "height": 14 + }, + "htmlNode": null }, { - "id": "44c6cea361", - "indexId": "36", - "nodeHashId": "44c6cea361", + "id": "da4d94206d", + "indexId": "28", + "nodeHashId": "da4d94206d", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".status-msg", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='44c6cea361']", - "center": [1205, 708], + "center": [1005, 709], "content": "Normal", "rect": { "left": 981, - "top": 694, - "width": 448, - "height": 28 - } - }, - { - "id": "1a7bbd910b", - "indexId": "37", - "nodeHashId": "1a7bbd910b", - "attributes": { - "class": ".component-container.border-color", - "nodeType": "TEXT Node" + "top": 700, + "width": 47, + "height": 17 }, - "locator": "[_midscene_retrieve_task_id='1a7bbd910b']", - "center": [717, 784], - "content": "Pull Requests\n \n\n ?\n\n \n\n \n\nNormal", - "rect": { - "left": 472, - "top": 740, - "width": 489, - "height": 88 - } + "htmlNode": null }, { - "id": "d04547b004", - "indexId": "38", - "nodeHashId": "d04547b004", + "id": "3eeccefcfb", + "indexId": "29", + "nodeHashId": "3eeccefcfb", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "data-component-id": "hhtssxt0f5v2", - "class": ".component-inner-container.status-green.", - "data-component-status": "operational", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='d04547b004']", - "center": [716, 785], - "content": "Pull Requests\n \n\n ?\n\n \n\n \n\nNormal", + "center": [542, 772], + "content": "Pull Requests", "rect": { "left": 492, - "top": 758, - "width": 448, - "height": 54 - } + "top": 762, + "width": 100, + "height": 19 + }, + "htmlNode": null }, { - "id": "0ef54614d8", - "indexId": "39", - "nodeHashId": "0ef54614d8", + "id": "3ad4f7b8e8", + "indexId": "30", + "nodeHashId": "3ad4f7b8e8", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".name", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='0ef54614d8']", - "center": [542, 772], - "content": "Pull Requests", + "center": [594, 770], + "content": "", "rect": { - "left": 492, + "left": 592, "top": 760, - "width": 100, - "height": 24 - } + "width": 4, + "height": 19 + }, + "htmlNode": null }, { - "id": "00228c1c08", - "indexId": "40", - "nodeHashId": "00228c1c08", + "id": "5d440f8518", + "indexId": "31", + "nodeHashId": "5d440f8518", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".tooltip-base.tool.tooltipstered", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='00228c1c08']", - "center": [611, 770], + "center": [611, 771], "content": "?", "rect": { - "left": 602, - "top": 761, - "width": 18, - "height": 18 - } + "left": 608, + "top": 764, + "width": 6, + "height": 14 + }, + "htmlNode": null }, { - "id": "206fe45dc0", - "indexId": "41", - "nodeHashId": "206fe45dc0", + "id": "86f80b1215", + "indexId": "32", + "nodeHashId": "86f80b1215", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".status-msg", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='206fe45dc0']", - "center": [716, 798], + "center": [516, 798], "content": "Normal", "rect": { "left": 492, - "top": 784, - "width": 448, - "height": 28 - } - }, - { - "id": "075070b70a", - "indexId": "42", - "nodeHashId": "075070b70a", - "attributes": { - "class": ".component-container.border-color", - "nodeType": "TEXT Node" + "top": 789, + "width": 47, + "height": 17 }, - "locator": "[_midscene_retrieve_task_id='075070b70a']", - "center": [1206, 784], - "content": "Actions\n \n\n ?\n\n \n\n \n\nNormal", - "rect": { - "left": 961, - "top": 740, - "width": 489, - "height": 88 - } + "htmlNode": null }, { - "id": "ebbf5e2217", - "indexId": "43", - "nodeHashId": "ebbf5e2217", + "id": "ec5fed7967", + "indexId": "33", + "nodeHashId": "ec5fed7967", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "data-component-id": "br0l2tvcx85d", - "class": ".component-inner-container.status-green.", - "data-component-status": "operational", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='ebbf5e2217']", - "center": [1205, 785], - "content": "Actions\n \n\n ?\n\n \n\n \n\nNormal", + "center": [1009, 772], + "content": "Actions", "rect": { "left": 981, - "top": 758, - "width": 448, - "height": 54 - } + "top": 762, + "width": 56, + "height": 19 + }, + "htmlNode": null }, { - "id": "89c422b218", - "indexId": "44", - "nodeHashId": "89c422b218", + "id": "f04df40650", + "indexId": "34", + "nodeHashId": "f04df40650", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".name", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='89c422b218']", - "center": [1009, 772], - "content": "Actions", + "center": [1039, 770], + "content": "", "rect": { - "left": 981, + "left": 1037, "top": 760, - "width": 56, - "height": 24 - } + "width": 4, + "height": 19 + }, + "htmlNode": null }, { - "id": "e923998486", - "indexId": "45", - "nodeHashId": "e923998486", + "id": "22758db92d", + "indexId": "35", + "nodeHashId": "22758db92d", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".tooltip-base.tool.tooltipstered", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='e923998486']", - "center": [1055, 770], + "center": [1055, 771], "content": "?", "rect": { - "left": 1046, - "top": 761, - "width": 18, - "height": 18 - } + "left": 1052, + "top": 764, + "width": 6, + "height": 14 + }, + "htmlNode": null }, { - "id": "967447a1c6", - "indexId": "46", - "nodeHashId": "967447a1c6", + "id": "ee2f0ce8ae", + "indexId": "36", + "nodeHashId": "ee2f0ce8ae", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".status-msg", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='967447a1c6']", - "center": [1205, 798], + "center": [1005, 798], "content": "Normal", "rect": { "left": 981, - "top": 784, - "width": 448, - "height": 28 - } - }, - { - "id": "11a7c1ed98", - "indexId": "47", - "nodeHashId": "11a7c1ed98", - "attributes": { - "class": ".component-container.border-color", - "nodeType": "TEXT Node" + "top": 789, + "width": 47, + "height": 17 }, - "locator": "[_midscene_retrieve_task_id='11a7c1ed98']", - "center": [717, 874], - "content": "Packages\n \n\n ?\n\n \n\n \n\nNormal", - "rect": { - "left": 472, - "top": 830, - "width": 489, - "height": 88 - } + "htmlNode": null }, { - "id": "1c9544f01a", - "indexId": "48", - "nodeHashId": "1c9544f01a", + "id": "23fa7095b7", + "indexId": "37", + "nodeHashId": "23fa7095b7", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "data-component-id": "st3j38cctv9l", - "class": ".component-inner-container.status-green.", - "data-component-status": "operational", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='1c9544f01a']", - "center": [716, 874], - "content": "Packages\n \n\n ?\n\n \n\n \n\nNormal", + "center": [528, 861], + "content": "Packages", "rect": { "left": 492, - "top": 847, - "width": 448, - "height": 54 - } + "top": 851, + "width": 71, + "height": 19 + }, + "htmlNode": null }, { - "id": "41a6c2ed19", - "indexId": "49", - "nodeHashId": "41a6c2ed19", + "id": "e475232fc8", + "indexId": "38", + "nodeHashId": "e475232fc8", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".name", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='41a6c2ed19']", - "center": [528, 861], - "content": "Packages", + "center": [565, 860], + "content": "", "rect": { - "left": 492, - "top": 849, - "width": 71, - "height": 24 - } + "left": 563, + "top": 850, + "width": 4, + "height": 19 + }, + "htmlNode": null }, { - "id": "b8f8f86b4c", - "indexId": "50", - "nodeHashId": "b8f8f86b4c", + "id": "ee3e7ac0a1", + "indexId": "39", + "nodeHashId": "ee3e7ac0a1", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".tooltip-base.tool.tooltipstered", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='b8f8f86b4c']", - "center": [581, 860], + "center": [581, 861], "content": "?", "rect": { - "left": 572, - "top": 851, - "width": 18, - "height": 18 - } + "left": 578, + "top": 854, + "width": 6, + "height": 14 + }, + "htmlNode": null }, { - "id": "4d10b3b116", - "indexId": "51", - "nodeHashId": "4d10b3b116", + "id": "498b8862bd", + "indexId": "40", + "nodeHashId": "498b8862bd", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".status-msg", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='4d10b3b116']", - "center": [716, 887], + "center": [516, 887], "content": "Normal", "rect": { "left": 492, - "top": 873, - "width": 448, - "height": 28 - } - }, - { - "id": "7d79505914", - "indexId": "52", - "nodeHashId": "7d79505914", - "attributes": { - "class": ".component-container.border-color", - "nodeType": "TEXT Node" + "top": 878, + "width": 47, + "height": 17 }, - "locator": "[_midscene_retrieve_task_id='7d79505914']", - "center": [1206, 874], - "content": "Pages\n \n\n ?\n\n \n\n \n\nNormal", - "rect": { - "left": 961, - "top": 830, - "width": 489, - "height": 88 - } + "htmlNode": null }, { - "id": "e502c0d9c5", - "indexId": "53", - "nodeHashId": "e502c0d9c5", + "id": "e315770713", + "indexId": "41", + "nodeHashId": "e315770713", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "data-component-id": "vg70hn9s2tyj", - "class": ".component-inner-container.status-green.", - "data-component-status": "operational", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='e502c0d9c5']", - "center": [1205, 874], - "content": "Pages\n \n\n ?\n\n \n\n \n\nNormal", + "center": [1004, 861], + "content": "Pages", "rect": { "left": 981, - "top": 847, - "width": 448, - "height": 54 - } + "top": 851, + "width": 45, + "height": 19 + }, + "htmlNode": null }, { - "id": "cae85d0269", - "indexId": "54", - "nodeHashId": "cae85d0269", + "id": "85cf9d22be", + "indexId": "42", + "nodeHashId": "85cf9d22be", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".name", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='cae85d0269']", - "center": [1004, 861], - "content": "Pages", + "center": [1028, 860], + "content": "", "rect": { - "left": 981, - "top": 849, - "width": 45, - "height": 24 - } + "left": 1026, + "top": 850, + "width": 4, + "height": 19 + }, + "htmlNode": null }, { - "id": "85a6924c98", - "indexId": "55", - "nodeHashId": "85a6924c98", + "id": "f6eb63c86d", + "indexId": "43", + "nodeHashId": "f6eb63c86d", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".tooltip-base.tool.tooltipstered", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='85a6924c98']", - "center": [1045, 860], + "center": [1044, 861], "content": "?", "rect": { - "left": 1036, - "top": 851, - "width": 18, - "height": 18 - } + "left": 1041, + "top": 854, + "width": 6, + "height": 14 + }, + "htmlNode": null }, { - "id": "352bb8a0c7", - "indexId": "56", - "nodeHashId": "352bb8a0c7", + "id": "826a1d8096", + "indexId": "44", + "nodeHashId": "826a1d8096", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".status-msg", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='352bb8a0c7']", - "center": [1205, 887], + "center": [1005, 887], "content": "Normal", "rect": { "left": 981, - "top": 873, - "width": 448, - "height": 28 - } - }, - { - "id": "7ebaccd865", - "indexId": "57", - "nodeHashId": "7ebaccd865", - "attributes": { - "class": ".component-container.border-color", - "nodeType": "TEXT Node" + "top": 878, + "width": 47, + "height": 17 }, - "locator": "[_midscene_retrieve_task_id='7ebaccd865']", - "center": [717, 963], - "content": "Codespaces\n \n\n ?\n\n \n\n \n\nNormal", - "rect": { - "left": 472, - "top": 919, - "width": 489, - "height": 88 - } + "htmlNode": null }, { - "id": "318eb23523", - "indexId": "58", - "nodeHashId": "318eb23523", + "id": "29bc3f434a", + "indexId": "45", + "nodeHashId": "29bc3f434a", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "data-component-id": "h2ftsgbw7kmk", - "class": ".component-inner-container.status-green.", - "data-component-status": "operational", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='318eb23523']", - "center": [716, 963], - "content": "Codespaces\n \n\n ?\n\n \n\n \n\nNormal", + "center": [538, 951], + "content": "Codespaces", "rect": { "left": 492, - "top": 936, - "width": 448, - "height": 54 - } + "top": 941, + "width": 92, + "height": 19 + }, + "htmlNode": null }, { - "id": "f397787172", - "indexId": "59", - "nodeHashId": "f397787172", + "id": "9df6ac0866", + "indexId": "46", + "nodeHashId": "9df6ac0866", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".name", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='f397787172']", - "center": [538, 950], - "content": "Codespaces", + "center": [586, 949], + "content": "", "rect": { - "left": 492, - "top": 938, - "width": 92, - "height": 24 - } + "left": 584, + "top": 939, + "width": 4, + "height": 19 + }, + "htmlNode": null }, { - "id": "d7f5fbb4d0", - "indexId": "60", - "nodeHashId": "d7f5fbb4d0", + "id": "c63503c8fd", + "indexId": "47", + "nodeHashId": "c63503c8fd", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".tooltip-base.tool.tooltipstered", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='d7f5fbb4d0']", - "center": [602, 949], + "center": [602, 950], "content": "?", "rect": { - "left": 593, - "top": 940, - "width": 18, - "height": 18 - } + "left": 599, + "top": 943, + "width": 6, + "height": 14 + }, + "htmlNode": null }, { - "id": "aafa155f98", - "indexId": "61", - "nodeHashId": "aafa155f98", + "id": "939a09c56a", + "indexId": "48", + "nodeHashId": "939a09c56a", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".status-msg", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='aafa155f98']", - "center": [716, 976], + "center": [516, 977], "content": "Normal", "rect": { "left": 492, - "top": 962, - "width": 448, - "height": 28 - } + "top": 968, + "width": 47, + "height": 17 + }, + "htmlNode": null }, { - "id": "aa396a5b1d", - "indexId": "62", - "nodeHashId": "aa396a5b1d", + "id": "e0e55beb72", + "indexId": "49", + "nodeHashId": "e0e55beb72", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".component-container.border-color", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='aa396a5b1d']", - "center": [1206, 963], - "content": "Copilot\n \n\n\n \n\n \n\nNormal", + "center": [1008, 951], + "content": "Copilot", "rect": { - "left": 961, - "top": 919, - "width": 489, - "height": 88 - } + "left": 981, + "top": 941, + "width": 53, + "height": 19 + }, + "htmlNode": null }, { - "id": "ecfafeca6d", - "indexId": "63", - "nodeHashId": "ecfafeca6d", + "id": "01e81f134c", + "indexId": "50", + "nodeHashId": "01e81f134c", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "data-component-id": "pjmpxvq2cmr2", - "class": ".component-inner-container.status-green.", - "data-component-status": "operational", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='ecfafeca6d']", - "center": [1205, 963], - "content": "Copilot\n \n\n\n \n\n \n\nNormal", + "center": [1005, 977], + "content": "Normal", "rect": { "left": 981, - "top": 936, - "width": 448, - "height": 54 - } + "top": 968, + "width": 47, + "height": 17 + }, + "htmlNode": null }, { - "id": "18dce47ff0", - "indexId": "64", - "nodeHashId": "18dce47ff0", + "id": "3122805647", + "indexId": "51", + "nodeHashId": "3122805647", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".name", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='18dce47ff0']", - "center": [1008, 950], - "content": "Copilot", + "center": [1379, 1077], + "content": "Incident History", "rect": { - "left": 981, - "top": 938, - "width": 53, - "height": 24 - } + "left": 1326, + "top": 1068, + "width": 105, + "height": 17 + }, + "htmlNode": null }, { - "id": "3ac8478628", - "indexId": "65", - "nodeHashId": "3ac8478628", + "id": "936e8daa59", + "indexId": "52", + "nodeHashId": "936e8daa59", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".status-msg", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='3ac8478628']", - "center": [1205, 976], - "content": "Normal", + "center": [1719, 1077], + "content": "Powered by Atlassian Statuspage", "rect": { - "left": 981, - "top": 962, - "width": 448, - "height": 28 - } + "left": 1612, + "top": 1068, + "width": 214, + "height": 17 + }, + "htmlNode": null } ] diff --git a/packages/midscene/tests/ai/inspector/test-data/githubstatus/output.png b/packages/midscene/tests/ai/inspector/test-data/githubstatus/output.png index f80ac68e..ccd73c1f 100644 Binary files a/packages/midscene/tests/ai/inspector/test-data/githubstatus/output.png and b/packages/midscene/tests/ai/inspector/test-data/githubstatus/output.png differ diff --git a/packages/midscene/tests/ai/inspector/test-data/githubstatus/output_without_text.png b/packages/midscene/tests/ai/inspector/test-data/githubstatus/output_without_text.png index 911bbc27..029f1320 100644 Binary files a/packages/midscene/tests/ai/inspector/test-data/githubstatus/output_without_text.png and b/packages/midscene/tests/ai/inspector/test-data/githubstatus/output_without_text.png differ diff --git a/packages/midscene/tests/ai/inspector/test-data/online_order/element-snapshot.json b/packages/midscene/tests/ai/inspector/test-data/online_order/element-snapshot.json index 15d9c87a..28496d1e 100644 --- a/packages/midscene/tests/ai/inspector/test-data/online_order/element-snapshot.json +++ b/packages/midscene/tests/ai/inspector/test-data/online_order/element-snapshot.json @@ -1,151 +1,7 @@ [ - { - "id": "03fd023ebc", - "indexId": "1", - "nodeHashId": "03fd023ebc", - "attributes": { - "class": ".page-header", - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='03fd023ebc']", - "center": [200, 30], - "content": "中文中文首页菜单我的登录/注册喜茶 HEYTEA (Vivocity)登录/注册", - "rect": { - "left": 0, - "top": 0, - "width": 400, - "height": 60 - } - }, - { - "id": "03fd023ebc", - "indexId": "2", - "nodeHashId": "03fd023ebc", - "attributes": { - "class": ".page-nav", - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='03fd023ebc']", - "center": [200, 30], - "content": "中文中文首页菜单我的登录/注册喜茶 HEYTEA (Vivocity)登录/注册", - "rect": { - "left": 0, - "top": 0, - "width": 400, - "height": 60 - } - }, - { - "id": "92dd55e982", - "indexId": "3", - "nodeHashId": "92dd55e982", - "attributes": { - "class": ".container", - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='92dd55e982']", - "center": [200, 30], - "content": "中文中文首页菜单我的登录/注册喜茶 HEYTEA (Vivocity)登录/注册", - "rect": { - "left": 0, - "top": 8, - "width": 400, - "height": 44 - } - }, - { - "id": "c4434bccf7", - "indexId": "4", - "nodeHashId": "c4434bccf7", - "attributes": { - "class": ".ant-row", - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='c4434bccf7']", - "center": [200, 30], - "content": "中文中文首页菜单我的登录/注册", - "rect": { - "left": 0, - "top": 8, - "width": 400, - "height": 44 - } - }, - { - "id": "6b77112620", - "indexId": "5", - "nodeHashId": "6b77112620", - "attributes": { - "class": ".ant-col.ant-col-xs-12.ant-col-sm-12.ant-col-md-5.ant-col-lg-8.ant-col-xl-8", - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='6b77112620']", - "center": [100, 28], - "content": "中文中文", - "rect": { - "left": 0, - "top": 8, - "width": 200, - "height": 40 - } - }, - { - "id": "6b77112620", - "indexId": "6", - "nodeHashId": "6b77112620", - "attributes": { - "class": ".ant-row", - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='6b77112620']", - "center": [100, 28], - "content": "中文中文", - "rect": { - "left": 0, - "top": 8, - "width": 200, - "height": 40 - } - }, - { - "id": "05ffc3ba6e", - "indexId": "7", - "nodeHashId": "05ffc3ba6e", - "attributes": { - "class": ".ant-col.ant-col-xs-24.ant-col-sm-24.ant-col-md-0.ant-col-lg-0.ant-col-xl-0", - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='05ffc3ba6e']", - "center": [100, 28], - "content": "中文", - "rect": { - "left": 0, - "top": 8, - "width": 200, - "height": 40 - } - }, - { - "id": "05ffc3ba6e", - "indexId": "8", - "nodeHashId": "05ffc3ba6e", - "attributes": { - "class": ".menu-btn-wrapper", - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='05ffc3ba6e']", - "center": [100, 28], - "content": "中文", - "rect": { - "left": 0, - "top": 8, - "width": 200, - "height": 40 - } - }, { "id": "6ad26dfdca", - "indexId": "9", + "indexId": "1", "nodeHashId": "6ad26dfdca", "locator": "[_midscene_retrieve_task_id='6ad26dfdca']", "attributes": { @@ -153,6 +9,7 @@ "class": ".icon", "nodeType": "IMG Node" }, + "nodeType": "IMG Node", "content": "", "rect": { "left": 15, @@ -160,65 +17,31 @@ "width": 22, "height": 22 }, - "center": [26, 28] - }, - { - "id": "0ebd2996b7", - "indexId": "10", - "nodeHashId": "0ebd2996b7", - "attributes": { - "class": ".comp-switch-lang-pc.ml17", - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='0ebd2996b7']", - "center": [90, 28], - "content": "中文", - "rect": { - "left": 59, - "top": 14, - "width": 62, - "height": 28 - } + "center": [26, 28], + "htmlNode": null }, { - "id": "0ebd2996b7", - "indexId": "11", - "nodeHashId": "0ebd2996b7", + "id": "e666c51ff8", + "indexId": "2", + "nodeHashId": "e666c51ff8", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".lang-show.layout-flex.align-center.ant-dropdown-trigger", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='0ebd2996b7']", - "center": [90, 28], + "center": [81, 29], "content": "中文", "rect": { - "left": 59, - "top": 14, - "width": 62, - "height": 28 - } - }, - { - "id": "ba59909699", - "indexId": "12", - "nodeHashId": "ba59909699", - "attributes": { - "class": ".lang-item-text.lang-show-text", - "nodeType": "TEXT Node" + "left": 65, + "top": 17, + "width": 32, + "height": 23 }, - "locator": "[_midscene_retrieve_task_id='ba59909699']", - "center": [81, 28], - "content": "中文", - "rect": { - "left": 59, - "top": 14, - "width": 44, - "height": 28 - } + "htmlNode": null }, { "id": "f05ef98d09", - "indexId": "13", + "indexId": "3", "nodeHashId": "f05ef98d09", "locator": "[_midscene_retrieve_task_id='f05ef98d09']", "attributes": { @@ -226,6 +49,7 @@ "class": ".img", "nodeType": "IMG Node" }, + "nodeType": "IMG Node", "content": "", "rect": { "left": 203, @@ -233,47 +57,12 @@ "width": 44, "height": 44 }, - "center": [225, 30] - }, - { - "id": "24346f7909", - "indexId": "14", - "nodeHashId": "24346f7909", - "attributes": { - "class": ".ant-col.ant-col-xs-9.ant-col-sm-9.ant-col-md-19.ant-col-lg-16.ant-col-xl-16", - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='24346f7909']", - "center": [325, 28], - "content": "首页菜单我的登录/注册", - "rect": { - "left": 250, - "top": 8, - "width": 150, - "height": 40 - } - }, - { - "id": "24346f7909", - "indexId": "15", - "nodeHashId": "24346f7909", - "attributes": { - "class": ".ant-row", - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='24346f7909']", - "center": [325, 28], - "content": "首页菜单我的登录/注册", - "rect": { - "left": 250, - "top": 8, - "width": 150, - "height": 40 - } + "center": [225, 30], + "htmlNode": null }, { "id": "f775c69cb4", - "indexId": "16", + "indexId": "4", "nodeHashId": "f775c69cb4", "locator": "[_midscene_retrieve_task_id='f775c69cb4']", "attributes": { @@ -281,6 +70,7 @@ "class": ".icon", "nodeType": "IMG Node" }, + "nodeType": "IMG Node", "content": "", "rect": { "left": 350, @@ -288,159 +78,76 @@ "width": 25, "height": 25 }, - "center": [363, 29] - }, - { - "id": "cd8128b1e7", - "indexId": "17", - "nodeHashId": "cd8128b1e7", - "attributes": { - "class": ".", - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='cd8128b1e7']", - "center": [200, 150], - "content": "商家暂未开通外卖和自取业务喜茶 HEYTEA (Vivocity) 全岛派送,起送价 S$ 11", - "rect": { - "left": 0, - "top": 60, - "width": 400, - "height": 180 - } - }, - { - "id": "cd8128b1e7", - "indexId": "18", - "nodeHashId": "cd8128b1e7", - "attributes": { - "class": ".banner-container", - "style": "background-image: url(\"https://dec-pub-img.obs.ap-southeast-3.myhuaweicloud.com/shopimages/shop/16558697698443188.jpg\");", - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='cd8128b1e7']", - "center": [200, 150], - "content": "商家暂未开通外卖和自取业务喜茶 HEYTEA (Vivocity) 全岛派送,起送价 S$ 11", - "rect": { - "left": 0, - "top": 60, - "width": 400, - "height": 180 - } - }, - { - "id": "f5e9b47f8d", - "indexId": "19", - "nodeHashId": "f5e9b47f8d", - "attributes": { - "class": ".shop-tips", - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='f5e9b47f8d']", - "center": [200, 79], - "content": "商家暂未开通外卖和自取业务", - "rect": { - "left": 0, - "top": 60, - "width": 400, - "height": 38 - } + "center": [363, 29], + "htmlNode": null }, { - "id": "67bd3fba57", - "indexId": "20", - "nodeHashId": "67bd3fba57", + "id": "300ea47164", + "indexId": "5", + "nodeHashId": "300ea47164", + "nodeType": "TEXT Node", + "locator": "", "attributes": { "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='67bd3fba57']", - "center": [200, 80], + "center": [166, 79], "content": "商家暂未开通外卖和自取业务", "rect": { "left": 75, "top": 69, - "width": 250, - "height": 21 - } - }, - { - "id": "7eb85730bb", - "indexId": "21", - "nodeHashId": "7eb85730bb", - "attributes": { - "class": ".shop-info", - "nodeType": "TEXT Node" + "width": 182, + "height": 20 }, - "locator": "[_midscene_retrieve_task_id='7eb85730bb']", - "center": [209, 112], - "content": "喜茶 HEYTEA (Vivocity) 全岛派送,起送价 S$ 11", - "rect": { - "left": 22, - "top": 80, - "width": 373, - "height": 63 - } + "htmlNode": null }, { - "id": "c900f4b633", - "indexId": "22", - "nodeHashId": "c900f4b633", + "id": "01094ce3ba", + "indexId": "6", + "nodeHashId": "01094ce3ba", + "nodeType": "TEXT Node", + "locator": "", "attributes": { "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='c900f4b633']", - "center": [209, 98], + "center": [153, 98], "content": "喜茶 HEYTEA (Vivocity)", "rect": { "left": 22, - "top": 80, - "width": 373, - "height": 36 - } + "top": 81, + "width": 261, + "height": 34 + }, + "htmlNode": null }, { - "id": "6f761c984e", - "indexId": "23", - "nodeHashId": "6f761c984e", + "id": "e6d131525a", + "indexId": "7", + "nodeHashId": "e6d131525a", + "nodeType": "TEXT Node", + "locator": "", "attributes": { "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='6f761c984e']", - "center": [209, 133], + "center": [97, 133], "content": "全岛派送,起送价 S$ 11", "rect": { "left": 22, - "top": 122, - "width": 373, - "height": 21 - } - }, - { - "id": "19081935f3", - "indexId": "24", - "nodeHashId": "19081935f3", - "attributes": { - "class": ".about-container", - "nodeType": "TEXT Node" + "top": 123, + "width": 150, + "height": 20 }, - "locator": "[_midscene_retrieve_task_id='19081935f3']", - "center": [200, 385], - "content": "喜茶为芝士现泡茶的原创者。自创立以来,喜茶专注于呈现来自世界各地的优质茶香, 让茶饮这一古老文化焕发出新的生命力。", - "rect": { - "left": 0, - "top": 240, - "width": 400, - "height": 289 - } + "htmlNode": null }, { "id": "49118bbc89", - "indexId": "25", + "indexId": "8", "nodeHashId": "49118bbc89", "locator": "[_midscene_retrieve_task_id='49118bbc89']", "attributes": { "src": "https://dec-pub-img.obs.ap-southeast-3.myhuaweicloud.com/rfkle/16558697767831080.jpeg", "nodeType": "IMG Node" }, + "nodeType": "IMG Node", "content": "", "rect": { "left": 16, @@ -448,433 +155,202 @@ "width": 368, "height": 180 }, - "center": [200, 350] + "center": [200, 350], + "htmlNode": null }, { - "id": "31c3a4bba6", - "indexId": "26", - "nodeHashId": "31c3a4bba6", + "id": "cd2af441fc", + "indexId": "9", + "nodeHashId": "cd2af441fc", + "nodeType": "TEXT Node", + "locator": "", "attributes": { "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='31c3a4bba6']", - "center": [200, 482], + "center": [152, 482], "content": "喜茶为芝士现泡茶的原创者。自创立以来,喜茶专注于呈现来自世界各地的优质茶香, 让茶饮这一古老文化焕发出新的生命力。", "rect": { "left": 16, - "top": 450, - "width": 368, - "height": 63 - } - }, - { - "id": "711f06a5b6", - "indexId": "27", - "nodeHashId": "711f06a5b6", - "attributes": { - "class": ".menu-tabs-title", - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='711f06a5b6']", - "center": [200, 569], - "content": "菜单 评价 商家", - "rect": { - "left": 0, - "top": 545, - "width": 400, - "height": 48 - } - }, - { - "id": "711f06a5b6", - "indexId": "28", - "nodeHashId": "711f06a5b6", - "attributes": { - "class": ".menu-tabs-inner", - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='711f06a5b6']", - "center": [200, 569], - "content": "菜单 评价 商家", - "rect": { - "left": 0, - "top": 545, - "width": 400, - "height": 48 - } - }, - { - "id": "5a60b6cd34", - "indexId": "29", - "nodeHashId": "5a60b6cd34", - "attributes": { - "class": ".menu-item.active", - "nodeType": "TEXT Node" + "top": 451, + "width": 271, + "height": 62 }, - "locator": "[_midscene_retrieve_task_id='5a60b6cd34']", - "center": [128, 569], - "content": "菜单", - "rect": { - "left": 112, - "top": 545, - "width": 32, - "height": 48 - } + "htmlNode": null }, { - "id": "079f969064", - "indexId": "30", - "nodeHashId": "079f969064", + "id": "904db22ba6", + "indexId": "10", + "nodeHashId": "904db22ba6", + "nodeType": "TEXT Node", + "locator": "", "attributes": { "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='079f969064']", "center": [128, 569], "content": "菜单", "rect": { "left": 112, "top": 557, "width": 32, - "height": 24 - } - }, - { - "id": "425468ab92", - "indexId": "31", - "nodeHashId": "425468ab92", - "attributes": { - "class": ".menu-item", - "nodeType": "TEXT Node" + "height": 23 }, - "locator": "[_midscene_retrieve_task_id='425468ab92']", - "center": [200, 569], - "content": "评价", - "rect": { - "left": 184, - "top": 545, - "width": 32, - "height": 48 - } + "htmlNode": null }, { - "id": "b0931353bd", - "indexId": "32", - "nodeHashId": "b0931353bd", + "id": "4840be5f9e", + "indexId": "11", + "nodeHashId": "4840be5f9e", + "nodeType": "TEXT Node", + "locator": "", "attributes": { "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='b0931353bd']", "center": [200, 569], "content": "评价", "rect": { "left": 184, "top": 557, "width": 32, - "height": 24 - } - }, - { - "id": "70c4e79030", - "indexId": "33", - "nodeHashId": "70c4e79030", - "attributes": { - "class": ".menu-item", - "nodeType": "TEXT Node" + "height": 23 }, - "locator": "[_midscene_retrieve_task_id='70c4e79030']", - "center": [272, 569], - "content": "商家", - "rect": { - "left": 256, - "top": 545, - "width": 32, - "height": 48 - } + "htmlNode": null }, { - "id": "afab9cd02f", - "indexId": "34", - "nodeHashId": "afab9cd02f", + "id": "cf1e3e2d69", + "indexId": "12", + "nodeHashId": "cf1e3e2d69", + "nodeType": "TEXT Node", + "locator": "", "attributes": { "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='afab9cd02f']", "center": [272, 569], "content": "商家", "rect": { "left": 256, "top": 557, "width": 32, - "height": 24 - } - }, - { - "id": "06704570b7", - "indexId": "35", - "nodeHashId": "06704570b7", - "attributes": { - "class": ".side-bar-item.active", - "nodeType": "TEXT Node" + "height": 23 }, - "locator": "[_midscene_retrieve_task_id='06704570b7']", - "center": [38, 623], - "content": "时令鲜果", - "rect": { - "left": 0, - "top": 593, - "width": 75, - "height": 60 - } + "htmlNode": null }, { - "id": "88e7fb5aed", - "indexId": "36", - "nodeHashId": "88e7fb5aed", + "id": "4cc3cbe871", + "indexId": "13", + "nodeHashId": "4cc3cbe871", + "nodeType": "TEXT Node", + "locator": "", "attributes": { "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='88e7fb5aed']", - "center": [29, 623], + "center": [29, 624], "content": "时令鲜果", "rect": { "left": 5, - "top": 614, + "top": 615, "width": 48, - "height": 18 - } - }, - { - "id": "c6b810214d", - "indexId": "37", - "nodeHashId": "c6b810214d", - "attributes": { - "class": ".side-bar-item", - "nodeType": "TEXT Node" + "height": 17 }, - "locator": "[_midscene_retrieve_task_id='c6b810214d']", - "center": [38, 683], - "content": "清爽不喝腻", - "rect": { - "left": 0, - "top": 653, - "width": 75, - "height": 60 - } + "htmlNode": null }, { - "id": "cee3c6676f", - "indexId": "38", - "nodeHashId": "cee3c6676f", + "id": "0f5c641a0b", + "indexId": "14", + "nodeHashId": "0f5c641a0b", + "nodeType": "TEXT Node", + "locator": "", "attributes": { "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='cee3c6676f']", - "center": [35, 683], + "center": [35, 684], "content": "清爽不喝腻", "rect": { "left": 5, - "top": 674, + "top": 675, "width": 60, - "height": 18 - } - }, - { - "id": "fcdda0192a", - "indexId": "39", - "nodeHashId": "fcdda0192a", - "attributes": { - "class": ".side-bar-item", - "nodeType": "TEXT Node" + "height": 17 }, - "locator": "[_midscene_retrieve_task_id='fcdda0192a']", - "center": [38, 743], - "content": "经典不踩雷", - "rect": { - "left": 0, - "top": 713, - "width": 75, - "height": 60 - } + "htmlNode": null }, { - "id": "512ab699a2", - "indexId": "40", - "nodeHashId": "512ab699a2", + "id": "b37f775c20", + "indexId": "15", + "nodeHashId": "b37f775c20", + "nodeType": "TEXT Node", + "locator": "", "attributes": { "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='512ab699a2']", - "center": [35, 743], + "center": [35, 744], "content": "经典不踩雷", "rect": { "left": 5, - "top": 734, + "top": 735, "width": 60, - "height": 18 - } - }, - { - "id": "80076328e8", - "indexId": "41", - "nodeHashId": "80076328e8", - "attributes": { - "class": ".side-bar-item", - "nodeType": "TEXT Node" + "height": 17 }, - "locator": "[_midscene_retrieve_task_id='80076328e8']", - "center": [38, 803], - "content": "要浓郁", - "rect": { - "left": 0, - "top": 773, - "width": 75, - "height": 60 - } + "htmlNode": null }, { - "id": "3948acb8ad", - "indexId": "42", - "nodeHashId": "3948acb8ad", + "id": "8d316ca893", + "indexId": "16", + "nodeHashId": "8d316ca893", + "nodeType": "TEXT Node", + "locator": "", "attributes": { "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='3948acb8ad']", - "center": [23, 803], + "center": [23, 804], "content": "要浓郁", "rect": { "left": 5, - "top": 794, + "top": 795, "width": 36, - "height": 18 - } - }, - { - "id": "531f3e11d4", - "indexId": "43", - "nodeHashId": "531f3e11d4", - "attributes": { - "class": ".side-bar-item", - "nodeType": "TEXT Node" + "height": 17 }, - "locator": "[_midscene_retrieve_task_id='531f3e11d4']", - "center": [38, 863], - "content": "要简单", - "rect": { - "left": 0, - "top": 833, - "width": 75, - "height": 60 - } + "htmlNode": null }, { - "id": "985ed5922f", - "indexId": "44", - "nodeHashId": "985ed5922f", + "id": "ccea1668f3", + "indexId": "17", + "nodeHashId": "ccea1668f3", + "nodeType": "TEXT Node", + "locator": "", "attributes": { "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='985ed5922f']", - "center": [23, 863], + "center": [23, 864], "content": "要简单", "rect": { "left": 5, - "top": 854, + "top": 855, "width": 36, - "height": 18 - } - }, - { - "id": "6e96539dce", - "indexId": "45", - "nodeHashId": "6e96539dce", - "attributes": { - "class": ".menu-item-container.dish-list-item-mobile.dish-list-item-mobile-0", - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='6e96539dce']", - "center": [238, 678], - "content": "时令鲜果 (1) 多肉大橘(首创) 果肉丰盈,粒粒饱满多汁;精心调配果汁与绿妍茶底的比例打制成冰沙;搭配清甜的无香精桂花冻与Q谈脆波波,再用香水柠檬片作点缀,口感丰富,香气有层次。默认标准杯500ml,可根据个人喜好选择加大杯650ml。6.82 选规格", - "rect": { - "left": 88, - "top": 606, - "width": 299, - "height": 143 - } - }, - { - "id": "321fe7e3a5", - "indexId": "46", - "nodeHashId": "321fe7e3a5", - "attributes": { - "class": ".menu-item-title", - "nodeType": "TEXT Node" + "height": 17 }, - "locator": "[_midscene_retrieve_task_id='321fe7e3a5']", - "center": [238, 633], - "content": "时令鲜果 (1)", - "rect": { - "left": 88, - "top": 606, - "width": 299, - "height": 53 - } + "htmlNode": null }, { - "id": "e54bc06de4", - "indexId": "47", - "nodeHashId": "e54bc06de4", + "id": "ce812d5bc7", + "indexId": "18", + "nodeHashId": "ce812d5bc7", + "nodeType": "TEXT Node", + "locator": "", "attributes": { "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='e54bc06de4']", "center": [126, 633], "content": "时令鲜果 (1)", "rect": { "left": 88, - "top": 622, + "top": 623, "width": 76, - "height": 21 - } - }, - { - "id": "502323f060", - "indexId": "48", - "nodeHashId": "502323f060", - "attributes": { - "class": ".menu-item-list", - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='502323f060']", - "center": [238, 704], - "content": "多肉大橘(首创) 果肉丰盈,粒粒饱满多汁;精心调配果汁与绿妍茶底的比例打制成冰沙;搭配清甜的无香精桂花冻与Q谈脆波波,再用香水柠檬片作点缀,口感丰富,香气有层次。默认标准杯500ml,可根据个人喜好选择加大杯650ml。6.82 选规格", - "rect": { - "left": 88, - "top": 659, - "width": 299, - "height": 90 - } - }, - { - "id": "502323f060", - "indexId": "49", - "nodeHashId": "502323f060", - "attributes": { - "class": ".menu-item-item", - "nodeType": "TEXT Node" + "height": 20 }, - "locator": "[_midscene_retrieve_task_id='502323f060']", - "center": [238, 704], - "content": "多肉大橘(首创) 果肉丰盈,粒粒饱满多汁;精心调配果汁与绿妍茶底的比例打制成冰沙;搭配清甜的无香精桂花冻与Q谈脆波波,再用香水柠檬片作点缀,口感丰富,香气有层次。默认标准杯500ml,可根据个人喜好选择加大杯650ml。6.82 选规格", - "rect": { - "left": 88, - "top": 659, - "width": 299, - "height": 90 - } + "htmlNode": null }, { "id": "02bf1e20e5", - "indexId": "50", + "indexId": "19", "nodeHashId": "02bf1e20e5", "locator": "[_midscene_retrieve_task_id='02bf1e20e5']", "attributes": { @@ -882,6 +358,7 @@ "class": ".img", "nodeType": "IMG Node" }, + "nodeType": "IMG Node", "content": "", "rect": { "left": 88, @@ -889,125 +366,56 @@ "width": 90, "height": 90 }, - "center": [133, 704] - }, - { - "id": "11b1862fb3", - "indexId": "51", - "nodeHashId": "11b1862fb3", - "attributes": { - "class": ".item-info-wrapper", - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='11b1862fb3']", - "center": [283, 704], - "content": "多肉大橘(首创) 果肉丰盈,粒粒饱满多汁;精心调配果汁与绿妍茶底的比例打制成冰沙;搭配清甜的无香精桂花冻与Q谈脆波波,再用香水柠檬片作点缀,口感丰富,香气有层次。默认标准杯500ml,可根据个人喜好选择加大杯650ml。6.82 选规格", - "rect": { - "left": 178, - "top": 659, - "width": 209, - "height": 90 - } - }, - { - "id": "31e2a49f8c", - "indexId": "52", - "nodeHashId": "31e2a49f8c", - "attributes": { - "id": "dish-704633", - "class": ".item-info-box", - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='31e2a49f8c']", - "center": [288, 678], - "content": "多肉大橘(首创) 果肉丰盈,粒粒饱满多汁;精心调配果汁与绿妍茶底的比例打制成冰沙;搭配清甜的无香精桂花冻与Q谈脆波波,再用香水柠檬片作点缀,口感丰富,香气有层次。默认标准杯500ml,可根据个人喜好选择加大杯650ml。", - "rect": { - "left": 188, - "top": 659, - "width": 199, - "height": 38 - } + "center": [133, 704], + "htmlNode": null }, { - "id": "c93bedf4d3", - "indexId": "53", - "nodeHashId": "c93bedf4d3", + "id": "868b85b299", + "indexId": "20", + "nodeHashId": "868b85b299", + "nodeType": "TEXT Node", + "locator": "", "attributes": { "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='c93bedf4d3']", - "center": [288, 670], + "center": [244, 670], "content": "多肉大橘(首创)", "rect": { "left": 188, - "top": 659, - "width": 199, - "height": 21 - } - }, - { - "id": "1b673db570", - "indexId": "54", - "nodeHashId": "1b673db570", - "attributes": { - "class": ".van-ellipsis", - "nodeType": "TEXT Node" + "top": 660, + "width": 112, + "height": 20 }, - "locator": "[_midscene_retrieve_task_id='1b673db570']", - "center": [288, 691], - "content": "果肉丰盈,粒粒饱满多汁;精心调配果汁与绿妍茶底的比例打制成冰沙;搭配清甜的无香精桂花冻与Q谈脆波波,再用香水柠檬片作点缀,口感丰富,香气有层次。默认标准杯500ml,可根据个人喜好选择加大杯650ml。", - "rect": { - "left": 188, - "top": 684, - "width": 199, - "height": 13 - } + "htmlNode": null }, { - "id": "1c4b7cfbcd", - "indexId": "55", - "nodeHashId": "1c4b7cfbcd", + "id": "ce55df24db", + "indexId": "21", + "nodeHashId": "ce55df24db", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".item-info-price", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='1c4b7cfbcd']", - "center": [288, 725], - "content": "6.82 选规格", + "center": [719, 691], + "content": "果肉丰盈,粒粒饱满多汁;精心调配果汁与绿妍茶底的比例打制成冰沙;搭配清甜的无香精桂花冻与Q谈脆波波,再用香水柠檬片作点缀,口感丰富,香气有层次。默认标准杯500ml,可根据个人喜好选择加大杯650ml。", "rect": { "left": 188, - "top": 700, - "width": 199, - "height": 50 - } - }, - { - "id": "f188abe197", - "indexId": "56", - "nodeHashId": "f188abe197", - "attributes": { - "class": ".info-price", - "nodeType": "TEXT Node" + "top": 683, + "width": 1062, + "height": 15 }, - "locator": "[_midscene_retrieve_task_id='f188abe197']", - "center": [209, 736], - "content": "6.82", - "rect": { - "left": 188, - "top": 722, - "width": 41, - "height": 27 - } + "htmlNode": null }, { "id": "14103376fb", - "indexId": "57", + "indexId": "22", "nodeHashId": "14103376fb", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".price", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='14103376fb']", "center": [211, 736], "content": "6.82", "rect": { @@ -1015,100 +423,50 @@ "top": 723, "width": 37, "height": 25 - } - }, - { - "id": "3b27c0b234", - "indexId": "58", - "nodeHashId": "3b27c0b234", - "attributes": { - "class": ".comp-add-cart-button.mobile", - "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='3b27c0b234']", - "center": [355, 725], - "content": "选规格", - "rect": { - "left": 322, - "top": 700, - "width": 65, - "height": 50 - } + "htmlNode": null }, { - "id": "580cfae23c", - "indexId": "59", - "nodeHashId": "580cfae23c", + "id": "fadfa10182", + "indexId": "23", + "nodeHashId": "fadfa10182", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".handle-btn", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='580cfae23c']", "center": [355, 732], "content": "选规格", "rect": { - "left": 322, - "top": 720, - "width": 65, - "height": 24 - } - }, - { - "id": "ffe12f5315", - "indexId": "60", - "nodeHashId": "ffe12f5315", - "attributes": { - "class": ".menu-item-title", - "nodeType": "TEXT Node" + "left": 337, + "top": 723, + "width": 36, + "height": 17 }, - "locator": "[_midscene_retrieve_task_id='ffe12f5315']", - "center": [238, 776], - "content": "清爽不喝腻 (5)", - "rect": { - "left": 88, - "top": 749, - "width": 299, - "height": 53 - } + "htmlNode": null }, { - "id": "7f10fa6626", - "indexId": "61", - "nodeHashId": "7f10fa6626", + "id": "a626e598e4", + "indexId": "24", + "nodeHashId": "a626e598e4", + "nodeType": "TEXT Node", + "locator": "", "attributes": { "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='7f10fa6626']", "center": [134, 776], "content": "清爽不喝腻 (5)", "rect": { "left": 88, - "top": 765, + "top": 766, "width": 92, - "height": 21 - } - }, - { - "id": "bda131bc3e", - "indexId": "62", - "nodeHashId": "bda131bc3e", - "attributes": { - "class": ".menu-item-item", - "nodeType": "TEXT Node" + "height": 20 }, - "locator": "[_midscene_retrieve_task_id='bda131bc3e']", - "center": [238, 847], - "content": "轻芒芒甘露 更清爽的芒芒甘露,芒着清爽,芒着解腻。当季芒果,新鲜手切,香甜浓郁;加入红柚果粒与Q弹的脆波波,轻盈不轻量。清爽的芒果绿妍冰沙平衡椰浆的比例,清爽不简单。6.54 选规格", - "rect": { - "left": 88, - "top": 802, - "width": 299, - "height": 90 - } + "htmlNode": null }, { "id": "eb294263b8", - "indexId": "63", + "indexId": "25", "nodeHashId": "eb294263b8", "locator": "[_midscene_retrieve_task_id='eb294263b8']", "attributes": { @@ -1116,6 +474,7 @@ "class": ".img", "nodeType": "IMG Node" }, + "nodeType": "IMG Node", "content": "", "rect": { "left": 88, @@ -1123,125 +482,56 @@ "width": 90, "height": 90 }, - "center": [133, 847] - }, - { - "id": "43823b660f", - "indexId": "64", - "nodeHashId": "43823b660f", - "attributes": { - "class": ".item-info-wrapper", - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='43823b660f']", - "center": [283, 847], - "content": "轻芒芒甘露 更清爽的芒芒甘露,芒着清爽,芒着解腻。当季芒果,新鲜手切,香甜浓郁;加入红柚果粒与Q弹的脆波波,轻盈不轻量。清爽的芒果绿妍冰沙平衡椰浆的比例,清爽不简单。6.54 选规格", - "rect": { - "left": 178, - "top": 802, - "width": 209, - "height": 90 - } - }, - { - "id": "d4e90a8a56", - "indexId": "65", - "nodeHashId": "d4e90a8a56", - "attributes": { - "id": "dish-704625", - "class": ".item-info-box", - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='d4e90a8a56']", - "center": [288, 821], - "content": "轻芒芒甘露 更清爽的芒芒甘露,芒着清爽,芒着解腻。当季芒果,新鲜手切,香甜浓郁;加入红柚果粒与Q弹的脆波波,轻盈不轻量。清爽的芒果绿妍冰沙平衡椰浆的比例,清爽不简单。", - "rect": { - "left": 188, - "top": 802, - "width": 199, - "height": 38 - } + "center": [133, 847], + "htmlNode": null }, { - "id": "2e297d0b4a", - "indexId": "66", - "nodeHashId": "2e297d0b4a", + "id": "a7029d417e", + "indexId": "26", + "nodeHashId": "a7029d417e", + "nodeType": "TEXT Node", + "locator": "", "attributes": { "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='2e297d0b4a']", - "center": [288, 813], + "center": [223, 813], "content": "轻芒芒甘露", "rect": { "left": 188, - "top": 802, - "width": 199, - "height": 21 - } - }, - { - "id": "9f0e2a5328", - "indexId": "67", - "nodeHashId": "9f0e2a5328", - "attributes": { - "class": ".van-ellipsis", - "nodeType": "TEXT Node" + "top": 803, + "width": 70, + "height": 20 }, - "locator": "[_midscene_retrieve_task_id='9f0e2a5328']", - "center": [288, 834], - "content": "更清爽的芒芒甘露,芒着清爽,芒着解腻。当季芒果,新鲜手切,香甜浓郁;加入红柚果粒与Q弹的脆波波,轻盈不轻量。清爽的芒果绿妍冰沙平衡椰浆的比例,清爽不简单。", - "rect": { - "left": 188, - "top": 827, - "width": 199, - "height": 13 - } + "htmlNode": null }, { - "id": "7a0ed1e98f", - "indexId": "68", - "nodeHashId": "7a0ed1e98f", + "id": "5c923fbd67", + "indexId": "27", + "nodeHashId": "5c923fbd67", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".item-info-price", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='7a0ed1e98f']", - "center": [288, 868], - "content": "6.54 选规格", + "center": [610, 834], + "content": "更清爽的芒芒甘露,芒着清爽,芒着解腻。当季芒果,新鲜手切,香甜浓郁;加入红柚果粒与Q弹的脆波波,轻盈不轻量。清爽的芒果绿妍冰沙平衡椰浆的比例,清爽不简单。", "rect": { "left": 188, - "top": 843, - "width": 199, - "height": 50 - } - }, - { - "id": "aa1be7f4a4", - "indexId": "69", - "nodeHashId": "aa1be7f4a4", - "attributes": { - "class": ".info-price", - "nodeType": "TEXT Node" + "top": 826, + "width": 844, + "height": 15 }, - "locator": "[_midscene_retrieve_task_id='aa1be7f4a4']", - "center": [209, 879], - "content": "6.54", - "rect": { - "left": 188, - "top": 865, - "width": 41, - "height": 27 - } + "htmlNode": null }, { "id": "0250e12e67", - "indexId": "70", + "indexId": "28", "nodeHashId": "0250e12e67", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".price", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='0250e12e67']", "center": [211, 879], "content": "6.54", "rect": { @@ -1249,53 +539,38 @@ "top": 866, "width": 37, "height": 25 - } - }, - { - "id": "d1ff9b7fc8", - "indexId": "71", - "nodeHashId": "d1ff9b7fc8", - "attributes": { - "class": ".comp-add-cart-button.mobile", - "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='d1ff9b7fc8']", - "center": [355, 868], - "content": "选规格", - "rect": { - "left": 322, - "top": 843, - "width": 65, - "height": 50 - } + "htmlNode": null }, { - "id": "925c254744", - "indexId": "72", - "nodeHashId": "925c254744", + "id": "001617dbf8", + "indexId": "29", + "nodeHashId": "001617dbf8", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".handle-btn", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='925c254744']", "center": [355, 875], "content": "选规格", "rect": { - "left": 322, - "top": 863, - "width": 65, - "height": 24 - } + "left": 337, + "top": 866, + "width": 36, + "height": 17 + }, + "htmlNode": null }, { "id": "cad3004a2d", - "indexId": "73", + "indexId": "30", "nodeHashId": "cad3004a2d", "locator": "[_midscene_retrieve_task_id='cad3004a2d']", "attributes": { "src": "/img/customer.8a8d9dc9.png", "nodeType": "IMG Node" }, + "nodeType": "IMG Node", "content": "", "rect": { "left": 358, @@ -1303,6 +578,7 @@ "width": 42, "height": 42 }, - "center": [379, 834] + "center": [379, 834], + "htmlNode": null } ] diff --git a/packages/midscene/tests/ai/inspector/test-data/online_order/output.png b/packages/midscene/tests/ai/inspector/test-data/online_order/output.png index b84d9ab6..373a16b8 100644 Binary files a/packages/midscene/tests/ai/inspector/test-data/online_order/output.png and b/packages/midscene/tests/ai/inspector/test-data/online_order/output.png differ diff --git a/packages/midscene/tests/ai/inspector/test-data/online_order/output_without_text.png b/packages/midscene/tests/ai/inspector/test-data/online_order/output_without_text.png index 34ada980..5309be94 100644 Binary files a/packages/midscene/tests/ai/inspector/test-data/online_order/output_without_text.png and b/packages/midscene/tests/ai/inspector/test-data/online_order/output_without_text.png differ diff --git a/packages/midscene/tests/ai/inspector/test-data/todo/element-snapshot.json b/packages/midscene/tests/ai/inspector/test-data/todo/element-snapshot.json index e2b23ff8..ea3fd400 100644 --- a/packages/midscene/tests/ai/inspector/test-data/todo/element-snapshot.json +++ b/packages/midscene/tests/ai/inspector/test-data/todo/element-snapshot.json @@ -1,99 +1,29 @@ [ { - "id": "ea40edd387", + "id": "7bd167db0a", "indexId": "1", - "nodeHashId": "ea40edd387", + "nodeHashId": "7bd167db0a", + "nodeType": "TEXT Node", + "locator": "", "attributes": { "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='ea40edd387']", - "center": [640, 333], - "content": "todosNew Todo InputToggle All InputLearn PythonLearn RustLearn AI3 items left!AllActiveCompletedClear completedDouble-click to edit a todoCreated by the TodoMVC TeamPart of TodoMVC", - "rect": { - "left": 365, - "top": 130, - "width": 550, - "height": 405 - } - }, - { - "id": "9852da9d9d", - "indexId": "2", - "nodeHashId": "9852da9d9d", - "attributes": { - "class": ".todoapp", - "id": "root", - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='9852da9d9d']", - "center": [640, 273], - "content": "todosNew Todo InputToggle All InputLearn PythonLearn RustLearn AI3 items left!AllActiveCompletedClear completed", - "rect": { - "left": 365, - "top": 130, - "width": 550, - "height": 285 - } - }, - { - "id": "4fb6353da5", - "indexId": "3", - "nodeHashId": "4fb6353da5", - "attributes": { - "class": ".header", - "data-testid": "header", - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='4fb6353da5']", - "center": [640, 163], - "content": "todosNew Todo Input", - "rect": { - "left": 365, - "top": 130, - "width": 550, - "height": 65 - } - }, - { - "id": "ab22d01377", - "indexId": "4", - "nodeHashId": "ab22d01377", - "attributes": { - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='ab22d01377']", - "center": [640, 66], + "center": [640, 67], "content": "todos", "rect": { - "left": 365, - "top": 56, - "width": 550, - "height": 20 - } - }, - { - "id": "8017b79ddf", - "indexId": "5", - "nodeHashId": "8017b79ddf", - "attributes": { - "class": ".input-container", - "nodeType": "TEXT Node" + "left": 546, + "top": 19, + "width": 188, + "height": 95 }, - "locator": "[_midscene_retrieve_task_id='8017b79ddf']", - "center": [640, 163], - "content": "New Todo Input", - "rect": { - "left": 365, - "top": 130, - "width": 550, - "height": 65 - } + "htmlNode": null }, { "id": "3530a9c1eb", - "indexId": "6", + "indexId": "2", "nodeHashId": "3530a9c1eb", "locator": "[_midscene_retrieve_task_id='3530a9c1eb']", + "nodeType": "INPUT Node", "attributes": { "class": ".new-todo", "id": "todo-input", @@ -109,32 +39,34 @@ "width": 550, "height": 65 }, - "center": [640, 163] + "center": [640, 163], + "htmlNode": null }, { - "id": "69f35e9901", - "indexId": "7", - "nodeHashId": "69f35e9901", + "id": "074c5bdb3b", + "indexId": "3", + "nodeHashId": "074c5bdb3b", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".main", - "data-testid": "main", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='69f35e9901']", - "center": [640, 285], - "content": "Toggle All InputLearn PythonLearn RustLearn AI", + "center": [960, 140], + "content": "New Todo Input", "rect": { - "left": 365, - "top": 195, - "width": 550, - "height": 179 - } + "left": 914, + "top": 131, + "width": 91, + "height": 17 + }, + "htmlNode": null }, { "id": "eb02ad0e19", - "indexId": "8", + "indexId": "4", "nodeHashId": "eb02ad0e19", "locator": "[_midscene_retrieve_task_id='eb02ad0e19']", + "nodeType": "INPUT Node", "attributes": { "class": ".toggle-all", "type": "checkbox", @@ -148,88 +80,15 @@ "width": 40, "height": 60 }, - "center": [389, 163] - }, - { - "id": "22625b5e51", - "indexId": "9", - "nodeHashId": "22625b5e51", - "attributes": { - "class": ".toggle-all-label", - "for": "toggle-all", - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='22625b5e51']", - "center": [388, 164], - "content": "Toggle All Input", - "rect": { - "left": 365, - "top": 131, - "width": 45, - "height": 65 - } - }, - { - "id": "e4ef824007", - "indexId": "10", - "nodeHashId": "e4ef824007", - "attributes": { - "class": ".todo-list", - "data-testid": "todo-list", - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='e4ef824007']", - "center": [640, 285], - "content": "Learn PythonLearn RustLearn AI", - "rect": { - "left": 365, - "top": 196, - "width": 550, - "height": 178 - } - }, - { - "id": "4f56e8b8e4", - "indexId": "11", - "nodeHashId": "4f56e8b8e4", - "attributes": { - "class": ".", - "data-testid": "todo-item", - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='4f56e8b8e4']", - "center": [640, 226], - "content": "Learn Python", - "rect": { - "left": 365, - "top": 196, - "width": 550, - "height": 60 - } - }, - { - "id": "46449cb0ef", - "indexId": "12", - "nodeHashId": "46449cb0ef", - "attributes": { - "class": ".view", - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='46449cb0ef']", - "center": [640, 226], - "content": "Learn Python", - "rect": { - "left": 365, - "top": 196, - "width": 550, - "height": 59 - } + "center": [389, 163], + "htmlNode": null }, { "id": "e0a509c9a3", - "indexId": "13", + "indexId": "5", "nodeHashId": "e0a509c9a3", "locator": "[_midscene_retrieve_task_id='e0a509c9a3']", + "nodeType": "INPUT Node", "attributes": { "class": ".toggle", "type": "checkbox", @@ -243,68 +102,34 @@ "width": 40, "height": 40 }, - "center": [385, 225] + "center": [385, 225], + "htmlNode": null }, { - "id": "46449cb0ef", - "indexId": "14", - "nodeHashId": "46449cb0ef", + "id": "e6200904d4", + "indexId": "6", + "nodeHashId": "e6200904d4", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "data-testid": "todo-item-label", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='46449cb0ef']", - "center": [640, 226], + "center": [497, 225], "content": "Learn Python", "rect": { - "left": 365, - "top": 196, - "width": 550, - "height": 59 - } - }, - { - "id": "a8143d1217", - "indexId": "15", - "nodeHashId": "a8143d1217", - "attributes": { - "class": ".", - "data-testid": "todo-item", - "nodeType": "TEXT Node" + "left": 425, + "top": 211, + "width": 143, + "height": 28 }, - "locator": "[_midscene_retrieve_task_id='a8143d1217']", - "center": [640, 286], - "content": "Learn Rust", - "rect": { - "left": 365, - "top": 256, - "width": 550, - "height": 60 - } - }, - { - "id": "b5bacc879a", - "indexId": "16", - "nodeHashId": "b5bacc879a", - "attributes": { - "class": ".view", - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='b5bacc879a']", - "center": [640, 286], - "content": "Learn Rust", - "rect": { - "left": 365, - "top": 256, - "width": 550, - "height": 59 - } + "htmlNode": null }, { "id": "c0751f3b26", - "indexId": "17", + "indexId": "7", "nodeHashId": "c0751f3b26", "locator": "[_midscene_retrieve_task_id='c0751f3b26']", + "nodeType": "INPUT Node", "attributes": { "class": ".toggle", "type": "checkbox", @@ -318,30 +143,33 @@ "width": 40, "height": 40 }, - "center": [385, 285] + "center": [385, 285], + "htmlNode": null }, { - "id": "b5bacc879a", - "indexId": "18", - "nodeHashId": "b5bacc879a", + "id": "e477ad490a", + "indexId": "8", + "nodeHashId": "e477ad490a", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "data-testid": "todo-item-label", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='b5bacc879a']", - "center": [640, 286], + "center": [484, 285], "content": "Learn Rust", "rect": { - "left": 365, - "top": 256, - "width": 550, - "height": 59 - } + "left": 425, + "top": 271, + "width": 117, + "height": 28 + }, + "htmlNode": null }, { "id": "7ccd467339", - "indexId": "19", + "indexId": "9", "nodeHashId": "7ccd467339", + "nodeType": "BUTTON Node", "locator": "[_midscene_retrieve_task_id='7ccd467339']", "attributes": { "class": ".destroy", @@ -355,50 +183,15 @@ "width": 40, "height": 40 }, - "center": [885, 285] - }, - { - "id": "6c30e37d29", - "indexId": "20", - "nodeHashId": "6c30e37d29", - "attributes": { - "class": ".", - "data-testid": "todo-item", - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='6c30e37d29']", - "center": [640, 346], - "content": "Learn AI", - "rect": { - "left": 365, - "top": 316, - "width": 550, - "height": 59 - } - }, - { - "id": "6c30e37d29", - "indexId": "21", - "nodeHashId": "6c30e37d29", - "attributes": { - "class": ".view", - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='6c30e37d29']", - "center": [640, 346], - "content": "Learn AI", - "rect": { - "left": 365, - "top": 316, - "width": 550, - "height": 59 - } + "center": [885, 285], + "htmlNode": null }, { "id": "eb987bf616", - "indexId": "22", + "indexId": "10", "nodeHashId": "eb987bf616", "locator": "[_midscene_retrieve_task_id='eb987bf616']", + "nodeType": "INPUT Node", "attributes": { "class": ".toggle", "type": "checkbox", @@ -412,194 +205,109 @@ "width": 40, "height": 40 }, - "center": [385, 345] + "center": [385, 345], + "htmlNode": null }, { - "id": "6c30e37d29", - "indexId": "23", - "nodeHashId": "6c30e37d29", + "id": "00528631df", + "indexId": "11", + "nodeHashId": "00528631df", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "data-testid": "todo-item-label", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='6c30e37d29']", - "center": [640, 346], + "center": [470, 345], "content": "Learn AI", "rect": { - "left": 365, - "top": 316, - "width": 550, - "height": 59 - } - }, - { - "id": "e11f6c5a9b", - "indexId": "24", - "nodeHashId": "e11f6c5a9b", - "attributes": { - "class": ".footer", - "data-testid": "footer", - "nodeType": "TEXT Node" + "left": 425, + "top": 331, + "width": 89, + "height": 28 }, - "locator": "[_midscene_retrieve_task_id='e11f6c5a9b']", - "center": [640, 395], - "content": "3 items left!AllActiveCompletedClear completed", - "rect": { - "left": 365, - "top": 374, - "width": 550, - "height": 41 - } + "htmlNode": null }, { - "id": "12fb207e82", - "indexId": "25", - "nodeHashId": "12fb207e82", + "id": "7a0f49a164", + "indexId": "12", + "nodeHashId": "7a0f49a164", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".todo-count", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='12fb207e82']", "center": [416, 395], "content": "3 items left!", "rect": { "left": 380, - "top": 385, + "top": 386, "width": 72, - "height": 20 - } - }, - { - "id": "264f4823c9", - "indexId": "26", - "nodeHashId": "264f4823c9", - "attributes": { - "class": ".filters", - "data-testid": "footer-navigation", - "nodeType": "TEXT Node" + "height": 18 }, - "locator": "[_midscene_retrieve_task_id='264f4823c9']", - "center": [640, 395], - "content": "AllActiveCompleted", - "rect": { - "left": 365, - "top": 385, - "width": 550, - "height": 20 - } + "htmlNode": null }, { - "id": "1a93d63ded", - "indexId": "27", - "nodeHashId": "1a93d63ded", + "id": "7f7c26491c", + "indexId": "13", + "nodeHashId": "7f7c26491c", + "nodeType": "TEXT Node", + "locator": "", "attributes": { "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='1a93d63ded']", "center": [565, 395], "content": "All", "rect": { - "left": 547, + "left": 558, "top": 386, - "width": 36, + "width": 14, "height": 18 - } - }, - { - "id": "944c1fae15", - "indexId": "28", - "nodeHashId": "944c1fae15", - "attributes": { - "class": ".selected", - "href": "#/", - "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='944c1fae15']", - "center": [565, 395], - "content": "All", - "rect": { - "left": 550, - "top": 382, - "width": 30, - "height": 26 - } + "htmlNode": null }, { - "id": "02fc5f5f2a", - "indexId": "29", - "nodeHashId": "02fc5f5f2a", + "id": "fe18355b5a", + "indexId": "14", + "nodeHashId": "fe18355b5a", + "nodeType": "TEXT Node", + "locator": "", "attributes": { "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='02fc5f5f2a']", "center": [613, 395], "content": "Active", "rect": { - "left": 583, + "left": 594, "top": 386, - "width": 60, + "width": 38, "height": 18 - } - }, - { - "id": "fc1a3e34a0", - "indexId": "30", - "nodeHashId": "fc1a3e34a0", - "attributes": { - "class": ".", - "href": "#/active", - "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='fc1a3e34a0']", - "center": [613, 395], - "content": "Active", - "rect": { - "left": 586, - "top": 382, - "width": 54, - "height": 26 - } + "htmlNode": null }, { - "id": "22220fe185", - "indexId": "31", - "nodeHashId": "22220fe185", + "id": "284ba7f2b3", + "indexId": "15", + "nodeHashId": "284ba7f2b3", + "nodeType": "TEXT Node", + "locator": "", "attributes": { "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='22220fe185']", "center": [688, 395], "content": "Completed", "rect": { - "left": 642, + "left": 653, "top": 386, - "width": 91, + "width": 69, "height": 18 - } - }, - { - "id": "0f8f471e06", - "indexId": "32", - "nodeHashId": "0f8f471e06", - "attributes": { - "class": ".", - "href": "#/completed", - "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='0f8f471e06']", - "center": [688, 395], - "content": "Completed", - "rect": { - "left": 645, - "top": 382, - "width": 85, - "height": 26 - } + "htmlNode": null }, { "id": "84b6988e83", - "indexId": "33", + "indexId": "16", "nodeHashId": "84b6988e83", + "nodeType": "BUTTON Node", "locator": "[_midscene_retrieve_task_id='84b6988e83']", "attributes": { "class": ".clear-completed", @@ -612,86 +320,75 @@ "width": 103, "height": 19 }, - "center": [849, 395] - }, - { - "id": "05ca0fe580", - "indexId": "34", - "nodeHashId": "05ca0fe580", - "attributes": { - "class": ".info", - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='05ca0fe580']", - "center": [640, 508], - "content": "Double-click to edit a todoCreated by the TodoMVC TeamPart of TodoMVC", - "rect": { - "left": 365, - "top": 480, - "width": 550, - "height": 55 - } + "center": [849, 395], + "htmlNode": null }, { - "id": "586415981c", - "indexId": "35", - "nodeHashId": "586415981c", + "id": "95a02ed28f", + "indexId": "17", + "nodeHashId": "95a02ed28f", + "nodeType": "TEXT Node", + "locator": "", "attributes": { "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='586415981c']", "center": [640, 486], "content": "Double-click to edit a todo", "rect": { - "left": 365, - "top": 480, - "width": 550, - "height": 11 - } + "left": 580, + "top": 479, + "width": 120, + "height": 13 + }, + "htmlNode": null }, { - "id": "d501ec8b0c", - "indexId": "36", - "nodeHashId": "d501ec8b0c", + "id": "b36169ba80", + "indexId": "18", + "nodeHashId": "b36169ba80", + "nodeType": "TEXT Node", + "locator": "", "attributes": { "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='d501ec8b0c']", "center": [640, 508], "content": "Created by the TodoMVC Team", "rect": { - "left": 365, - "top": 502, - "width": 550, - "height": 11 - } + "left": 568, + "top": 501, + "width": 144, + "height": 13 + }, + "htmlNode": null }, { - "id": "332bc0052f", - "indexId": "37", - "nodeHashId": "332bc0052f", + "id": "7d170b5a0c", + "indexId": "19", + "nodeHashId": "7d170b5a0c", + "nodeType": "TEXT Node", + "locator": "", "attributes": { "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='332bc0052f']", - "center": [640, 530], - "content": "Part of TodoMVC", + "center": [616, 530], + "content": "Part of", "rect": { - "left": 365, - "top": 524, - "width": 550, - "height": 11 - } + "left": 599, + "top": 523, + "width": 33, + "height": 13 + }, + "htmlNode": null }, { "id": "70ba39c5c6", - "indexId": "38", + "indexId": "20", "nodeHashId": "70ba39c5c6", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "href": "http://todomvc.com", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='70ba39c5c6']", "center": [656, 530], "content": "TodoMVC", "rect": { @@ -699,6 +396,7 @@ "top": 523, "width": 48, "height": 13 - } + }, + "htmlNode": null } ] diff --git a/packages/midscene/tests/ai/inspector/test-data/todo/output.png b/packages/midscene/tests/ai/inspector/test-data/todo/output.png index 6aa67b39..aa2d5ced 100644 Binary files a/packages/midscene/tests/ai/inspector/test-data/todo/output.png and b/packages/midscene/tests/ai/inspector/test-data/todo/output.png differ diff --git a/packages/midscene/tests/ai/inspector/test-data/todo/output_without_text.png b/packages/midscene/tests/ai/inspector/test-data/todo/output_without_text.png index 8ce80afb..a52a46bc 100644 Binary files a/packages/midscene/tests/ai/inspector/test-data/todo/output_without_text.png and b/packages/midscene/tests/ai/inspector/test-data/todo/output_without_text.png differ diff --git a/packages/midscene/tests/ai/inspector/test-data/visualstudio/element-snapshot.json b/packages/midscene/tests/ai/inspector/test-data/visualstudio/element-snapshot.json index bec12cbd..932580a8 100644 --- a/packages/midscene/tests/ai/inspector/test-data/visualstudio/element-snapshot.json +++ b/packages/midscene/tests/ai/inspector/test-data/visualstudio/element-snapshot.json @@ -1,124 +1,13 @@ [ - { - "id": "9cceb7bb52", - "indexId": "1", - "nodeHashId": "9cceb7bb52", - "attributes": { - "class": ".navbar-fixed-container", - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='9cceb7bb52']", - "center": [640, 29], - "content": "Visual Studio Code\n \t\t\t\t\t\n \t \n \t \n \t \n \t\t \t\t\n \t \n \t \n \t \n \t Docs\n \t Updates\n \t Blog\n \t API\n Extensions\n \t FAQ\n \t Search\n \t \n \n \t \n \t\t\t\t\t\t\n \t\t\t\t\t\t\t\n \n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t\n \t\t\t\t\t\t\n \t \n \t \n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t\t\n \t \n \t \n \t \n \t \n \t \n \t \n \t \n \t \n \t \n \t \n \t \n \t \n \t \n \t \t \n \t \n \t \n \t\t\t\t\t\tDownload", - "rect": { - "left": 0, - "top": 0, - "width": 1280, - "height": 58 - } - }, - { - "id": "9cceb7bb52", - "indexId": "2", - "nodeHashId": "9cceb7bb52", - "attributes": { - "class": ".navbar.navbar-inverse.navbar-fixed-top.affix-top", - "data-spy": "affix", - "data-offset-top": "1", - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='9cceb7bb52']", - "center": [640, 29], - "content": "Visual Studio Code\n \t\t\t\t\t\n \t \n \t \n \t \n \t\t \t\t\n \t \n \t \n \t \n \t Docs\n \t Updates\n \t Blog\n \t API\n Extensions\n \t FAQ\n \t Search\n \t \n \n \t \n \t\t\t\t\t\t\n \t\t\t\t\t\t\t\n \n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t\n \t\t\t\t\t\t\n \t \n \t \n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t\t\n \t \n \t \n \t \n \t \n \t \n \t \n \t \n \t \n \t \n \t \n \t \n \t \n \t \n \t \t \n \t \n \t \n \t\t\t\t\t\tDownload", - "rect": { - "left": 0, - "top": 0, - "width": 1280, - "height": 58 - } - }, - { - "id": "9cceb7bb52", - "indexId": "3", - "nodeHashId": "9cceb7bb52", - "attributes": { - "role": "navigation", - "aria-label": "Top Level", - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='9cceb7bb52']", - "center": [640, 29], - "content": "Visual Studio Code\n \t\t\t\t\t\n \t \n \t \n \t \n \t\t \t\t\n \t \n \t \n \t \n \t Docs\n \t Updates\n \t Blog\n \t API\n Extensions\n \t FAQ\n \t Search\n \t \n \n \t \n \t\t\t\t\t\t\n \t\t\t\t\t\t\t\n \n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t\n \t\t\t\t\t\t\n \t \n \t \n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t\t\n \t \n \t \n \t \n \t \n \t \n \t \n \t \n \t \n \t \n \t \n \t \n \t \n \t \n \t \t \n \t \n \t \n \t\t\t\t\t\tDownload", - "rect": { - "left": 0, - "top": 0, - "width": 1280, - "height": 58 - } - }, - { - "id": "d928f6e95c", - "indexId": "4", - "nodeHashId": "d928f6e95c", - "attributes": { - "class": ".container", - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='d928f6e95c']", - "center": [640, 29], - "content": "Visual Studio Code\n \t\t\t\t\t\n \t \n \t \n \t \n \t\t \t\t\n \t \n \t \n \t \n \t Docs\n \t Updates\n \t Blog\n \t API\n Extensions\n \t FAQ\n \t Search\n \t \n \n \t \n \t\t\t\t\t\t\n \t\t\t\t\t\t\t\n \n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t\n \t\t\t\t\t\t\n \t \n \t \n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t\t\n \t \n \t \n \t \n \t \n \t \n \t \n \t \n \t \n \t \n \t \n \t \n \t \n \t \n \t \t \n \t \n \t \n \t\t\t\t\t\tDownload", - "rect": { - "left": 40, - "top": 0, - "width": 1200, - "height": 58 - } - }, - { - "id": "ae5debb6cf", - "indexId": "5", - "nodeHashId": "ae5debb6cf", - "attributes": { - "class": ".nav.navbar-header", - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='ae5debb6cf']", - "center": [191, 29], - "content": "Visual Studio Code", - "rect": { - "left": 80, - "top": 0, - "width": 221, - "height": 58 - } - }, - { - "id": "ae5debb6cf", - "indexId": "6", - "nodeHashId": "ae5debb6cf", - "attributes": { - "class": ".navbar-brand", - "href": "/", - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='ae5debb6cf']", - "center": [191, 29], - "content": "Visual Studio Code", - "rect": { - "left": 80, - "top": 0, - "width": 221, - "height": 58 - } - }, { "id": "a482926fdd", - "indexId": "7", + "indexId": "1", "nodeHashId": "a482926fdd", + "nodeType": "TEXT Node", + "locator": "", "attributes": { "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='a482926fdd']", "center": [201, 29], "content": "Visual Studio Code", "rect": { @@ -126,286 +15,128 @@ "top": 17, "width": 170, "height": 24 - } - }, - { - "id": "c61b7d2bb8", - "indexId": "8", - "nodeHashId": "c61b7d2bb8", - "attributes": { - "class": ".navbar-collapse.collapse", - "style": "max-height: min(60vh, 400px);", - "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='c61b7d2bb8']", - "center": [640, 29], - "content": "Docs\n \t Updates\n \t Blog\n \t API\n Extensions\n \t FAQ\n \t Search\n \t \n \n \t \n \t\t\t\t\t\t\n \t\t\t\t\t\t\t\n \n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t\n \t\t\t\t\t\t\n \t \n \t \n \t\t\t\t\t\t\t\t\n \t\t\t\t\t\t\t\t\n \t \n \t \n \t \n \t \n \t \n \t \n \t \n \t \n \t \n \t \n \t \n \t \n \t \n \t \t \n \t \n \t \n \t\t\t\t\t\tDownload", - "rect": { - "left": 80, - "top": 0, - "width": 1120, - "height": 58 - } + "htmlNode": null }, { - "id": "b73d5cf12a", - "indexId": "9", - "nodeHashId": "b73d5cf12a", - "attributes": { - "class": ".nav.navbar-nav.navbar-left", - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='b73d5cf12a']", - "center": [508, 29], - "content": "Docs\n \t Updates\n \t Blog\n \t API\n Extensions\n \t FAQ\n \t Search", - "rect": { - "left": 301, - "top": 0, - "width": 414, - "height": 58 - } - }, - { - "id": "8b9d1a6179", - "indexId": "10", - "nodeHashId": "8b9d1a6179", + "id": "ff169ae064", + "indexId": "2", + "nodeHashId": "ff169ae064", + "nodeType": "TEXT Node", + "locator": "", "attributes": { "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='8b9d1a6179']", - "center": [332, 29], + "center": [332, 30], "content": "Docs", "rect": { - "left": 301, - "top": 0, - "width": 62, - "height": 58 - } - }, - { - "id": "8b9d1a6179", - "indexId": "11", - "nodeHashId": "8b9d1a6179", - "attributes": { - "id": "nav-docs", - "href": "/docs", - "nodeType": "TEXT Node" + "left": 313, + "top": 20, + "width": 38, + "height": 19 }, - "locator": "[_midscene_retrieve_task_id='8b9d1a6179']", - "center": [332, 29], - "content": "Docs", - "rect": { - "left": 301, - "top": 0, - "width": 62, - "height": 58 - } + "htmlNode": null }, { - "id": "42af1c2281", - "indexId": "12", - "nodeHashId": "42af1c2281", - "attributes": { - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='42af1c2281']", - "center": [407, 29], - "content": "Updates", - "rect": { - "left": 363, - "top": 0, - "width": 87, - "height": 58 - } - }, - { - "id": "42af1c2281", - "indexId": "13", - "nodeHashId": "42af1c2281", + "id": "19398efb1d", + "indexId": "3", + "nodeHashId": "19398efb1d", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "id": "nav-updates", - "href": "/updates", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='42af1c2281']", - "center": [407, 29], + "center": [407, 30], "content": "Updates", "rect": { - "left": 363, - "top": 0, - "width": 87, - "height": 58 - } - }, - { - "id": "2b762b1507", - "indexId": "14", - "nodeHashId": "2b762b1507", - "attributes": { - "nodeType": "TEXT Node" + "left": 375, + "top": 20, + "width": 63, + "height": 19 }, - "locator": "[_midscene_retrieve_task_id='2b762b1507']", - "center": [478, 29], - "content": "Blog", - "rect": { - "left": 449, - "top": 0, - "width": 57, - "height": 58 - } + "htmlNode": null }, { - "id": "2b762b1507", - "indexId": "15", - "nodeHashId": "2b762b1507", + "id": "ed75508a8d", + "indexId": "4", + "nodeHashId": "ed75508a8d", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "id": "nav-blogs", - "href": "/blogs", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='2b762b1507']", - "center": [478, 29], + "center": [478, 30], "content": "Blog", "rect": { - "left": 449, - "top": 0, - "width": 57, - "height": 58 - } - }, - { - "id": "fbd4626b77", - "indexId": "16", - "nodeHashId": "fbd4626b77", - "attributes": { - "nodeType": "TEXT Node" + "left": 461, + "top": 20, + "width": 33, + "height": 19 }, - "locator": "[_midscene_retrieve_task_id='fbd4626b77']", - "center": [532, 29], - "content": "API", - "rect": { - "left": 507, - "top": 0, - "width": 49, - "height": 58 - } + "htmlNode": null }, { - "id": "fbd4626b77", - "indexId": "17", - "nodeHashId": "fbd4626b77", + "id": "1778bf15b9", + "indexId": "5", + "nodeHashId": "1778bf15b9", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "id": "nav-extend", - "href": "/api", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='fbd4626b77']", - "center": [532, 29], + "center": [532, 30], "content": "API", "rect": { - "left": 507, - "top": 0, - "width": 49, - "height": 58 - } - }, - { - "id": "839a7fdd30", - "indexId": "18", - "nodeHashId": "839a7fdd30", - "attributes": { - "nodeType": "TEXT Node" + "left": 519, + "top": 20, + "width": 25, + "height": 19 }, - "locator": "[_midscene_retrieve_task_id='839a7fdd30']", - "center": [609, 29], - "content": "Extensions", - "rect": { - "left": 556, - "top": 0, - "width": 105, - "height": 58 - } + "htmlNode": null }, { - "id": "839a7fdd30", - "indexId": "19", - "nodeHashId": "839a7fdd30", + "id": "3109f9163c", + "indexId": "6", + "nodeHashId": "3109f9163c", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "href": "https://marketplace.visualstudio.com/VSCode", - "target": "_blank", - "rel": "noopener", - "id": "nav-extensions", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='839a7fdd30']", - "center": [609, 29], + "center": [609, 30], "content": "Extensions", "rect": { - "left": 556, - "top": 0, - "width": 105, - "height": 58 - } - }, - { - "id": "c292124789", - "indexId": "20", - "nodeHashId": "c292124789", - "attributes": { - "nodeType": "TEXT Node" + "left": 568, + "top": 20, + "width": 81, + "height": 19 }, - "locator": "[_midscene_retrieve_task_id='c292124789']", - "center": [688, 29], - "content": "FAQ", - "rect": { - "left": 660, - "top": 0, - "width": 55, - "height": 58 - } + "htmlNode": null }, { - "id": "c292124789", - "indexId": "21", - "nodeHashId": "c292124789", + "id": "948617cc34", + "indexId": "7", + "nodeHashId": "948617cc34", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "id": "nav-faqs", - "href": "/docs/supporting/faq", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='c292124789']", - "center": [688, 29], + "center": [688, 30], "content": "FAQ", "rect": { - "left": 660, - "top": 0, - "width": 55, - "height": 58 - } - }, - { - "id": "226cfbfa70", - "indexId": "22", - "nodeHashId": "226cfbfa70", - "attributes": { - "class": ".nav.navbar-nav.navbar-right", - "role": "presentation", - "nodeType": "TEXT Node" + "left": 672, + "top": 20, + "width": 31, + "height": 19 }, - "locator": "[_midscene_retrieve_task_id='226cfbfa70']", - "center": [1025, 29], - "content": "Download", - "rect": { - "left": 849, - "top": 0, - "width": 351, - "height": 58 - } + "htmlNode": null }, { "id": "e72ee416b2", - "indexId": "23", + "indexId": "8", "nodeHashId": "e72ee416b2", + "nodeType": "BUTTON Node", "locator": "[_midscene_retrieve_task_id='e72ee416b2']", "attributes": { "type": "button", @@ -420,33 +151,15 @@ "width": 32, "height": 32 }, - "center": [865, 29] - }, - { - "id": "ffbf775768", - "indexId": "24", - "nodeHashId": "ffbf775768", - "locator": "[_midscene_retrieve_task_id='ffbf775768']", - "attributes": { - "class": ".theme-icon-dark", - "src": "/assets/icons/theme-dark.svg", - "alt": "Switch to the light theme", - "nodeType": "IMG Node" - }, - "content": "", - "rect": { - "left": 855, - "top": 19, - "width": 20, - "height": 20 - }, - "center": [865, 29] + "center": [865, 29], + "htmlNode": null }, { "id": "0c513c2cab", - "indexId": "25", + "indexId": "9", "nodeHashId": "0c513c2cab", "locator": "[_midscene_retrieve_task_id='0c513c2cab']", + "nodeType": "INPUT Node", "attributes": { "type": "text", "name": "q", @@ -462,12 +175,14 @@ "width": 200, "height": 32 }, - "center": [985, 29] + "center": [985, 29], + "htmlNode": null }, { "id": "d76390b753", - "indexId": "26", + "indexId": "10", "nodeHashId": "d76390b753", + "nodeType": "BUTTON Node", "locator": "[_midscene_retrieve_task_id='d76390b753']", "attributes": { "tabindex": "0", @@ -483,73 +198,18 @@ "width": 28, "height": 20 }, - "center": [906, 29] - }, - { - "id": "eec7cedece", - "indexId": "27", - "nodeHashId": "eec7cedece", - "locator": "[_midscene_retrieve_task_id='eec7cedece']", - "attributes": { - "class": ".search-icon-light", - "src": "/assets/icons/search.svg", - "alt": "Search", - "nodeType": "IMG Node" - }, - "content": "", - "rect": { - "left": 898, - "top": 22, - "width": 16, - "height": 16 - }, - "center": [906, 30] - }, - { - "id": "23914e93fd", - "indexId": "28", - "nodeHashId": "23914e93fd", - "attributes": { - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='23914e93fd']", - "center": [1147, 29], - "content": "Download", - "rect": { - "left": 1093, - "top": 13, - "width": 107, - "height": 32 - } - }, - { - "id": "23914e93fd", - "indexId": "29", - "nodeHashId": "23914e93fd", - "attributes": { - "class": ".link-button", - "href": "/Download", - "id": "nav-download", - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='23914e93fd']", - "center": [1147, 29], - "content": "Download", - "rect": { - "left": 1093, - "top": 13, - "width": 107, - "height": 32 - } + "center": [906, 29], + "htmlNode": null }, { "id": "7a1a2d8f0e", - "indexId": "30", + "indexId": "11", "nodeHashId": "7a1a2d8f0e", + "nodeType": "TEXT Node", + "locator": "", "attributes": { "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='7a1a2d8f0e']", "center": [1147, 30], "content": "Download", "rect": { @@ -557,72 +217,18 @@ "top": 20, "width": 75, "height": 19 - } - }, - { - "id": "68d0fe5be8", - "indexId": "31", - "nodeHashId": "68d0fe5be8", - "attributes": { - "class": ".updates-banner.home.", - "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='68d0fe5be8']", - "center": [640, 85], - "content": "Version 1.92 is now available! Read about the new features and fixes from July.\n \n Dismiss this update", - "rect": { - "left": 0, - "top": 58, - "width": 1280, - "height": 54 - } - }, - { - "id": "da1fedefef", - "indexId": "32", - "nodeHashId": "da1fedefef", - "attributes": { - "class": ".container", - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='da1fedefef']", - "center": [624, 85], - "content": "Version 1.92 is now available! Read about the new features and fixes from July.", - "rect": { - "left": 24, - "top": 58, - "width": 1200, - "height": 54 - } - }, - { - "id": "066b48f651", - "indexId": "33", - "nodeHashId": "066b48f651", - "attributes": { - "class": ".message", - "nodeType": "TEXT Node" - }, - "locator": "[_midscene_retrieve_task_id='066b48f651']", - "center": [624, 85], - "content": "Version 1.92 is now available! Read about the new features and fixes from July.", - "rect": { - "left": 64, - "top": 74, - "width": 1120, - "height": 22 - } + "htmlNode": null }, { "id": "6a500751d6", - "indexId": "34", + "indexId": "12", "nodeHashId": "6a500751d6", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "href": "/updates", - "id": "banner-link-updates", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='6a500751d6']", "center": [406, 86], "content": "Version 1.92", "rect": { @@ -630,160 +236,90 @@ "top": 77, "width": 80, "height": 17 - } - }, - { - "id": "0711f7e3a1", - "indexId": "35", - "nodeHashId": "0711f7e3a1", - "attributes": { - "tabindex": "0", - "role": "button", - "title": "Dismiss this update", - "class": ".dismiss-btn", - "id": "banner-dismiss-btn", - "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='0711f7e3a1']", - "center": [1248, 85], - "content": "Dismiss this update", - "rect": { - "left": 1232, - "top": 69, - "width": 32, - "height": 32 - } + "htmlNode": null }, { - "id": "5d3921b94d", - "indexId": "36", - "nodeHashId": "5d3921b94d", + "id": "526f9ea4de", + "indexId": "13", + "nodeHashId": "526f9ea4de", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".container.hero-content", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='5d3921b94d']", - "center": [640, 394], - "content": "Free. Built on open source. Runs everywhere.\n Code Editing. Redefined.\n \n \n \n \n Download for macOS\n Download for Windows\n \n .debDebian, Ubuntu...\n .rpmRed Hat, Fedora...\n \n \n .deb (x86)\n .rpm (x86)\n .tar.gz (x86)\n \n \n \n DownloadStable Build\n \n \n \n Web, Insiders edition, or other platforms\n By using VS Code, you agree to its license and privacy statement.", + "center": [664, 86], + "content": "is now available! Read about the new features and fixes from July.", "rect": { - "left": 40, - "top": 144, - "width": 1200, - "height": 499 - } - }, - { - "id": "d911990fee", - "indexId": "37", - "nodeHashId": "d911990fee", - "attributes": { - "class": ".hero-text.col-sm-12.col-md-4", - "nodeType": "TEXT Node" + "left": 446, + "top": 77, + "width": 436, + "height": 17 }, - "locator": "[_midscene_retrieve_task_id='d911990fee']", - "center": [240, 394], - "content": "Free. Built on open source. Runs everywhere.\n Code Editing. Redefined.\n \n \n \n \n Download for macOS\n Download for Windows\n \n .debDebian, Ubuntu...\n .rpmRed Hat, Fedora...\n \n \n .deb (x86)\n .rpm (x86)\n .tar.gz (x86)\n \n \n \n DownloadStable Build\n \n \n \n Web, Insiders edition, or other platforms\n By using VS Code, you agree to its license and privacy statement.", - "rect": { - "left": 40, - "top": 144, - "width": 400, - "height": 499 - } + "htmlNode": null }, { - "id": "aed37e3385", - "indexId": "38", - "nodeHashId": "aed37e3385", + "id": "1a848585ed", + "indexId": "14", + "nodeHashId": "1a848585ed", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".hero-tag", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='aed37e3385']", - "center": [246, 195], - "content": "Free. Built on open source. Runs everywhere.", + "center": [1276, 119], + "content": "Dismiss this update", "rect": { - "left": 80, - "top": 176, - "width": 331, - "height": 38 - } - }, - { - "id": "fad8ef3f4d", - "indexId": "39", - "nodeHashId": "fad8ef3f4d", - "attributes": { - "nodeType": "TEXT Node" + "left": 1248, + "top": 85, + "width": 56, + "height": 67 }, - "locator": "[_midscene_retrieve_task_id='fad8ef3f4d']", - "center": [240, 337], - "content": "Code Editing. Redefined.", - "rect": { - "left": 80, - "top": 232, - "width": 320, - "height": 210 - } + "htmlNode": null }, { - "id": "56a74c72b7", - "indexId": "40", - "nodeHashId": "56a74c72b7", + "id": "ec5c08a439", + "indexId": "15", + "nodeHashId": "ec5c08a439", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".download-content-wrapper", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='56a74c72b7']", - "center": [240, 543], - "content": "Download for macOS\n Download for Windows\n \n .debDebian, Ubuntu...\n .rpmRed Hat, Fedora...\n \n \n .deb (x86)\n .rpm (x86)\n .tar.gz (x86)\n \n \n \n DownloadStable Build\n \n \n \n Web, Insiders edition, or other platforms\n By using VS Code, you agree to its license and privacy statement.", + "center": [246, 196], + "content": "Free. Built on open source. Runs everywhere.", "rect": { - "left": 80, - "top": 474, - "width": 320, - "height": 137 - } - }, - { - "id": "17ab8ef14f", - "indexId": "41", - "nodeHashId": "17ab8ef14f", - "attributes": { - "id": "download-buttons", - "class": ".download-hero.alt-downloads.win", - "nodeType": "TEXT Node" + "left": 93, + "top": 187, + "width": 305, + "height": 17 }, - "locator": "[_midscene_retrieve_task_id='17ab8ef14f']", - "center": [240, 499], - "content": "Download for macOS\n Download for Windows\n \n .debDebian, Ubuntu...\n .rpmRed Hat, Fedora...\n \n \n .deb (x86)\n .rpm (x86)\n .tar.gz (x86)\n \n \n \n DownloadStable Build", - "rect": { - "left": 80, - "top": 474, - "width": 320, - "height": 50 - } + "htmlNode": null }, { - "id": "17ab8ef14f", - "indexId": "42", - "nodeHashId": "17ab8ef14f", + "id": "f8ca0be4ed", + "indexId": "16", + "nodeHashId": "f8ca0be4ed", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".primary-buttons", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='17ab8ef14f']", - "center": [240, 499], - "content": "Download for macOS\n Download for Windows\n \n .debDebian, Ubuntu...\n .rpmRed Hat, Fedora...\n \n \n .deb (x86)\n .rpm (x86)\n .tar.gz (x86)\n \n \n \n DownloadStable Build", + "center": [213, 337], + "content": "Code Editing. Redefined.", "rect": { "left": 80, - "top": 474, - "width": 320, - "height": 50 - } + "top": 234, + "width": 266, + "height": 206 + }, + "htmlNode": null }, { "id": "a115c043a2", - "indexId": "43", + "indexId": "17", "nodeHashId": "a115c043a2", + "nodeType": "BUTTON Node", "locator": "[_midscene_retrieve_task_id='a115c043a2']", "attributes": { "type": "button", @@ -799,59 +335,56 @@ "width": 241, "height": 50 }, - "center": [201, 499] + "center": [201, 499], + "htmlNode": null }, { - "id": "c755a574e2", - "indexId": "44", - "nodeHashId": "c755a574e2", + "id": "ea2585add6", + "indexId": "18", + "nodeHashId": "ea2585add6", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "id": "download-matrix-label", - "class": ".subtext", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='c755a574e2']", - "center": [240, 551], - "content": "Web, Insiders edition, or other platforms", + "center": [95, 552], + "content": "Web", "rect": { "left": 80, - "top": 540, - "width": 320, - "height": 22 - } + "top": 543, + "width": 29, + "height": 17 + }, + "htmlNode": null }, { - "id": "ea2585add6", - "indexId": "45", - "nodeHashId": "ea2585add6", + "id": "bbe7c09679", + "indexId": "19", + "nodeHashId": "bbe7c09679", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "href": "https://vscode.dev/", - "target": "_blank", - "rel": "noopener", - "title": "For quick code edits locally or remotely on GitHub and Azure Repos.", - "id": "download-buttons-web", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='ea2585add6']", - "center": [95, 552], - "content": "Web", + "center": [113, 552], + "content": ",", "rect": { - "left": 80, + "left": 109, "top": 543, - "width": 29, + "width": 8, "height": 17 - } + }, + "htmlNode": null }, { "id": "34a6664272", - "indexId": "46", + "indexId": "20", "nodeHashId": "34a6664272", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "href": "/insiders", - "id": "download-buttons-insiders", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='34a6664272']", "center": [168, 552], "content": "Insiders edition", "rect": { @@ -859,17 +392,37 @@ "top": 543, "width": 101, "height": 17 - } + }, + "htmlNode": null + }, + { + "id": "6a9e874040", + "indexId": "21", + "nodeHashId": "6a9e874040", + "nodeType": "TEXT Node", + "locator": "", + "attributes": { + "nodeType": "TEXT Node" + }, + "center": [231, 552], + "content": ", or", + "rect": { + "left": 218, + "top": 543, + "width": 25, + "height": 17 + }, + "htmlNode": null }, { "id": "1ef8370ece", - "indexId": "47", + "indexId": "22", "nodeHashId": "1ef8370ece", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "href": "/Download", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='1ef8370ece']", "center": [295, 552], "content": "other platforms", "rect": { @@ -877,56 +430,37 @@ "top": 543, "width": 102, "height": 17 - } - }, - { - "id": "fc5a82d77a", - "indexId": "48", - "nodeHashId": "fc5a82d77a", - "attributes": { - "class": ".subtext.terms", - "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='fc5a82d77a']", - "center": [240, 596], - "content": "By using VS Code, you agree to its license and privacy statement.", - "rect": { - "left": 80, - "top": 579, - "width": 320, - "height": 33 - } + "htmlNode": null }, { - "id": "62187837c8", - "indexId": "49", - "nodeHashId": "62187837c8", + "id": "f0d0e9c4f1", + "indexId": "23", + "nodeHashId": "f0d0e9c4f1", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "class": ".wrap-together", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='62187837c8']", - "center": [160, 604], - "content": "license and privacy statement.", + "center": [171, 587], + "content": "By using VS Code, you agree to its", "rect": { "left": 80, - "top": 595, - "width": 160, - "height": 17 - } + "top": 580, + "width": 181, + "height": 13 + }, + "htmlNode": null }, { "id": "deba00f856", - "indexId": "50", + "indexId": "24", "nodeHashId": "deba00f856", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "href": "https://code.visualstudio.com/license", - "target": "_blank", - "rel": "noopener", - "title": "View the Visual Studio Code license.", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='deba00f856']", "center": [99, 604], "content": "license", "rect": { @@ -934,20 +468,37 @@ "top": 597, "width": 37, "height": 13 - } + }, + "htmlNode": null + }, + { + "id": "491790f90f", + "indexId": "25", + "nodeHashId": "491790f90f", + "nodeType": "TEXT Node", + "locator": "", + "attributes": { + "nodeType": "TEXT Node" + }, + "center": [130, 604], + "content": "and", + "rect": { + "left": 117, + "top": 597, + "width": 26, + "height": 13 + }, + "htmlNode": null }, { "id": "324717c5ff", - "indexId": "51", + "indexId": "26", "nodeHashId": "324717c5ff", + "nodeType": "TEXT Node", + "locator": "", "attributes": { - "href": "https://go.microsoft.com/fwlink/?LinkId=521839", - "target": "_blank", - "rel": "noopener", - "title": "View the Microsoft privacy statement.", "nodeType": "TEXT Node" }, - "locator": "[_midscene_retrieve_task_id='324717c5ff']", "center": [190, 604], "content": "privacy statement", "rect": { @@ -955,11 +506,31 @@ "top": 597, "width": 94, "height": 13 - } + }, + "htmlNode": null + }, + { + "id": "3f353e2096", + "indexId": "27", + "nodeHashId": "3f353e2096", + "nodeType": "TEXT Node", + "locator": "", + "attributes": { + "nodeType": "TEXT Node" + }, + "center": [239, 604], + "content": ".", + "rect": { + "left": 237, + "top": 597, + "width": 3, + "height": 13 + }, + "htmlNode": null }, { "id": "7eb7a9b4da", - "indexId": "52", + "indexId": "28", "nodeHashId": "7eb7a9b4da", "locator": "[_midscene_retrieve_task_id='7eb7a9b4da']", "attributes": { @@ -968,6 +539,7 @@ "class": ".hero-image.light", "nodeType": "IMG Node" }, + "nodeType": "IMG Node", "content": "", "rect": { "left": 480, @@ -975,6 +547,7 @@ "width": 720, "height": 457 }, - "center": [840, 395] + "center": [840, 395], + "htmlNode": null } ] diff --git a/packages/midscene/tests/ai/inspector/test-data/visualstudio/output.png b/packages/midscene/tests/ai/inspector/test-data/visualstudio/output.png index 7e16bab3..da531a1a 100644 Binary files a/packages/midscene/tests/ai/inspector/test-data/visualstudio/output.png and b/packages/midscene/tests/ai/inspector/test-data/visualstudio/output.png differ diff --git a/packages/midscene/tests/ai/inspector/test-data/visualstudio/output_without_text.png b/packages/midscene/tests/ai/inspector/test-data/visualstudio/output_without_text.png index 2cb75b88..86e92e0f 100644 Binary files a/packages/midscene/tests/ai/inspector/test-data/visualstudio/output_without_text.png and b/packages/midscene/tests/ai/inspector/test-data/visualstudio/output_without_text.png differ diff --git a/packages/web-integration/modern.inspect.config.ts b/packages/web-integration/modern.inspect.config.ts index 8abd46ec..b360271f 100644 --- a/packages/web-integration/modern.inspect.config.ts +++ b/packages/web-integration/modern.inspect.config.ts @@ -9,6 +9,7 @@ export default defineConfig({ format: 'iife', input: { htmlElement: 'src/extractor/index.ts', + htmlElementDebug: 'src/extractor/debug.ts', }, outDir: 'dist/script', esbuildOptions: (options) => { diff --git a/packages/web-integration/playwright.config.ts b/packages/web-integration/playwright.config.ts index 29f2f47d..8af0310b 100644 --- a/packages/web-integration/playwright.config.ts +++ b/packages/web-integration/playwright.config.ts @@ -16,7 +16,7 @@ dotenv.config({ */ export default defineConfig({ testDir: './tests/ai/e2e', - // testIgnore: 'generate-test-data.spec.ts', + testIgnore: 'generate-test-data.spec.ts', timeout: 900 * 1000, /* Run tests in files in parallel */ fullyParallel: true, diff --git a/packages/web-integration/src/common/utils.ts b/packages/web-integration/src/common/utils.ts index 866868ee..eac7d7af 100644 --- a/packages/web-integration/src/common/utils.ts +++ b/packages/web-integration/src/common/utils.ts @@ -2,6 +2,7 @@ import assert from 'node:assert'; import type { Buffer } from 'node:buffer'; import fs, { readFileSync } from 'node:fs'; import path from 'node:path'; +import type { ElementInfo } from '@/extractor/extractor'; import type { PlaywrightParserOpt, UIContext } from '@midscene/core'; import { alignCoordByTrim, @@ -53,13 +54,13 @@ export async function getElementInfosFromPage(page: WebPage) { const extraReturnLogic = `${elementInfosScriptContent}midscene_element_inspector.extractTextWithPosition()`; const captureElementSnapshot = await (page as any).evaluate(extraReturnLogic); - return captureElementSnapshot; + return captureElementSnapshot as Array; } const sizeThreshold = 3; async function alignElements( screenshotBuffer: Buffer, - elements: WebElementInfoType[], + elements: ElementInfo[], page: WebPage, ): Promise { const textsAligned: WebElementInfo[] = []; @@ -69,7 +70,7 @@ async function alignElements( ); }); for (const item of validElements) { - const { rect } = item; + const { rect, id, content, attributes, locator } = item; const aligned = await alignCoordByTrim(screenshotBuffer, rect); item.rect = aligned; @@ -79,7 +80,11 @@ async function alignElements( ]; textsAligned.push( new WebElementInfo({ - ...item, + rect, + locator, + id, + content, + attributes, page, }), ); diff --git a/packages/web-integration/src/extractor/debug.ts b/packages/web-integration/src/extractor/debug.ts index 774d2b16..24fcb047 100644 --- a/packages/web-integration/src/extractor/debug.ts +++ b/packages/web-integration/src/extractor/debug.ts @@ -1,3 +1,4 @@ import { extractTextWithPosition } from '.'; -console.log(extractTextWithPosition()); +console.log(extractTextWithPosition(document.body, true)); +console.log(JSON.stringify(extractTextWithPosition(document.body, false))); diff --git a/packages/web-integration/src/extractor/dom-util.ts b/packages/web-integration/src/extractor/dom-util.ts index c3bd39b9..fc50104c 100644 --- a/packages/web-integration/src/extractor/dom-util.ts +++ b/packages/web-integration/src/extractor/dom-util.ts @@ -13,3 +13,7 @@ export function isButtonElement(node: Node): node is HTMLButtonElement { export function isImgElement(node: Node): node is HTMLImageElement { return node instanceof HTMLElement && node.tagName.toLowerCase() === 'img'; } + +export function isTextElement(node: Node): node is HTMLTextAreaElement { + return node.nodeName.toLowerCase() === '#text'; +} diff --git a/packages/web-integration/src/extractor/extractor.ts b/packages/web-integration/src/extractor/extractor.ts index 8ce10de1..59c6470b 100644 --- a/packages/web-integration/src/extractor/extractor.ts +++ b/packages/web-integration/src/extractor/extractor.ts @@ -1,11 +1,17 @@ import { NodeType, TEXT_SIZE_THRESHOLD } from './constants'; -import { isButtonElement, isImgElement, isInputElement } from './dom-util'; +import { + isButtonElement, + isImgElement, + isInputElement, + isTextElement, +} from './dom-util'; import { generateHash, getNodeAttributes, getPseudoElementContent, logger, setDataForNode, + setDebugMode, validTextNodeContent, visibleRect, } from './util'; @@ -19,11 +25,13 @@ export interface ElementInfo { id: string; indexId: string; nodeHashId: string; - locator: string | undefined; + locator: string; attributes: { nodeType: NodeType; [key: string]: string; }; + nodeType: NodeType; + htmlNode: Node | null; content: string; rect: { left: number; top: number; width: number; height: number }; center: [number, number]; @@ -42,7 +50,9 @@ function generateId(numberId: number) { export function extractTextWithPosition( initNode: Node = container, + debugMode = false, ): ElementInfo[] { + setDebugMode(debugMode); const elementInfoArray: ElementInfo[] = []; const nodeMapTree: NodeDescriptor = { node: initNode, children: [] }; let nodeIndex = 1; @@ -57,7 +67,10 @@ export function extractTextWithPosition( parentNode.children.push(currentNodeDes); } - collectElementInfo(node); + const shouldContinue = collectElementInfo(node); + if (!shouldContinue) { + return; + } // eslint-disable-next-line @typescript-eslint/prefer-for-of for (let i = 0; i < node.childNodes.length; i++) { @@ -68,6 +81,7 @@ export function extractTextWithPosition( function collectElementInfo(node: Node) { const rect = visibleRect(node); + logger('collectElementInfo', node, node.nodeName, rect); if (!rect) { logger('Element is not visible', node); return; @@ -82,6 +96,7 @@ export function extractTextWithPosition( indexId: generateId(nodeIndex++), nodeHashId, locator: selector, + nodeType: NodeType.INPUT, attributes: { ...attributes, nodeType: NodeType.INPUT, @@ -92,6 +107,7 @@ export function extractTextWithPosition( Math.round(rect.left + rect.width / 2), Math.round(rect.top + rect.height / 2), ], + htmlNode: debugMode ? node : null, }); return; } @@ -106,6 +122,7 @@ export function extractTextWithPosition( id: nodeHashId, indexId: generateId(nodeIndex++), nodeHashId, + nodeType: NodeType.BUTTON, locator: selector, attributes: { ...attributes, @@ -117,6 +134,7 @@ export function extractTextWithPosition( Math.round(rect.left + rect.width / 2), Math.round(rect.top + rect.height / 2), ], + htmlNode: debugMode ? node : null, }); return; } @@ -134,45 +152,20 @@ export function extractTextWithPosition( ...attributes, nodeType: NodeType.IMG, }, + nodeType: NodeType.IMG, content: '', rect, center: [ Math.round(rect.left + rect.width / 2), Math.round(rect.top + rect.height / 2), ], + htmlNode: debugMode ? node : null, }); return; } - // if (node instanceof HTMLElement && hasOverflowY(node)) { - // const rect = visibleRect(node); - // if (!rect || rect.height < 100) { - // logger('Element is not visible', node); - // } else { - // const attributes = getNodeAttributes(node); - // const selector = setDataForNode(node, nodeIndex); - // elementInfoArray.push({ - // id: nodeIndex++, - // nodeType: 'ScrollContainer Node', - // locator: selector!, - // parentIndex, - // attributes, - // content: "", - // rect, - // center: [Math.round(rect.left + rect.width / 2), Math.round(rect.top + rect.height / 2)], - // }); - // } - // } - - const text = validTextNodeContent(node); - if (text) { - if ( - rect.width < TEXT_SIZE_THRESHOLD || - rect.height < TEXT_SIZE_THRESHOLD - ) { - logger('Element is too small', text); - return; - } + if (isTextElement(node)) { + const text = node.textContent?.trim().replace(/\n+/g, ' ') || ''; const attributes = getNodeAttributes(node); const nodeHashId = generateHash(text, rect); const selector = setDataForNode(node, nodeHashId); @@ -180,11 +173,12 @@ export function extractTextWithPosition( id: nodeHashId, indexId: generateId(nodeIndex++), nodeHashId, + nodeType: NodeType.TEXT, + locator: selector, attributes: { ...attributes, nodeType: NodeType.TEXT, }, - locator: selector, center: [ Math.round(rect.left + rect.width / 2), Math.round(rect.top + rect.height / 2), @@ -192,8 +186,12 @@ export function extractTextWithPosition( // attributes, content: text, rect, + htmlNode: debugMode ? node : null, }); + return; } + + return true; } dfs(initNode, nodeMapTree); diff --git a/packages/web-integration/src/extractor/util.ts b/packages/web-integration/src/extractor/util.ts index 9906818c..3ab5378d 100644 --- a/packages/web-integration/src/extractor/util.ts +++ b/packages/web-integration/src/extractor/util.ts @@ -1,8 +1,17 @@ // import { TEXT_MAX_SIZE } from './constants'; import SHA256 from 'js-sha256'; +let debugMode = false; + +export function setDebugMode(mode: boolean) { + debugMode = mode; +} + export function logger(..._msg: any[]): void { - // console.log(...msg); + if (!debugMode) { + return; + } + console.log(..._msg); } // const nodeIndexCounter = 0; @@ -61,6 +70,24 @@ export function hasOverflowY(element: HTMLElement): boolean { ); } +function getRect(el: HTMLElement | Node): { + bottom: number; + height: number; + left: number; + right: number; + top: number; + width: number; + x: number; + y: number; +} { + if (!(el instanceof HTMLElement)) { + const range = document.createRange(); + range.selectNodeContents(el); + return range.getBoundingClientRect(); + } + return el.getBoundingClientRect(); +} + export function visibleRect( el: HTMLElement | Node | null, ): { left: number; top: number; width: number; height: number } | false { @@ -69,22 +96,25 @@ export function visibleRect( return false; } - if (!(el instanceof HTMLElement)) { + if (!(el instanceof HTMLElement) && el.nodeType !== Node.TEXT_NODE) { logger('Element is not in the DOM hierarchy'); return false; } - const style = window.getComputedStyle(el); - if ( - style.display === 'none' || - style.visibility === 'hidden' || - (style.opacity === '0' && el.tagName !== 'INPUT') - ) { - logger('Element is hidden'); - return false; + if (el instanceof HTMLElement) { + const style = window.getComputedStyle(el); + if ( + style.display === 'none' || + style.visibility === 'hidden' || + (style.opacity === '0' && el.tagName !== 'INPUT') + ) { + logger('Element is hidden'); + return false; + } } - const rect = el.getBoundingClientRect(); + const rect = getRect(el); + if (rect.width === 0 && rect.height === 0) { logger('Element has no size'); return false; @@ -92,31 +122,37 @@ export function visibleRect( const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft; const scrollTop = window.pageYOffset || document.documentElement.scrollTop; - const isInViewport = - rect.top >= 0 + scrollTop && - rect.left >= 0 + scrollLeft && - rect.bottom <= - (window.innerHeight || document.documentElement.clientHeight) + - scrollTop && - rect.right <= - (window.innerWidth || document.documentElement.clientWidth) + scrollLeft; - - if (!isInViewport) { - logger('Element is not in the viewport'); - logger(rect, window.innerHeight, window.innerWidth, scrollTop, scrollLeft); + const viewportWidth = + window.innerWidth || document.documentElement.clientWidth; + const viewportHeight = + window.innerHeight || document.documentElement.clientHeight; + + const isPartiallyInViewport = + rect.right > 0 && + rect.bottom > 0 && + rect.left < viewportWidth && + rect.top < viewportHeight; + + if (!isPartiallyInViewport) { + logger('Element is completely outside the viewport'); + logger(rect, viewportHeight, viewportWidth, scrollTop, scrollLeft); return false; } - let parent: HTMLElement | null = el; + let parent: HTMLElement | Node | null = el; while (parent && parent !== document.body) { + if (!(parent instanceof HTMLElement)) { + parent = parent.parentElement; + continue; + } const parentStyle = window.getComputedStyle(parent); if (parentStyle.overflow === 'hidden') { const parentRect = parent.getBoundingClientRect(); const tolerance = 10; if ( - rect.top < parentRect.top - tolerance || - rect.left < parentRect.left - tolerance || - rect.bottom > parentRect.bottom + tolerance || + rect.top < parentRect.top - tolerance && + rect.left < parentRect.left - tolerance && + rect.bottom > parentRect.bottom + tolerance && rect.right > parentRect.right + tolerance ) { logger('Element is clipped by an ancestor', parent, rect, parentRect); @@ -138,21 +174,30 @@ export function validTextNodeContent(node: Node): string | false { if (!node) { return false; } - if (node.nodeType !== Node.ELEMENT_NODE && node.nodeType !== Node.TEXT_NODE) { + if ( + node.nodeType !== Node.ELEMENT_NODE && + node.nodeType !== Node.TEXT_NODE && + (node as any).nodeName !== '#text' + ) { return false; } - const everyChildNodeIsText = Array.from(node.childNodes).every((child) => { - const tagName = ((child as HTMLElement).tagName || '').toLowerCase(); - if (tagName === 'script' || tagName === 'style' || tagName === 'link') { - return false; - } - return true; - }); - - if (!everyChildNodeIsText) { - return false; - } + // const everyChildNodeIsText = Array.from(node.childNodes).every((child) => { + // const tagName = ((child as HTMLElement).tagName || '').toLowerCase(); + // if ( + // tagName === 'script' || + // tagName === 'style' || + // tagName === 'link' || + // tagName !== '#text' + // ) { + // return false; + // } + // return true; + // }); + + // if (!everyChildNodeIsText) { + // return false; + // } const content = node.textContent || (node as HTMLElement).innerText; if (content && !/^\s*$/.test(content)) { diff --git a/packages/web-integration/tests/ai/e2e/generate-test-data.spec.ts b/packages/web-integration/tests/ai/e2e/generate-test-data.spec.ts index a1216ba3..323da86c 100644 --- a/packages/web-integration/tests/ai/e2e/generate-test-data.spec.ts +++ b/packages/web-integration/tests/ai/e2e/generate-test-data.spec.ts @@ -1,6 +1,14 @@ import { test } from '@playwright/test'; import { generateTestData, generateTestDataPath } from './tool'; +function sleep(time: number) { + return new Promise((resolve) => { + setTimeout(() => { + resolve(0); + }, time); + }); +} + test('generate todo test data', async ({ page }) => { await page.goto('https://todomvc.com/examples/react/dist/'); // Add data @@ -37,6 +45,7 @@ test('generate githubstatus test data', async ({ page }) => { await page.setViewportSize({ width: 1920, height: 1080 }); await page.goto('https://www.githubstatus.com/'); await page.waitForLoadState('networkidle'); + await sleep(3000); const midsceneTestDataPath = generateTestDataPath('githubstatus'); const buffer = await page.screenshot();