[{"data":1,"prerenderedAt":2021},["ShallowReactive",2],{"navigation":3,"page:\u002Fconcepts\u002Flocators":1019,"surround:\u002Fconcepts\u002Flocators":2012},[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":62,"body":1021,"breaking":2002,"date":2003,"description":2004,"extension":2005,"generated":2002,"meta":2006,"navigation":2007,"path":2008,"seo":2009,"stem":2010,"version":2003,"__hash__":2011},"docs\u002F2.concepts\u002F12.locators.md",{"type":1022,"value":1023,"toc":1989},"minimark",[1024,1028,1033,1044,1048,1054,1178,1279,1295,1299,1315,1318,1321,1325,1328,1469,1472,1476,1479,1538,1556,1560,1569,1584,1588,1591,1595,1606,1610,1613,1634,1711,1720,1745,1773,1913,1917,1954,1957,1985],[1025,1026,1027],"p",{},"A locator is how a step or an extract field points at something on a page, and Kaabist stores an ordered list of them for each target rather than one. How that list is written is the difference between a program that runs for a year and one that breaks on the next deploy.",[1029,1030,1032],"h2",{"id":1031},"when-to-use-it","When to use it",[1025,1034,1035,1036,1040,1041,1043],{},"You rarely write locators by hand: the picker and the recorder write them for you. Read this page when you edit a target in JSON, when a job fails with ",[1037,1038,1039],"code",{},"target_ambiguous"," or a missing target, when lint warns that a locator list is only structural (",[1037,1042,808],{},"), or when you decide what to ask a site's developers for so your programs last.",[1029,1045,1047],{"id":1046},"what-a-target-looks-like","What a target looks like",[1025,1049,1050,1051,1053],{},"A plain string is a CSS selector. An object names one strategy, or lists several as ",[1037,1052,655],{},":",[1055,1056,1060],"pre",{"className":1057,"code":1058,"language":680,"meta":1059,"style":1059},"language-json shiki shiki-themes kaab-code kaab-code kaab-code","{\n  \"candidates\": [\n    { \"testid\": \"product-price\" },\n    { \"role\": \"cell\", \"name\": \"Amount\" },\n    { \"css\": \".product-card .price\" },\n    { \"xpath\": \"\u002F\u002F*[@data-testid='row']\u002Ftd[3]\" }\n  ]\n}\n","",[1037,1061,1062,1071,1084,1105,1133,1150,1166,1172],{"__ignoreMap":1059},[1063,1064,1067],"span",{"class":1065,"line":1066},"line",1,[1063,1068,1070],{"class":1069},"sTzsn","{\n",[1063,1072,1074,1078,1081],{"class":1065,"line":1073},2,[1063,1075,1077],{"class":1076},"sqn18","  \"candidates\"",[1063,1079,1053],{"class":1080},"sQm2-",[1063,1082,1083],{"class":1069}," [\n",[1063,1085,1087,1090,1093,1095,1099,1102],{"class":1065,"line":1086},3,[1063,1088,1089],{"class":1069},"    { ",[1063,1091,1092],{"class":1076},"\"testid\"",[1063,1094,1053],{"class":1080},[1063,1096,1098],{"class":1097},"suOy4"," \"product-price\"",[1063,1100,1101],{"class":1069}," }",[1063,1103,1104],{"class":1080},",\n",[1063,1106,1108,1110,1113,1115,1118,1121,1124,1126,1129,1131],{"class":1065,"line":1107},4,[1063,1109,1089],{"class":1069},[1063,1111,1112],{"class":1076},"\"role\"",[1063,1114,1053],{"class":1080},[1063,1116,1117],{"class":1097}," \"cell\"",[1063,1119,1120],{"class":1080},",",[1063,1122,1123],{"class":1076}," \"name\"",[1063,1125,1053],{"class":1080},[1063,1127,1128],{"class":1097}," \"Amount\"",[1063,1130,1101],{"class":1069},[1063,1132,1104],{"class":1080},[1063,1134,1136,1138,1141,1143,1146,1148],{"class":1065,"line":1135},5,[1063,1137,1089],{"class":1069},[1063,1139,1140],{"class":1076},"\"css\"",[1063,1142,1053],{"class":1080},[1063,1144,1145],{"class":1097}," \".product-card .price\"",[1063,1147,1101],{"class":1069},[1063,1149,1104],{"class":1080},[1063,1151,1153,1155,1158,1160,1163],{"class":1065,"line":1152},6,[1063,1154,1089],{"class":1069},[1063,1156,1157],{"class":1076},"\"xpath\"",[1063,1159,1053],{"class":1080},[1063,1161,1162],{"class":1097}," \"\u002F\u002F*[@data-testid='row']\u002Ftd[3]\"",[1063,1164,1165],{"class":1069}," }\n",[1063,1167,1169],{"class":1065,"line":1168},7,[1063,1170,1171],{"class":1069},"  ]\n",[1063,1173,1175],{"class":1065,"line":1174},8,[1063,1176,1177],{"class":1069},"}\n",[1179,1180,1181,1194],"table",{},[1182,1183,1184],"thead",{},[1185,1186,1187,1191],"tr",{},[1188,1189,1190],"th",{},"Key",[1188,1192,1193],{},"Finds",[1195,1196,1197,1208,1217,1234,1245,1256,1266],"tbody",{},[1185,1198,1199,1205],{},[1200,1201,1202],"td",{},[1037,1203,1204],{},"css",[1200,1206,1207],{},"a CSS selector (also the meaning of a bare string)",[1185,1209,1210,1214],{},[1200,1211,1212],{},[1037,1213,750],{},[1200,1215,1216],{},"an XPath expression",[1185,1218,1219,1231],{},[1200,1220,1221,1223,1224,1226,1227,1230],{},[1037,1222,721],{}," (+ ",[1037,1225,702],{},", ",[1037,1228,1229],{},"exact",")",[1200,1232,1233],{},"an element by its accessible role, optionally by its accessible name",[1185,1235,1236,1242],{},[1200,1237,1238,1223,1240,1230],{},[1037,1239,622],{},[1037,1241,1229],{},[1200,1243,1244],{},"an element by its visible text",[1185,1246,1247,1251],{},[1200,1248,1249],{},[1037,1250,732],{},[1200,1252,1253],{},[1037,1254,1255],{},"[data-testid=\"…\"]",[1185,1257,1258,1263],{},[1200,1259,1260],{},[1037,1261,1262],{},"nth",[1200,1264,1265],{},"picks one of several matches, counted from 0",[1185,1267,1268,1272],{},[1200,1269,1270],{},[1037,1271,678],{},[1200,1273,1274,1275,1278],{},"the chain of ",[1037,1276,1277],{},"\u003Ciframe>"," selectors to search inside",[1025,1280,1281,1282,1226,1284,1286,1287,1289,1290,1294],{},"Extract fields also accept ",[1037,1283,717],{},[1037,1285,680],{}," (a JSONPath over the page's embedded data) and ",[1037,1288,626],{}," (a JSONPath over a response the page received). Those are covered in ",[1291,1292,98],"a",{"href":1293},"\u002Fguides\u002Fjson-and-network-locators",".",[1029,1296,1298],{"id":1297},"a-target-is-usually-a-list","A target is usually a list",[1025,1300,1301,1302,1306,1307,1309,1310,1312,1313,1294],{},"Kaabist tries the candidates in order and keeps the first that matches ",[1303,1304,1305],"strong",{},"exactly one"," element. A candidate that has become ambiguous (the site now has four elements where it had one) is skipped rather than guessed at. A single locator with no ",[1037,1308,655],{}," that matches several elements fails with ",[1037,1311,1039],{}," unless it has ",[1037,1314,1262],{},[1025,1316,1317],{},"Every attempt is recorded, so a failure tells you which candidates were tried and how many elements each one found, and the healer starts from the same record.",[1025,1319,1320],{},"The recorder and the picker emit at least three candidates whenever the page allows it, and after a program version's first successful run Kaabist adds more stable ones to any target whose list is shorter than three.",[1029,1322,1324],{"id":1323},"the-ranking","The ranking",[1025,1326,1327],{},"Candidates are ordered by how well they survive a redesign:",[1179,1329,1330,1343],{},[1182,1331,1332],{},[1185,1333,1334,1337,1340],{},[1188,1335,1336],{},"Rank",[1188,1338,1339],{},"Candidate",[1188,1341,1342],{},"Example",[1195,1344,1345,1358,1369,1385,1403,1414,1427,1443,1456],{},[1185,1346,1347,1350,1353],{},[1200,1348,1349],{},"100",[1200,1351,1352],{},"Test id",[1200,1354,1355],{},[1037,1356,1357],{},"data-testid=\"product-price\"",[1185,1359,1360,1363,1366],{},[1200,1361,1362],{},"90",[1200,1364,1365],{},"Role and accessible name",[1200,1367,1368],{},"button named \"Sepete ekle\"",[1185,1370,1371,1374,1380],{},[1200,1372,1373],{},"80",[1200,1375,1376,1377],{},"Stable ",[1037,1378,1379],{},"id",[1200,1381,1382],{},[1037,1383,1384],{},"#checkout-form",[1185,1386,1387,1390,1393],{},[1200,1388,1389],{},"75",[1200,1391,1392],{},"Role alone",[1200,1394,1395,1396,1399,1400],{},"the page's ",[1037,1397,1398],{},"main",", its ",[1037,1401,1402],{},"contentinfo",[1185,1404,1405,1408,1411],{},[1200,1406,1407],{},"70",[1200,1409,1410],{},"Exact text",[1200,1412,1413],{},"the element that says \"Devam\"",[1185,1415,1416,1419,1422],{},[1200,1417,1418],{},"50",[1200,1420,1421],{},"Tag and meaningful classes",[1200,1423,1424],{},[1037,1425,1426],{},".product-card .price",[1185,1428,1429,1432,1435],{},[1200,1430,1431],{},"45",[1200,1433,1434],{},"Attribute",[1200,1436,1437,1226,1440],{},[1037,1438,1439],{},"input[name=\"email\"]",[1037,1441,1442],{},"a[href*=\"\u002Forders\u002F\"]",[1185,1444,1445,1448,1451],{},[1200,1446,1447],{},"20",[1200,1449,1450],{},"Structural path",[1200,1452,1453],{},[1037,1454,1455],{},"\u002F\u002F*[@data-testid=\"row\"]\u002Ftd[3]",[1185,1457,1458,1461,1464],{},[1200,1459,1460],{},"10",[1200,1462,1463],{},"Position",[1200,1465,1466],{},[1037,1467,1468],{},"#products > li:nth-child(3)",[1025,1470,1471],{},"The generated list always ends with one of the last two. They are the first to break, and they are the only ones that always exist. The same rank is one of the terms of a healed locator's confidence, so a relocation to a test id is trusted more than one to a position.",[1029,1473,1475],{"id":1474},"classes-kaabist-will-not-use","Classes Kaabist will not use",[1025,1477,1478],{},"A class name is only an anchor if it survives the next build. These are dropped before a selector is written:",[1480,1481,1482,1502,1523],"ul",{},[1483,1484,1485,1488,1489,1226,1492,1226,1495,1226,1498,1501],"li",{},[1303,1486,1487],{},"Build-tool hashes."," ",[1037,1490,1491],{},"css-1x2y3z",[1037,1493,1494],{},"sc-bdVaJa",[1037,1496,1497],{},"Button-9f8e7d",[1037,1499,1500],{},"emotion-a1b2c3",": anything CSS Modules, styled-components, Emotion or JSS generates. The hash changes when the stylesheet changes.",[1483,1503,1504,1488,1507,1226,1510,1226,1513,1226,1516,1226,1519,1522],{},[1303,1505,1506],{},"Utility classes.",[1037,1508,1509],{},"flex",[1037,1511,1512],{},"px-4",[1037,1514,1515],{},"text-sm",[1037,1517,1518],{},"col-md-6",[1037,1520,1521],{},"justify-content-between"," and thousands more from Tailwind and Bootstrap. They say how an element looks, not what it is.",[1483,1524,1525,1488,1528,1226,1531,1226,1534,1537],{},[1303,1526,1527],{},"Generated ids.",[1037,1529,1530],{},"#ember1234",[1037,1532,1533],{},"#radix-:r7:",[1037,1535,1536],{},"#headlessui-menu-button-3",", a UUID, anything with a long run of digits. Those name a render, not an element.",[1025,1539,1540,1541,1226,1544,1547,1548,1551,1552,1555],{},"Names a person wrote, such as ",[1037,1542,1543],{},"price",[1037,1545,1546],{},"product-card"," and ",[1037,1549,1550],{},"btn-primary",", are kept. If your site's markup gives Kaabist nothing else, a ",[1037,1553,1554],{},"data-testid"," on the elements you care about is the single most effective thing you can add.",[1029,1557,1559],{"id":1558},"frames-and-shadow-dom","Frames and shadow DOM",[1025,1561,1562,1563,1565,1566,1568],{},"A target may carry a ",[1037,1564,678],{}," path: the chain of ",[1037,1567,1277],{}," selectors from the top document. Kaabist resolves it before searching. Cross-origin frames work in the browser tiers only.",[1025,1570,1571,1572,1575,1576,1579,1580,1583],{},"Open shadow roots are searched automatically, so ",[1037,1573,1574],{},".price"," finds a price inside a web component. A selector is still matched within a single root, so ",[1037,1577,1578],{},"product-card .price"," will not reach across the boundary; write ",[1037,1581,1582],{},"product-card >>> .price"," when you mean to cross it. A closed shadow root cannot be read by any script, including Kaabist's.",[1029,1585,1587],{"id":1586},"select-similar","Select similar",[1025,1589,1590],{},"Clicking one value in a repeating list gives Kaabist three things: which element is the repeating item, what contains them, and how to reach the value from inside one item. It recognises product grids, table rows, lists and definition lists, and it reports a confidence: the fraction of items in which the field it worked out actually resolves. A low confidence means the list is less regular than it looks, and the builder shows you which items came up empty.",[1029,1592,1594],{"id":1593},"picking-in-the-builder","Picking in the builder",[1025,1596,1597,1598,1601,1602,1605],{},"In the builder, press ",[1303,1599,1600],{},"Pick"," next to a target or a field and click the element, on the live page or on a stored copy of a page a job already visited. The selection comes with up to six candidate locators, best first, each checked to match exactly that element, and the label beside it names the element, its best locator and how many similar elements the page has. Picking on a stored page runs nothing and costs nothing. ",[1291,1603,143],{"href":1604},"\u002Fpanel\u002Fpicking-and-recording"," walks through it screen by screen.",[1029,1607,1609],{"id":1608},"worked-example","Worked example",[1025,1611,1612],{},"Three kinds of page show the rules at work.",[1025,1614,1615,1618,1619,1622,1623,1626,1627,1629,1630,1633],{},[1303,1616,1617],{},"Hashed classes."," A shop's product page at ",[1037,1620,1621],{},"https:\u002F\u002Fshop.example.com\u002Fp\u002F1"," names every element with build-tool classes, such as ",[1037,1624,1625],{},"\u003Cdiv class=\"x7f3a\">1.337,40 TL\u003C\u002Fdiv>",", and puts a ",[1037,1628,1554],{}," on half of them. Its next deploy re-hashes every class, so the same price is now ",[1037,1631,1632],{},"\u003Cdiv class=\"q91bc\">",". A field written as",[1055,1635,1637],{"className":1057,"code":1636,"language":680,"meta":1059,"style":1059},"\"price\": { \"candidates\": [{ \"testid\": \"product-price\" }, { \"selector\": \"main h1 + div\" }], \"type\": \"money\", \"locale\": \"tr\", \"currency\": \"TRY\" }\n",[1037,1638,1639],{"__ignoreMap":1059},[1063,1640,1641,1644,1647,1650,1652,1655,1657,1659,1661,1663,1665,1668,1671,1673,1676,1679,1681,1684,1686,1689,1691,1694,1696,1699,1701,1704,1706,1709],{"class":1065,"line":1066},[1063,1642,1643],{"class":1097},"\"price\"",[1063,1645,1646],{"class":1069},": { ",[1063,1648,1649],{"class":1076},"\"candidates\"",[1063,1651,1053],{"class":1080},[1063,1653,1654],{"class":1069}," [{ ",[1063,1656,1092],{"class":1076},[1063,1658,1053],{"class":1080},[1063,1660,1098],{"class":1097},[1063,1662,1101],{"class":1069},[1063,1664,1120],{"class":1080},[1063,1666,1667],{"class":1069}," { ",[1063,1669,1670],{"class":1076},"\"selector\"",[1063,1672,1053],{"class":1080},[1063,1674,1675],{"class":1097}," \"main h1 + div\"",[1063,1677,1678],{"class":1069}," }]",[1063,1680,1120],{"class":1080},[1063,1682,1683],{"class":1076}," \"type\"",[1063,1685,1053],{"class":1080},[1063,1687,1688],{"class":1097}," \"money\"",[1063,1690,1120],{"class":1080},[1063,1692,1693],{"class":1076}," \"locale\"",[1063,1695,1053],{"class":1080},[1063,1697,1698],{"class":1097}," \"tr\"",[1063,1700,1120],{"class":1080},[1063,1702,1703],{"class":1076}," \"currency\"",[1063,1705,1053],{"class":1080},[1063,1707,1708],{"class":1097}," \"TRY\"",[1063,1710,1165],{"class":1069},[1025,1712,1713,1714,1717,1718,1294],{},"reads ",[1037,1715,1716],{},"1.337,40 TL"," before and after the deploy, because the first candidate never depended on a class. A selector the picker would have refused, such as the hashed class itself, breaks on the first deploy. A field with only a structural candidate gets lint warning ",[1037,1719,808],{},[1025,1721,1722,1725,1726,1729,1730,1733,1734,1737,1738,1740,1741,1744],{},[1303,1723,1724],{},"Shadow DOM."," The app at ",[1037,1727,1728],{},"https:\u002F\u002Fapp.example.com"," renders each product as a ",[1037,1731,1732],{},"\u003Cproduct-card>"," custom element with its price inside the shadow root, and a deeper ",[1037,1735,1736],{},"\u003Cnested-host>"," two roots down. In a browser tier, ",[1037,1739,1582],{}," reads every card's price, and ",[1037,1742,1743],{},"nested-host >>> .inner-host >>> .deep-price"," crosses both boundaries. If the app ships its cards with closed shadow roots instead, the same selectors find nothing: no script can read a closed root.",[1025,1746,1747,1750,1751,1754,1755,1758,1759,1761,1762,1764,1765,1768,1769,1772],{},[1303,1748,1749],{},"Lists."," The shop's catalogue at ",[1037,1752,1753],{},"https:\u002F\u002Fshop.example.com\u002Fc\u002Fshoes"," prints forty ",[1037,1756,1757],{},".product-card"," items. Picking one price with select similar produces a list field with the item locator ",[1037,1760,1757],{},", a field locator ",[1037,1763,1574],{}," inside it, and a confidence of 1: every card has a price. When the shop ships a redesign, the cards become ",[1037,1766,1767],{},"article[data-testid=product]"," and the price ",[1037,1770,1771],{},"span[data-col=amount]","; a catalogue program that lists both survives it:",[1055,1774,1776],{"className":1057,"code":1775,"language":680,"meta":1059,"style":1059},"\"products\": {\n  \"candidates\": [{ \"selector\": \".product-card\" }, { \"testid\": \"product\" }],\n  \"many\": true,\n  \"fields\": {\n    \"price\": { \"candidates\": [{ \"selector\": \".price\" }, { \"selector\": \"[data-col=amount]\" }], \"type\": \"money\", \"locale\": \"tr\", \"currency\": \"TRY\" }\n  }\n}\n",[1037,1777,1778,1786,1818,1831,1841,1904,1909],{"__ignoreMap":1059},[1063,1779,1780,1783],{"class":1065,"line":1066},[1063,1781,1782],{"class":1097},"\"products\"",[1063,1784,1785],{"class":1069},": {\n",[1063,1787,1788,1790,1792,1794,1796,1798,1801,1803,1805,1807,1809,1811,1814,1816],{"class":1065,"line":1073},[1063,1789,1077],{"class":1076},[1063,1791,1053],{"class":1080},[1063,1793,1654],{"class":1069},[1063,1795,1670],{"class":1076},[1063,1797,1053],{"class":1080},[1063,1799,1800],{"class":1097}," \".product-card\"",[1063,1802,1101],{"class":1069},[1063,1804,1120],{"class":1080},[1063,1806,1667],{"class":1069},[1063,1808,1092],{"class":1076},[1063,1810,1053],{"class":1080},[1063,1812,1813],{"class":1097}," \"product\"",[1063,1815,1678],{"class":1069},[1063,1817,1104],{"class":1080},[1063,1819,1820,1823,1825,1829],{"class":1065,"line":1086},[1063,1821,1822],{"class":1076},"  \"many\"",[1063,1824,1053],{"class":1080},[1063,1826,1828],{"class":1827},"sHJIl"," true",[1063,1830,1104],{"class":1080},[1063,1832,1833,1836,1838],{"class":1065,"line":1107},[1063,1834,1835],{"class":1076},"  \"fields\"",[1063,1837,1053],{"class":1080},[1063,1839,1840],{"class":1069}," {\n",[1063,1842,1843,1846,1848,1850,1852,1854,1856,1858,1860,1863,1865,1867,1869,1871,1873,1876,1878,1880,1882,1884,1886,1888,1890,1892,1894,1896,1898,1900,1902],{"class":1065,"line":1135},[1063,1844,1845],{"class":1076},"    \"price\"",[1063,1847,1053],{"class":1080},[1063,1849,1667],{"class":1069},[1063,1851,1649],{"class":1076},[1063,1853,1053],{"class":1080},[1063,1855,1654],{"class":1069},[1063,1857,1670],{"class":1076},[1063,1859,1053],{"class":1080},[1063,1861,1862],{"class":1097}," \".price\"",[1063,1864,1101],{"class":1069},[1063,1866,1120],{"class":1080},[1063,1868,1667],{"class":1069},[1063,1870,1670],{"class":1076},[1063,1872,1053],{"class":1080},[1063,1874,1875],{"class":1097}," \"[data-col=amount]\"",[1063,1877,1678],{"class":1069},[1063,1879,1120],{"class":1080},[1063,1881,1683],{"class":1076},[1063,1883,1053],{"class":1080},[1063,1885,1688],{"class":1097},[1063,1887,1120],{"class":1080},[1063,1889,1693],{"class":1076},[1063,1891,1053],{"class":1080},[1063,1893,1698],{"class":1097},[1063,1895,1120],{"class":1080},[1063,1897,1703],{"class":1076},[1063,1899,1053],{"class":1080},[1063,1901,1708],{"class":1097},[1063,1903,1165],{"class":1069},[1063,1905,1906],{"class":1065,"line":1152},[1063,1907,1908],{"class":1069},"  }\n",[1063,1910,1911],{"class":1065,"line":1168},[1063,1912,1177],{"class":1069},[1029,1914,1916],{"id":1915},"pitfalls","Pitfalls",[1480,1918,1919,1925,1931,1939,1948],{},[1483,1920,1921,1924],{},[1303,1922,1923],{},"One candidate is a single point of failure."," Keep the list the picker gave you; it is what lets a job survive a redesign without healing.",[1483,1926,1927,1930],{},[1303,1928,1929],{},"Text locators follow the copy."," A button found by its label breaks when marketing renames it. Prefer a role and name, which survive restyling, or a test id.",[1483,1932,1933,1938],{},[1303,1934,1935,1937],{},[1037,1936,1262],{}," hides ambiguity."," It makes a non-unique locator pass today and silently picks the wrong element tomorrow. Use it only when position is what you mean.",[1483,1940,1941,1947],{},[1303,1942,1943,1946],{},[1037,1944,1945],{},">>>"," is needed to cross a shadow root inside a selector."," A plain descendant selector stops at the boundary.",[1483,1949,1950,1953],{},[1303,1951,1952],{},"The http tier sees the server's HTML."," An element added by JavaScript exists only in a browser tier; a locator that works in the builder's live browser may find nothing at http.",[1029,1955,155],{"id":1956},"reference",[1480,1958,1959,1967,1976,1980],{},[1483,1960,1961,1547,1964],{},[1291,1962,638],{"href":1963},"\u002Freference\u002Fdsl\u002Ftargets",[1291,1965,725],{"href":1966},"\u002Freference\u002Fdsl\u002Ffields\u002Fselector",[1483,1968,1969,1972,1973],{},[1291,1970,1971],{"href":761},"Lint",", including ",[1291,1974,808],{"href":1975},"\u002Freference\u002Fdsl\u002Flint\u002Fw002",[1483,1977,1978],{},[1291,1979,143],{"href":1604},[1483,1981,1982],{},[1291,1983,47],{"href":1984},"\u002Fconcepts\u002Fself-healing",[1986,1987,1988],"style",{},"html pre.shiki code .sTzsn, html code.shiki .sTzsn{--shiki-light:var(--kaab-code-foreground);--shiki-default:var(--kaab-code-foreground);--shiki-dark:var(--kaab-code-foreground)}html pre.shiki code .sqn18, html code.shiki .sqn18{--shiki-light:var(--kaab-code-token-keyword);--shiki-default:var(--kaab-code-token-keyword);--shiki-dark:var(--kaab-code-token-keyword)}html pre.shiki code .sQm2-, html code.shiki .sQm2-{--shiki-light:var(--kaab-code-token-punctuation);--shiki-default:var(--kaab-code-token-punctuation);--shiki-dark:var(--kaab-code-token-punctuation)}html pre.shiki code .suOy4, html code.shiki .suOy4{--shiki-light:var(--kaab-code-token-string-expression);--shiki-default:var(--kaab-code-token-string-expression);--shiki-dark:var(--kaab-code-token-string-expression)}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHJIl, html code.shiki .sHJIl{--shiki-light:var(--kaab-code-token-constant);--shiki-default:var(--kaab-code-token-constant);--shiki-dark:var(--kaab-code-token-constant)}",{"title":1059,"searchDepth":1086,"depth":1086,"links":1990},[1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001],{"id":1031,"depth":1073,"text":1032},{"id":1046,"depth":1073,"text":1047},{"id":1297,"depth":1073,"text":1298},{"id":1323,"depth":1073,"text":1324},{"id":1474,"depth":1073,"text":1475},{"id":1558,"depth":1073,"text":1559},{"id":1586,"depth":1073,"text":1587},{"id":1593,"depth":1073,"text":1594},{"id":1608,"depth":1073,"text":1609},{"id":1915,"depth":1073,"text":1916},{"id":1956,"depth":1073,"text":155},false,null,"How Kaabist points at an element, why it stores several candidate selectors, which classes it refuses to use, and how frames and shadow DOM are reached.","md",{},true,"\u002Fconcepts\u002Flocators",{"title":62,"description":2004},"2.concepts\u002F12.locators","NIuzNUycTYfMoucILNnpeLaZd6Z7-wyscO1kcbfpApw",[2013,2017],{"title":59,"path":2014,"stem":2015,"description":2016,"children":-1},"\u002Fconcepts\u002Flimits","2.concepts\u002F11.limits","Request rates, concurrent jobs, test-mode quotas, per-job budgets and plan gates: every limit Kaabist applies, and the error each one answers with.",{"title":65,"path":2018,"stem":2019,"description":2020,"children":-1},"\u002Fconcepts\u002Fsnapshots","2.concepts\u002F13.snapshots","What Kaabist stores for each step of a job, what it deliberately leaves out, how to fetch a step's snapshot, and how to replay a program against one.",1793593413151]