[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M78GEYWZPDFSZPFZ2VYV7GRD":3,"skill-same:01M78GEYWZPDFSZPFZ2VYV7GRD":51},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":28,"commitSha":29,"skillDirectory":30,"forksCount":31,"repositoryHtmlUrl":32,"repositoryHomepageUrl":6,"ownerHtmlUrl":33,"ownerBlogUrl":34,"ownerDescription":35,"updatedAt":36,"install":37,"resources":50},"01M78GEYWZPDFSZPFZ2VYV7GRD","se-locator-strategist",null,"Recommends and repairs Selenium locator strategy — replaces brittle absolute XPath with By.id, By.cssSelector, or Selenium 4 relative locators, and explains the trade-offs. Use when an SDET says \"this XPath keeps breaking\", \"make this locator more stable\", \"why is my locator flaky\", \"convert this XPath to CSS\", or pastes selectors to harden. Produces proposals the engineer must verify in the DOM.","PramodDutta\u002Fskillmasterclass","PramodDutta","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F1409610?v=4","01M78G6P6117ADPGFVHSBGTRE6","Promode","01M78G6P6MJD4FF669N45VMYBE",4,"MIT","https:\u002F\u002Fgithub.com\u002FPramodDutta\u002Fskillmasterclass\u002Fblob\u002Fmain\u002Fskillmasterclass\u002Fskills\u002Fframework-packs\u002Fselenium-pack\u002Fse-locator-strategist\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\nname: se-locator-strategist\ndescription: >-\n  Recommends and repairs Selenium locator strategy — replaces brittle absolute\n  XPath with By.id, By.cssSelector, or Selenium 4 relative locators, and explains\n  the trade-offs. Use when an SDET says \"this XPath keeps breaking\", \"make this\n  locator more stable\", \"why is my locator flaky\", \"convert this XPath to CSS\", or\n  pastes selectors to harden. Produces proposals the engineer must verify in the DOM.\nlicense: MIT\nmetadata:\n  author: TheTestingAcademy\n  pack: selenium\n  version: 1.0.0\n---\n\n# Selenium Locator Strategist\n\nYou **recommend and repair locators** — turning brittle, position-based selectors\ninto stable, intention-revealing ones. Every proposed locator is a hypothesis until\nthe engineer confirms it against the live DOM.\n\n## When to use\n- A locator is flaky, breaks on layout changes, or uses absolute XPath (`\u002Fhtml\u002Fbody\u002Fdiv[3]\u002F...`).\n- Someone asks \"what's the most stable locator for this element\" or \"convert this XPath to CSS\".\n- A page's markup is pasted and locators need designing from scratch.\n\n## Workflow\n1. **Inspect the target markup** (paste or DOM snippet). Identify attributes that\n   are stable: `id`, `data-*`, `name`, ARIA roles, unique text.\n2. **Apply the priority ladder**: `By.id` → `By.cssSelector` (attribute\u002Fdata-test) →\n   `By.name` → relative locators (`with(By.tagName(\"input\")).below(label)`) →\n   *last resort* a short, attribute-anchored relative XPath. Reject absolute XPath.\n3. **Rewrite the brittle locator** and show old vs new side by side.\n4. **Explain the trade-off** for each: uniqueness, resilience to DOM shifts,\n   readability, and speed. Note when CSS can't do it (e.g. text match → XPath).\n5. **Flag risk**: if no stable hook exists, recommend the dev add a `data-testid`\n   rather than inventing a fragile selector.\n6. **Emit** the ranked recommendation and mark any locator you couldn't verify.\n\n## Output shape\n```java\n\u002F\u002F BEFORE — brittle, position-coupled absolute XPath (breaks on any layout change)\nBy old = By.xpath(\"\u002Fhtml\u002Fbody\u002Fdiv[2]\u002Fdiv[3]\u002Fform\u002Fbutton[1]\");\n\n\u002F\u002F AFTER — ranked, stable alternatives (verify against the live DOM before use)\nBy best  = By.id(\"checkout-submit\");                         \u002F\u002F 1st choice: unique id\nBy good  = By.cssSelector(\"button[data-test='place-order']\");\u002F\u002F 2nd: data-* attribute hook\nBy ok    = By.cssSelector(\"form.checkout > button.primary\"); \u002F\u002F 3rd: scoped CSS\n\u002F\u002F Text\u002Frelationship match (needs XPath or relative locator):\nBy byText = By.xpath(\"\u002F\u002Fbutton[normalize-space()='Place Order']\");\nWebElement rel = driver.findElement(with(By.tagName(\"button\")).below(By.id(\"total\")));\n```\n\n## Guardrails\n- These are **proposals the engineer must verify in the DOM** — an unconfirmed selector may match zero or many elements.\n- **Never assume an attribute exists** (`id`, `data-testid`); if the pasted markup doesn't show it, say so and don't fabricate one.\n- No absolute XPath and no index-chained selectors as a primary strategy.\n- Don't rely on volatile values — generated class hashes, framework-injected ids, ordinal positions.\n- When there is no stable hook, recommend adding a test attribute rather than shipping a fragile locator.\n- Always explain the trade-off; a recommendation without reasoning is not actionable.\n","# Selenium Locator Strategist\n\nYou **recommend and repair locators** — turning brittle, position-based selectors\ninto stable, intention-revealing ones. Every proposed locator is a hypothesis until\nthe engineer confirms it against the live DOM.\n\n## When to use\n- A locator is flaky, breaks on layout changes, or uses absolute XPath (`\u002Fhtml\u002Fbody\u002Fdiv[3]\u002F...`).\n- Someone asks \"what's the most stable locator for this element\" or \"convert this XPath to CSS\".\n- A page's markup is pasted and locators need designing from scratch.\n\n## Workflow\n1. **Inspect the target markup** (paste or DOM snippet). Identify attributes that\n   are stable: `id`, `data-*`, `name`, ARIA roles, unique text.\n2. **Apply the priority ladder**: `By.id` → `By.cssSelector` (attribute\u002Fdata-test) →\n   `By.name` → relative locators (`with(By.tagName(\"input\")).below(label)`) →\n   *last resort* a short, attribute-anchored relative XPath. Reject absolute XPath.\n3. **Rewrite the brittle locator** and show old vs new side by side.\n4. **Explain the trade-off** for each: uniqueness, resilience to DOM shifts,\n   readability, and speed. Note when CSS can't do it (e.g. text match → XPath).\n5. **Flag risk**: if no stable hook exists, recommend the dev add a `data-testid`\n   rather than inventing a fragile selector.\n6. **Emit** the ranked recommendation and mark any locator you couldn't verify.\n\n## Output shape\n```java\n\u002F\u002F BEFORE — brittle, position-coupled absolute XPath (breaks on any layout change)\nBy old = By.xpath(\"\u002Fhtml\u002Fbody\u002Fdiv[2]\u002Fdiv[3]\u002Fform\u002Fbutton[1]\");\n\n\u002F\u002F AFTER — ranked, stable alternatives (verify against the live DOM before use)\nBy best  = By.id(\"checkout-submit\");                         \u002F\u002F 1st choice: unique id\nBy good  = By.cssSelector(\"button[data-test='place-order']\");\u002F\u002F 2nd: data-* attribute hook\nBy ok    = By.cssSelector(\"form.checkout > button.primary\"); \u002F\u002F 3rd: scoped CSS\n\u002F\u002F Text\u002Frelationship match (needs XPath or relative locator):\nBy byText = By.xpath(\"\u002F\u002Fbutton[normalize-space()='Place Order']\");\nWebElement rel = driver.findElement(with(By.tagName(\"button\")).below(By.id(\"total\")));\n```\n\n## Guardrails\n- These are **proposals the engineer must verify in the DOM** — an unconfirmed selector may match zero or many elements.\n- **Never assume an attribute exists** (`id`, `data-testid`); if the pasted markup doesn't show it, say so and don't fabricate one.\n- No absolute XPath and no index-chained selectors as a primary strategy.\n- Don't rely on volatile values — generated class hashes, framework-injected ids, ordinal positions.\n- When there is no stable hook, recommend adding a test attribute rather than shipping a fragile locator.\n- Always explain the trade-off; a recommendation without reasoning is not actionable.\n",{"name":5,"license":15,"metadata":24,"description":7},{"pack":25,"author":26,"version":27},"selenium","TheTestingAcademy","1.0.0","main","d8c5108d5ae524b10a5a1c695cdee8cfc018be7b","skillmasterclass\u002Fskills\u002Fframework-packs\u002Fselenium-pack\u002Fse-locator-strategist",8,"https:\u002F\u002Fgithub.com\u002FPramodDutta\u002Fskillmasterclass","https:\u002F\u002Fgithub.com\u002FPramodDutta","https:\u002F\u002Fscrolltest.com","Blogger at http:\u002F\u002Fscrolltest.com , Youtuber - https:\u002F\u002Fwww.youtube.com\u002Fc\u002FItsTechMode ","2026-07-15 00:36:00",{"source":8,"skillName":5,"commands":38,"prompt":48,"zipAvailable":49},[39,42,45],{"tool":40,"command":41},"npx","npx skills add PramodDutta\u002Fskillmasterclass --skill se-locator-strategist",{"tool":43,"command":44},"bunx","bunx skills add PramodDutta\u002Fskillmasterclass --skill se-locator-strategist",{"tool":46,"command":47},"pnpm","pnpm dlx skills add PramodDutta\u002Fskillmasterclass --skill se-locator-strategist","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FPramodDutta\u002Fskillmasterclass\u002Fblob\u002Fmain\u002Fskillmasterclass\u002Fskills\u002Fframework-packs\u002Fselenium-pack\u002Fse-locator-strategist\u002FSKILL.md",true,[],[52,59,66,73,80,87],{"skillNo":53,"name":54,"nameZh":6,"description":55,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":56,"categories":57,"keywords":58,"publishedAt":19},"01M78GFBQAXS855299M20HQGYV","se-wait-fixer","Scans Selenium Java code for Thread.sleep and for implicit+explicit wait mixing, then replaces them with WebDriverWait\u002FExpectedConditions or FluentWait to fix synchronization. Use when an SDET says \"remove Thread.sleep from my tests\", \"fix the flaky waits\", \"my implicit and explicit waits conflict\", or pastes code full of hard sleeps. Produces refactors the engineer must run and confirm.","https:\u002F\u002Fgithub.com\u002FPramodDutta\u002Fskillmasterclass\u002Fblob\u002Fmain\u002Fskillmasterclass\u002Fskills\u002Fframework-packs\u002Fselenium-pack\u002Fse-wait-fixer\u002FSKILL.md",[],[],{"skillNo":60,"name":61,"nameZh":6,"description":62,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":63,"categories":64,"keywords":65,"publishedAt":19},"01M78GF8WPMW41VPA7RS4SHK80","se-test-generator","Generates a runnable Selenium 4 + TestNG test in Java from a plain-language scenario, using explicit waits and stable locators. Use when an SDET says \"write a Selenium test for login\", \"generate a TestNG test for the checkout flow\", \"automate this scenario in Selenium\", or pastes Gherkin\u002Fsteps and wants Java WebDriver code. Produces a draft test the engineer must review and run.","https:\u002F\u002Fgithub.com\u002FPramodDutta\u002Fskillmasterclass\u002Fblob\u002Fmain\u002Fskillmasterclass\u002Fskills\u002Fframework-packs\u002Fselenium-pack\u002Fse-test-generator\u002FSKILL.md",[],[],{"skillNo":67,"name":68,"nameZh":6,"description":69,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":70,"categories":71,"keywords":72,"publishedAt":19},"01M78GF5X9HP46NT4B3Q993EXP","se-report-integrator","Integrates reporting (Allure or ExtentReports) into a Selenium + TestNG suite with listeners, screenshot-on-failure, and step logging. Use when an SDET says \"add Allure to my tests\", \"set up ExtentReports\", \"capture a screenshot on failure\", \"add a TestNG listener for reporting\", or wants readable run reports. Produces listener and config code the engineer must run to generate a report.","https:\u002F\u002Fgithub.com\u002FPramodDutta\u002Fskillmasterclass\u002Fblob\u002Fmain\u002Fskillmasterclass\u002Fskills\u002Fframework-packs\u002Fselenium-pack\u002Fse-report-integrator\u002FSKILL.md",[],[],{"skillNo":74,"name":75,"nameZh":6,"description":76,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":77,"categories":78,"keywords":79,"publishedAt":19},"01M78GF31BMJCFXTF7CKY8TGV0","se-page-object-builder","Builds a Page Object Model class in Java (PageFactory @FindBy or explicit locators) with action methods and a WebDriverWait for a given page. Use when an SDET says \"create a page object for the login page\", \"build a POM class\", \"refactor these locators into a page object\", or pastes a page's fields and wants a reusable POM. Produces a draft class the engineer must review and run.","https:\u002F\u002Fgithub.com\u002FPramodDutta\u002Fskillmasterclass\u002Fblob\u002Fmain\u002Fskillmasterclass\u002Fskills\u002Fframework-packs\u002Fselenium-pack\u002Fse-page-object-builder\u002FSKILL.md",[],[],{"skillNo":81,"name":82,"nameZh":6,"description":83,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":84,"categories":85,"keywords":86,"publishedAt":19},"01M78GEV918RERKZ0ZDY5RRF57","se-grid-configurator","Configures Selenium Grid 4 (hub-and-node or standalone, including Docker) and wires RemoteWebDriver for parallel and distributed runs. Use when an SDET says \"set up Selenium Grid\", \"run my tests on a remote grid\", \"dockerize Selenium Grid 4\", \"point my tests at RemoteWebDriver\", or wants parallel execution across nodes. Produces config and code the engineer must run and validate in their environment.","https:\u002F\u002Fgithub.com\u002FPramodDutta\u002Fskillmasterclass\u002Fblob\u002Fmain\u002Fskillmasterclass\u002Fskills\u002Fframework-packs\u002Fselenium-pack\u002Fse-grid-configurator\u002FSKILL.md",[],[],{"skillNo":88,"name":89,"nameZh":6,"description":90,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":91,"categories":92,"keywords":93,"publishedAt":19},"01M78GER91SJKSC4J6G2HCPZXB","se-framework-scaffolder","Scaffolds a Maven Selenium framework — TestNG suite, base test, Page Object package, config loader, logging, and reporting hooks. Use when an SDET says \"scaffold a Selenium framework\", \"set up a new Maven Selenium project\", \"give me a POM\u002FTestNG project structure\", or is starting automation from zero. Produces a starter layout and files the engineer must build, run, and adapt.","https:\u002F\u002Fgithub.com\u002FPramodDutta\u002Fskillmasterclass\u002Fblob\u002Fmain\u002Fskillmasterclass\u002Fskills\u002Fframework-packs\u002Fselenium-pack\u002Fse-framework-scaffolder\u002FSKILL.md",[],[]]