[{"data":1,"prerenderedAt":1532},["ShallowReactive",2],{"navigation":3,"page:\u002Fpanel\u002Fpicking-and-recording":1019,"surround:\u002Fpanel\u002Fpicking-and-recording":1523},[4,21,82,133,154,1010],[5,6,7,8],"Getting started","\u002Fgetting-started","i-lucide-rocket",[9,12,15,18],[10,6,11,11],"What Kaabist is",0,[13,14,11,11],"API keys and modes","keys-and-modes",[16,17,11,11],"Your first job","first-job",[19,20,11,11],"Understanding the envelope","envelope",[22,23,24,25],"Concepts","\u002Fconcepts","i-lucide-book-open",[26,28,31,34,37,40,43,46,49,52,55,58,61,64,67,70,73,76,79],[27,23,11,11],"Overview",[29,30,11,11],"Programs and versions","programs-and-versions",[32,33,11,11],"Tiers and escalation","tiers-and-escalation",[35,36,11,11],"The http tier","http-tier",[38,39,11,11],"The browser tier","browser-tier",[41,42,11,11],"Sessions","sessions",[44,45,11,11],"Human in the loop","human-in-the-loop",[47,48,11,11],"How healing works","self-healing",[50,51,11,11],"Obstacles and captchas","obstacles",[53,54,11,11],"Validation and warnings","validation-and-warnings",[56,57,11,11],"Credits and billing","credits-and-billing",[59,60,11,11],"Limits","limits",[62,63,11,11],"Locators","locators",[65,66,11,11],"Snapshots","snapshots",[68,69,11,11],"Egress and proxies","egress-and-proxies",[71,72,11,11],"Queueing and fairness","queueing",[74,75,11,11],"Accounts, organisations and roles","accounts-and-roles",[77,78,11,11],"Data retention","data-retention",[80,81,11,11],"Documents and PDFs","documents-and-pdfs",[83,84,85,86],"Guides","\u002Fguides","i-lucide-map",[87,88,91,94,97,100,103,106,109,112,115,118,121,124,127,130],[27,84,11,11],[89,90,11,11],"Authenticated flows","authenticated-flows",[92,93,11,11],"Hosted resolve pages","hosted-resolve",[95,96,11,11],"Lists and pagination","lists-and-pagination",[98,99,11,11],"JSON and network locators","json-and-network-locators",[101,102,11,11],"Schedules and change detection","schedules-and-change-detection",[104,105,11,11],"Webhooks","webhooks",[107,108,11,11],"Bring your own providers","byo-providers",[110,111,11,11],"Testing: replay, dry-run and test mode","testing",[113,114,11,11],"Side-effect safety","side-effect-safety",[116,117,11,11],"Security & data handling","security-and-data",[119,120,11,11],"Migrating from other tools","migrating",[122,123,11,11],"Drift detection and canaries","drift-and-canaries",[125,126,11,11],"SDKs","sdks",[128,129,11,11],"The kaab CLI","cli",[131,132,11,11],"Coding agents (MCP)","mcp",[134,135,136,137],"Panel","\u002Fpanel","i-lucide-layout-dashboard",[138,139,142,145,148,151],[27,135,11,11],[140,141,11,11],"The program builder","builder",[143,144,11,11],"Picking and recording","picking-and-recording",[146,147,11,11],"Taking over a job","takeover",[149,150,11,11],"Getting help","support",[152,153,11,11],"Referrals","referrals",[155,156,157,158],"Reference","\u002Freference","i-lucide-library",[159,160,520,834,837,840,1006,1007],[27,156,11,11],[161,162,11,163],"API","api",[164,166,169,212,222,274,297,316,347,376,389,396,403,410,426,447,454],[27,165,11,11],"\u002Freference\u002Fapi",[167,168,11,11],"Interactive reference","explorer",[170,171,11,172],"Jobs","jobs",[173,176,179,182,185,188,191,194,197,200,203,206,209],[174,175,11,11],"Create job","create-job",[177,178,11,11],"List jobs","list-jobs",[180,181,11,11],"Create job batch","create-job-batch",[183,184,11,11],"Estimate job","estimate-job",[186,187,11,11],"Get job","get-job",[189,190,11,11],"List job steps","list-job-steps",[192,193,11,11],"Get job snapshot","get-job-snapshot",[195,196,11,11],"Get job screenshot","get-job-screenshot",[198,199,11,11],"Get job artifact","get-job-artifact",[201,202,11,11],"Submit job input","submit-job-input",[204,205,11,11],"Resume job","resume-job",[207,208,11,11],"Takeover job","takeover-job",[210,211,11,11],"Cancel job","cancel-job",[213,214,11,215],"Batches","batches",[216,219],[217,218,11,11],"Get batch","get-batch",[220,221,11,11],"List batch jobs","list-batch-jobs",[223,224,11,225],"Programs","programs",[226,229,232,235,238,241,244,247,250,253,256,259,262,265,268,271],[227,228,11,11],"Create program","create-program",[230,231,11,11],"List programs","list-programs",[233,234,11,11],"Lint program","lint-program",[236,237,11,11],"Get program","get-program",[239,240,11,11],"Update program","update-program",[242,243,11,11],"Delete program","delete-program",[245,246,11,11],"List program versions","list-program-versions",[248,249,11,11],"Create program version","create-program-version",[251,252,11,11],"Update program version","update-program-version",[254,255,11,11],"Delete program version","delete-program-version",[257,258,11,11],"Get program version","get-program-version",[260,261,11,11],"Publish program version","publish-program-version",[263,264,11,11],"Diff program version","diff-program-version",[266,267,11,11],"Replay program version","replay-program-version",[269,270,11,11],"Set program alias","set-program-alias",[272,273,11,11],"Delete program alias","delete-program-alias",[41,42,11,275],[276,279,282,285,288,291,294],[277,278,11,11],"Create session","create-session",[280,281,11,11],"List sessions","list-sessions",[283,284,11,11],"Get session","get-session",[286,287,11,11],"Update session","update-session",[289,290,11,11],"Delete session","delete-session",[292,293,11,11],"Verify session","verify-session",[295,296,11,11],"Refresh session","refresh-session",[298,299,11,300],"Proposals","proposals",[301,304,307,310,313],[302,303,11,11],"List proposals","list-proposals",[305,306,11,11],"Get proposal","get-proposal",[308,309,11,11],"Approve proposal","approve-proposal",[311,312,11,11],"Reject proposal","reject-proposal",[314,315,11,11],"Edit proposal","edit-proposal",[317,318,11,319],"Schedules","schedules",[320,323,326,329,332,335,338,341,344],[321,322,11,11],"Create schedule","create-schedule",[324,325,11,11],"List schedules","list-schedules",[327,328,11,11],"Get schedule","get-schedule",[330,331,11,11],"Update schedule","update-schedule",[333,334,11,11],"Delete schedule","delete-schedule",[336,337,11,11],"Pause schedule","pause-schedule",[339,340,11,11],"Resume schedule","resume-schedule",[342,343,11,11],"List schedule runs","list-schedule-runs",[345,346,11,11],"Get schedule run diff","get-schedule-run-diff",[104,105,11,348],[349,352,355,358,361,364,367,370,373],[350,351,11,11],"Create webhook","create-webhook",[353,354,11,11],"List webhooks","list-webhooks",[356,357,11,11],"Get webhook","get-webhook",[359,360,11,11],"Update webhook","update-webhook",[362,363,11,11],"Delete webhook","delete-webhook",[365,366,11,11],"Rotate webhook secret","rotate-webhook-secret",[368,369,11,11],"List webhook deliveries","list-webhook-deliveries",[371,372,11,11],"Resend webhook delivery","resend-webhook-delivery",[374,375,11,11],"Test webhook","test-webhook",[377,378,11,379],"Organisation","org",[380,383,386],[381,382,11,11],"Rotate org webhook secret","rotate-org-webhook-secret",[384,385,11,11],"Get org","get-org",[387,388,11,11],"Request data deletion","request-data-deletion",[390,391,11,392],"Credits","credits",[393],[394,395,11,11],"Get credits","get-credits",[397,398,11,399],"Ledger","ledger",[400],[401,402,11,11],"List ledger entries","list-ledger-entries",[404,405,11,406],"Usage","usage",[407],[408,409,11,11],"Get usage","get-usage",[411,412,11,413],"API keys","api-keys",[414,417,420,423],[415,416,11,11],"List API keys","list-api-keys",[418,419,11,11],"Create API key","create-api-key",[421,422,11,11],"Rotate API key","rotate-api-key",[424,425,11,11],"Revoke API key","revoke-api-key",[427,108,11,428],"BYO providers",[429,432,435,438,441,444],[430,431,11,11],"List BYO providers","list-byo-providers",[433,434,11,11],"Create BYO provider","create-byo-provider",[436,437,11,11],"Get BYO provider","get-byo-provider",[439,440,11,11],"Update BYO provider","update-byo-provider",[442,443,11,11],"Delete BYO provider","delete-byo-provider",[445,446,11,11],"Test BYO provider","test-byo-provider",[448,449,11,450],"Sites","sites",[451],[452,453,11,11],"Get site profile","get-site-profile",[455,456,11,457],"Objects","schemas",[458,460,463,466,469,470,473,476,479,482,485,487,490,493,496,499,502,505,508,511,514,517],[27,459,11,11],"\u002Freference\u002Fapi\u002Fschemas",[461,462,11,11],"ApiKey","api-key",[464,465,11,11],"Batch","batch",[467,468,11,11],"ByoProvider","byo-provider",[390,391,11,11],[471,472,11,11],"ErrorResponse","error-response",[474,475,11,11],"ExtractSchema","extract-schema",[477,478,11,11],"Job","job",[480,481,11,11],"LedgerEntry","ledger-entry",[483,484,11,11],"LintResult","lint-result",[486,378,11,11],"Org",[488,489,11,11],"Program","program",[491,492,11,11],"ProgramDefinition","program-definition",[494,495,11,11],"ProgramVersion","program-version",[497,498,11,11],"Proposal","proposal",[500,501,11,11],"Schedule","schedule",[503,504,11,11],"Session","session",[506,507,11,11],"SiteProfile","site-profile",[509,510,11,11],"StepRecord","step-record",[512,513,11,11],"Webhook","webhook",[515,516,11,11],"WebhookDelivery","webhook-delivery",[518,519,11,11],"WebhookEvent","webhook-event",[521,522,11,523],"DSL","dsl",[524,526,529,532,535,538,603,637,640,751,754,756],[27,525,11,11],"\u002Freference\u002Fdsl",[527,528,11,11],"Inputs","inputs",[530,531,11,11],"Options","options",[533,534,11,11],"Policies","policies",[536,537,11,11],"Steps","steps",[539,540,11,541],"Actions","actions",[542,544,546,548,550,552,554,556,558,560,562,565,568,570,573,575,577,579,582,585,587,589,591,594,596,598,600],[27,543,11,11],"\u002Freference\u002Fdsl\u002Factions",[545,545,11,11],"fill",[547,547,11,11],"click",[549,549,11,11],"press",[551,551,11,11],"hover",[553,553,11,11],"select",[555,555,11,11],"check",[557,557,11,11],"uncheck",[559,559,11,11],"upload",[561,561,11,11],"scroll",[563,564,11,11],"wait_for","wait-for",[566,567,11,11],"set_session","set-session",[569,569,11,11],"extract",[571,572,11,11],"capture_response","capture-response",[574,574,11,11],"evaluate",[576,576,11,11],"paginate",[578,578,11,11],"download",[580,581,11,11],"read_pdf","read-pdf",[583,584,11,11],"set_vars","set-vars",[586,586,11,11],"sleep",[588,588,11,11],"reload",[590,590,11,11],"goto",[592,593,11,11],"await_input","await-input",[595,595,11,11],"checkpoint",[597,597,11,11],"screenshot",[599,599,11,11],"when",[601,602,11,11],"loop_until","loop-until",[604,605,11,606],"Conditions","conditions",[607,609,611,613,615,617,619,621,623,625,627,629,631,633,635],[27,608,11,11],"\u002Freference\u002Fdsl\u002Fconditions",[610,610,11,11],"url",[612,612,11,11],"title",[614,614,11,11],"visible",[616,616,11,11],"hidden",[618,618,11,11],"exists",[620,620,11,11],"absent",[622,622,11,11],"text",[624,624,11,11],"count",[626,626,11,11],"network",[628,628,11,11],"var",[630,630,11,11],"landmark",[632,632,11,11],"all",[634,634,11,11],"any",[636,636,11,11],"not",[638,639,11,11],"Targets","targets",[641,642,11,643],"Fields","fields",[644,646,649,651,654,656,659,661,663,666,668,671,672,674,677,679,681,683,685,687,690,693,695,698,701,703,704,707,709,712,714,716,718,720,722,724,726,728,731,733,734,736,738,740,743,745,747,749],[27,645,11,11],"\u002Freference\u002Fdsl\u002Ffields",[647,648,11,11],"allow_suffix","allow-suffix",[650,650,11,11],"attr",[652,653,11,11],"base_url","base-url",[655,655,11,11],"candidates",[657,658,11,11],"case_insensitive","case-insensitive",[660,660,11,11],"country",[662,662,11,11],"currency",[664,665,11,11],"date_format","date-format",[667,667,11,11],"decimal",[669,670,11,11],"false_values","false-values",[642,642,11,11],[673,673,11,11],"flags",[675,676,11,11],"follow_redirects","follow-redirects",[678,678,11,11],"frame",[680,680,11,11],"json",[682,682,11,11],"locale",[684,684,11,11],"many",[686,686,11,11],"max",[688,689,11,11],"max_items","max-items",[691,692,11,11],"max_length","max-length",[694,694,11,11],"min",[696,697,11,11],"min_items","min-items",[699,700,11,11],"min_length","min-length",[702,702,11,11],"name",[626,626,11,11],[705,706,11,11],"null_markers","null-markers",[708,708,11,11],"nullable",[710,711,11,11],"on_invalid","on-invalid",[713,713,11,11],"pattern",[715,715,11,11],"presence",[717,717,11,11],"regex",[719,719,11,11],"required",[721,721,11,11],"role",[723,723,11,11],"sample",[725,725,11,11],"selector",[727,727,11,11],"source",[729,730,11,11],"strip_fragment","strip-fragment",[732,732,11,11],"testid",[622,622,11,11],[735,735,11,11],"thousands",[737,737,11,11],"timezone",[739,739,11,11],"transforms",[741,742,11,11],"true_values","true-values",[744,744,11,11],"type",[746,746,11,11],"unique",[748,748,11,11],"values",[750,750,11,11],"xpath",[752,753,11,11],"Assertions","assertions",[755,739,11,11],"Transforms",[757,758,11,759],"Lint codes","lint",[760,762,765,768,771,774,777,780,783,786,789,792,795,798,801,804,807,810,813,816,819,822,825,828,831],[27,761,11,11],"\u002Freference\u002Fdsl\u002Flint",[763,764,11,11],"E001","e001",[766,767,11,11],"E002","e002",[769,770,11,11],"E003","e003",[772,773,11,11],"E004","e004",[775,776,11,11],"E005","e005",[778,779,11,11],"E006","e006",[781,782,11,11],"E007","e007",[784,785,11,11],"E008","e008",[787,788,11,11],"E009","e009",[790,791,11,11],"E010","e010",[793,794,11,11],"E011","e011",[796,797,11,11],"E012","e012",[799,800,11,11],"E013","e013",[802,803,11,11],"E014","e014",[805,806,11,11],"W001","w001",[808,809,11,11],"W002","w002",[811,812,11,11],"W003","w003",[814,815,11,11],"W004","w004",[817,818,11,11],"W005","w005",[820,821,11,11],"W006","w006",[823,824,11,11],"W007","w007",[826,827,11,11],"W008","w008",[829,830,11,11],"W009","w009",[832,833,11,11],"W010","w010",[835,836,11,11],"Codes","codes",[838,839,11,11],"Events","events",[841,129,11,842],"CLI",[843,845,847,850,853,856,859,862,865,868,871,874,877,880,883,886,889,892,895,898,901,904,907,910,913,916,919,922,925,928,931,934,937,940,943,946,949,952,955,958,961,964,967,970,973,976,979,982,985,988,991,994,997,1000,1003],[27,844,11,11],"\u002Freference\u002Fcli",[846,846,11,11],"kaab",[848,849,11,11],"kaab auth","kaab-auth",[851,852,11,11],"kaab auth login","kaab-auth-login",[854,855,11,11],"kaab auth logout","kaab-auth-logout",[857,858,11,11],"kaab auth status","kaab-auth-status",[860,861,11,11],"kaab completion","kaab-completion",[863,864,11,11],"kaab completion bash","kaab-completion-bash",[866,867,11,11],"kaab completion fish","kaab-completion-fish",[869,870,11,11],"kaab completion powershell","kaab-completion-powershell",[872,873,11,11],"kaab completion zsh","kaab-completion-zsh",[875,876,11,11],"kaab credits","kaab-credits",[878,879,11,11],"kaab jobs","kaab-jobs",[881,882,11,11],"kaab jobs cancel","kaab-jobs-cancel",[884,885,11,11],"kaab jobs get","kaab-jobs-get",[887,888,11,11],"kaab jobs input","kaab-jobs-input",[890,891,11,11],"kaab jobs list","kaab-jobs-list",[893,894,11,11],"kaab jobs resume","kaab-jobs-resume",[896,897,11,11],"kaab jobs run","kaab-jobs-run",[899,900,11,11],"kaab jobs snapshot","kaab-jobs-snapshot",[902,903,11,11],"kaab jobs steps","kaab-jobs-steps",[905,906,11,11],"kaab jobs takeover","kaab-jobs-takeover",[908,909,11,11],"kaab open","kaab-open",[911,912,11,11],"kaab open job","kaab-open-job",[914,915,11,11],"kaab programs","kaab-programs",[917,918,11,11],"kaab programs alias","kaab-programs-alias",[920,921,11,11],"kaab programs alias set","kaab-programs-alias-set",[923,924,11,11],"kaab programs diff","kaab-programs-diff",[926,927,11,11],"kaab programs lint","kaab-programs-lint",[929,930,11,11],"kaab programs list","kaab-programs-list",[932,933,11,11],"kaab programs pull","kaab-programs-pull",[935,936,11,11],"kaab programs push","kaab-programs-push",[938,939,11,11],"kaab proposals","kaab-proposals",[941,942,11,11],"kaab proposals approve","kaab-proposals-approve",[944,945,11,11],"kaab proposals list","kaab-proposals-list",[947,948,11,11],"kaab proposals reject","kaab-proposals-reject",[950,951,11,11],"kaab proposals show","kaab-proposals-show",[953,954,11,11],"kaab schedules","kaab-schedules",[956,957,11,11],"kaab schedules create","kaab-schedules-create",[959,960,11,11],"kaab schedules list","kaab-schedules-list",[962,963,11,11],"kaab schedules pause","kaab-schedules-pause",[965,966,11,11],"kaab schedules resume","kaab-schedules-resume",[968,969,11,11],"kaab schedules runs","kaab-schedules-runs",[971,972,11,11],"kaab sessions","kaab-sessions",[974,975,11,11],"kaab sessions create","kaab-sessions-create",[977,978,11,11],"kaab sessions delete","kaab-sessions-delete",[980,981,11,11],"kaab sessions list","kaab-sessions-list",[983,984,11,11],"kaab sessions verify","kaab-sessions-verify",[986,987,11,11],"kaab usage","kaab-usage",[989,990,11,11],"kaab version","kaab-version",[992,993,11,11],"kaab webhooks","kaab-webhooks",[995,996,11,11],"kaab webhooks create","kaab-webhooks-create",[998,999,11,11],"kaab webhooks deliveries","kaab-webhooks-deliveries",[1001,1002,11,11],"kaab webhooks list","kaab-webhooks-list",[1004,1005,11,11],"kaab webhooks test","kaab-webhooks-test",[125,126,11,11],[1008,1009,11,11],"Plans and pricing","plans",[1011,1012,1013,1014],"Changelog","\u002Fchangelog","i-lucide-history",[1015,1016],[27,1012,11,11],[1017,1018,11,11],"Deprecations","deprecations",{"id":1020,"title":143,"body":1021,"breaking":1513,"date":1514,"description":1515,"extension":1516,"generated":1513,"meta":1517,"navigation":1518,"path":1519,"seo":1520,"stem":1521,"version":1514,"__hash__":1522},"docs\u002F4.panel\u002F03.picking-and-recording.md",{"type":1022,"value":1023,"toc":1500},"minimark",[1024,1028,1033,1041,1045,1072,1075,1089,1093,1099,1107,1176,1194,1210,1224,1239,1243,1261,1264,1279,1293,1297,1310,1313,1351,1358,1362,1365,1422,1426,1463,1466],[1025,1026,1027],"p",{},"The program builder opens a live browser on the page you are automating, and a copy of any page\nyour jobs stored. Pick an element on either to get ranked locators and list fields, or use the live\npage normally and let Kaabist record what you do as steps.",[1029,1030,1032],"h2",{"id":1031},"when-to-use-it","When to use it",[1025,1034,1035,1036,1040],{},"Pick when you know which values you want and need reliable locators for them, especially lists.\nRecord when the program has to ",[1037,1038,1039],"em",{},"do"," something first: sign in, fill a form, open a menu. For a page\nthat only needs reading, picking on a stored page is the fastest: nothing runs and it costs\nnothing.",[1029,1042,1044],{"id":1043},"the-browser-pane","The browser pane",[1025,1046,1047,1051,1052,1055,1056,1059,1060,1063,1064,1067,1068,1071],{},[1048,1049,1050],"strong",{},"Browser",", in the builder's right column, shows the live page with a toolbar above it: a\n",[1048,1053,1054],{},"Navigate"," \u002F ",[1048,1057,1058],{},"Pick"," switch, back, reload, the address bar, and ",[1048,1061,1062],{},"Open browser"," (which becomes\n",[1048,1065,1066],{},"Close"," once it is open). Before you open it you can name a stored session to start signed in;\nthe pane says which network the browser goes out through, the same as a run of the program.\nPresets set the viewport (desktop 1280×800, small laptop, tablet, mobile), and ",[1048,1069,1070],{},"Use for program","\ncopies the current one into the program's options. Tabs appear when the page opens more than one;\n\"Something covers the page\" warns about an overlay.",[1025,1073,1074],{},"It has two modes:",[1076,1077,1078,1084],"ul",{},[1079,1080,1081,1083],"li",{},[1048,1082,1054],{},": you use the page as usual, and Kaabist records what you do as steps.",[1079,1085,1086,1088],{},[1048,1087,1058],{},": clicks no longer reach the page; they select elements instead.",[1029,1090,1092],{"id":1091},"picking","Picking",[1025,1094,1095,1096,1098],{},"Press ",[1048,1097,1058],{}," next to a target or a field in the step list: a banner says \"Pick mode: click the\nelement in the page\". Hover to see what is under the pointer, outlined on the page; click to\nselect it, and the target or field is filled in. A label beside the selection names the element,\nits best locator and how many similar elements the page has.",[1025,1100,1101,1102,1106],{},"Every selection comes with up to six locators, best first, each checked to match exactly that\nelement: a test id or an accessible role and name when the page has one, an id, the element's text,\na CSS selector built only from classes that look stable, and finally a structural path. Elements\ninside shadow roots get a ",[1103,1104,1105],"code",{},">>>"," selector that names the host chain; elements inside iframes carry\ntheir frame path.",[1108,1109,1110,1123],"table",{},[1111,1112,1113],"thead",{},[1114,1115,1116,1120],"tr",{},[1117,1118,1119],"th",{},"Key",[1117,1121,1122],{},"Moves the selection to…",[1124,1125,1126,1135,1143,1153,1166],"tbody",{},[1114,1127,1128,1132],{},[1129,1130,1131],"td",{},"↑ \u002F ↓",[1129,1133,1134],{},"the parent \u002F the first child",[1114,1136,1137,1140],{},[1129,1138,1139],{},"← \u002F →",[1129,1141,1142],{},"the previous \u002F next sibling",[1114,1144,1145,1150],{},[1129,1146,1147],{},[1103,1148,1149],{},"s",[1129,1151,1152],{},"every similar item: the whole list",[1114,1154,1155,1160],{},[1129,1156,1157],{},[1103,1158,1159],{},"r",[1129,1161,1162,1163,1165],{},"text-range mode: select characters inside the element to build a ",[1103,1164,717],{}," field",[1114,1167,1168,1173],{},[1129,1169,1170],{},[1103,1171,1172],{},"Esc",[1129,1174,1175],{},"nothing (clears the selection)",[1025,1177,1178,1179,1182,1183,1186,1187,1190,1191,1193],{},"In the step's form, the target's locators are listed best first, each marked ",[1037,1180,1181],{},"stable",", ",[1037,1184,1185],{},"fair"," or\n",[1037,1188,1189],{},"fragile"," and ",[1037,1192,746],{}," or with its number of matches; reorder, remove or add one by hand.",[1025,1195,1196,1199,1200,1202,1203,1206,1207,1209],{},[1048,1197,1198],{},"Lists."," Press ",[1103,1201,1149],{}," on one price in a grid and the selection becomes a list: the item selector,\nhow many items there are, and the path from an item to the price. Pick anything else inside an item\nafterwards and it is added as a field of that list, with a suggested name and a few sample values.\nWhen a list renders fewer rows than it claims to have, the selection says so (",[1103,1204,1205],{},"virtualized","): that\nlist needs a ",[1103,1208,561],{}," step to extract fully.",[1025,1211,1212,1215,1216,1219,1220,1223],{},[1048,1213,1214],{},"Hover-only UI."," Open the menu in navigate mode, then switch to pick mode: the pointer no longer\nreaches the page, so the menu stays open. ",[1037,1217,1218],{},"Freeze"," additionally pauses animations. ",[1103,1221,1222],{},"Ctrl+click"," in\nnavigate mode picks without switching modes.",[1025,1225,1226,1229,1230,1233,1234,1238],{},[1048,1227,1228],{},"Ground truth."," When you confirm a field on a page, Kaabist stores a snapshot of the page and the\nelement's fingerprint as the field's ",[1037,1231,1232],{},"ground truth",": the reference self-healing uses when the page\nchanges (see ",[1235,1236,48],"a",{"href":1237},"\u002Fconcepts\u002Fself-healing",").",[1029,1240,1242],{"id":1241},"picking-on-a-stored-page","Picking on a stored page",[1025,1244,1245,1246,1249,1250,1190,1253,1256,1257,1260],{},"You do not need a live browser to write an extract schema. ",[1048,1247,1248],{},"Stored page"," opens any page your jobs\nhave already fetched: type a reference such as ",[1103,1251,1252],{},"job_…:steps[2]",[1048,1254,1255],{},"Open",", choose the version's\nground truth, or press ",[1048,1258,1259],{},"Use this page in the picker"," on a step of a test run. You pick on the copy\nKaabist stored, the same way as live: the same locators, the same keys, the same lists and fields,\nbecause it is the same picker running over the same page. It is instant, since nothing goes back to\na browser, and it costs nothing.",[1025,1262,1263],{},"What you see is a safe copy: scripts and anything else that could run are removed, and the copy is\nshown in a sandbox where nothing can run anyway, so links do not navigate and forms do not submit.\nImages and styles are loaded as the page had them. Frames the page had on its own site are shown\ntoo; frames from other sites stay empty.",[1025,1265,1266,1269,1270,1272,1273,1275,1276,1278],{},[1048,1267,1268],{},"Text ranges."," Select characters with the mouse and press ",[1103,1271,1159],{},": the selection becomes a ",[1103,1274,717],{},"\nfield. Press ",[1103,1277,1159],{}," with nothing selected to see the element's whole text instead.",[1025,1280,1281,1284,1285,1288,1289,1292],{},[1048,1282,1283],{},"Testing a schema."," While you edit, every field is extracted from the page in your browser as you\ntype; ",[1048,1286,1287],{},"Run here"," shows the result under \"In the browser\". ",[1048,1290,1291],{},"Test on the server"," runs the schema\nagainst the stored page on Kaabist, under \"On the server\": the answer a job would give for that\npage, including fields that read embedded JSON or a captured API response, which only the server\nhas.",[1029,1294,1296],{"id":1295},"recording","Recording",[1025,1298,1095,1299,1302,1303,1306,1307,1309],{},[1048,1300,1301],{},"Record"," in the browser pane; it counts the steps it has recorded and ",[1048,1304,1305],{},"Pause recording","\nstops it. In navigate mode every click, every field you type into, every selection in a dropdown and\nevery checkbox becomes a step, with locators for the element. Typing into a field is one ",[1103,1308,545],{},",\nhowever many keys it took.",[1025,1311,1312],{},"The recorder makes suggestions on the steps it adds:",[1076,1314,1315,1329,1345],{},[1079,1316,1317,1320,1321,1324,1325,1328],{},[1048,1318,1319],{},"A password"," is never recorded. The step says \"The value typed here is a secret; it is not\nrecorded.\" and offers to declare a ",[1103,1322,1323],{},"secret"," input; the step then uses ",[1103,1326,1327],{},"{{inputs.password}}",".",[1079,1330,1331,1334,1335,1338,1339,1341,1342,1328],{},[1048,1332,1333],{},"A one-time code"," is recognised (\"This looks like a one-time code.\") and ",[1048,1336,1337],{},"Ask for it when the\nprogram runs"," adds an ",[1103,1340,592],{}," step; the fill then uses ",[1103,1343,1344],{},"{{vars.otp}}",[1079,1346,1347,1350],{},[1048,1348,1349],{},"After an action that navigates",", \"Add expect:\" offers conditions (the new URL, headings or\nforms that appeared) that you attach with one click.",[1025,1352,1353,1354,1357],{},"The recorder's steps are ordinary program steps (marked ",[1103,1355,1356],{},"x_kaab: { \"source\": \"recorder\" }","), so\neverything else in the builder (editing, linting, testing) works on them unchanged.",[1029,1359,1361],{"id":1360},"worked-example","Worked example",[1025,1363,1364],{},"Record a customer portal's sign-in with a one-time code and pick its report:",[1366,1367,1368,1383,1386,1397,1412],"ol",{},[1079,1369,1370,1371,1373,1374,1377,1378,1380,1381,1328],{},"In a new program's builder, open ",[1048,1372,1050],{}," on ",[1103,1375,1376],{},"https:\u002F\u002Fportal.example.com\u002Flogin",", press\n",[1048,1379,1062],{},", then ",[1048,1382,1301],{},[1079,1384,1385],{},"Sign in with a test account and accept the suggestion to declare the password as a secret\ninput.",[1079,1387,1388,1389,1392,1393,1396],{},"Type the one-time code the site sent and accept ",[1048,1390,1391],{},"Ask for it when the program runs",". Open the\nreport, and attach the suggested ",[1103,1394,1395],{},"expect"," on its URL.",[1079,1398,1399,1401,1402,1405,1406,1408,1409,1411],{},[1048,1400,1305],{},". Add an ",[1048,1403,1404],{},"Extract"," step, press ",[1048,1407,1058],{}," on a new field, and click one amount\nin the report table; press ",[1103,1410,1149],{}," to select every row. Pick the other columns of a row to add them\nas fields of the list.",[1079,1413,1414,1415,1182,1418,1421],{},"In ",[1048,1416,1417],{},"Test",[1048,1419,1420],{},"Run all",": the run stops to ask for the one-time code, then returns the report's\n40 rows.",[1029,1423,1425],{"id":1424},"pitfalls","Pitfalls",[1076,1427,1428,1439,1448,1454],{},[1079,1429,1430,1433,1434,1436,1437,1328],{},[1048,1431,1432],{},"Picking in navigate mode."," Clicks reach the page and get recorded. Switch to ",[1048,1435,1058],{}," first,\nor use ",[1103,1438,1222],{},[1079,1440,1441,1444,1445,1447],{},[1048,1442,1443],{},"Accepting a fragile locator."," If the best candidate is marked ",[1037,1446,1189],{},", add a better one by\nhand (a test id or a role and name) before you publish.",[1079,1449,1450,1453],{},[1048,1451,1452],{},"Typing a real password while recording."," It is not recorded, but it does reach the site. Use a\ntest account.",[1079,1455,1456,1462],{},[1048,1457,1458,1459,1461],{},"A virtualized list without a ",[1103,1460,561],{}," step."," The extract returns only the rows the page had in\nthe DOM.",[1029,1464,155],{"id":1465},"reference",[1076,1467,1468,1476,1493],{},[1079,1469,1470,1190,1473],{},[1235,1471,638],{"href":1472},"\u002Freference\u002Fdsl\u002Ftargets",[1235,1474,63],{"href":1475},"\u002Fconcepts\u002Flocators",[1079,1477,1478,1182,1482,1487,1488],{},[1235,1479,1481],{"href":1480},"\u002Freference\u002Fdsl\u002Factions\u002Fextract","Extract fields",[1235,1483,1485],{"href":1484},"\u002Freference\u002Fdsl\u002Ffields\u002Fregex",[1103,1486,717],{},",\n",[1235,1489,1491],{"href":1490},"\u002Freference\u002Fdsl\u002Ffields\u002Fmany",[1103,1492,684],{},[1079,1494,1495],{},[1235,1496,1498],{"href":1497},"\u002Freference\u002Fdsl\u002Factions\u002Fawait-input",[1103,1499,592],{},{"title":1501,"searchDepth":1502,"depth":1502,"links":1503},"",3,[1504,1506,1507,1508,1509,1510,1511,1512],{"id":1031,"depth":1505,"text":1032},2,{"id":1043,"depth":1505,"text":1044},{"id":1091,"depth":1505,"text":1092},{"id":1241,"depth":1505,"text":1242},{"id":1295,"depth":1505,"text":1296},{"id":1360,"depth":1505,"text":1361},{"id":1424,"depth":1505,"text":1425},{"id":1465,"depth":1505,"text":155},false,null,"Point at elements in a live page to get locators and list fields, and record what you do as program steps.","md",{},true,"\u002Fpanel\u002Fpicking-and-recording",{"title":143,"description":1515},"4.panel\u002F03.picking-and-recording","DLj4_0K5DQyKbgs5ivj3fsPERbi9pa5wZx4nOhEw10s",[1524,1528],{"title":140,"path":1525,"stem":1526,"description":1527,"children":-1},"\u002Fpanel\u002Fbuilder","4.panel\u002F02.builder","Build, test and publish programs in the panel: visually or in JSON, by recording, by picking on live pages and stored snapshots.",{"title":146,"path":1529,"stem":1530,"description":1531,"children":-1},"\u002Fpanel\u002Ftakeover","4.panel\u002F04.takeover","Open a live browser on a parked job, finish what the program could not, and turn what you did into steps the next run can take.",1793593418287]