Our marketing features page had 63 rows. Every one opened its detail popup through a plain onclick, and none of them had an href.
<tr onclick="featurePopUpShow('/popups/feature-info?section=Main&category=Features&pagename=Mobile%20Home%20Page', 650)" class="featureRow">Sixty-one distinct feature detail pages sat behind those rows, and a crawler had no link to follow to any of them.
The change
We wrapped the feature name in a real anchor pointing at the same popup URL and left the row’s own click behavior untouched. The anchor’s click handler cancels the default navigation and stops the click from also reaching the row underneath it. A person sees no difference, and a crawler gets a real link to walk. The core of the first pass, with names simplified:
this.TagAdd("a", cell, {href: popupHref, cssclass: "featureNameLink", onclick: "event.preventDefault();event.stopPropagation();" + onclickParam + ";return false;"}, featureName);Both the prevented default and the stopped propagation were there from the first edit. There was no earlier version missing one of them.
What the first session said it couldn’t check
The session that wrote this had no browser automation, only Bash and file tools. So it verified the only way it could: curl requests, before and after, counting exactly what changed.
Before, against production with a crawler’s user agent, the page had zero heading tags, zero real links to the popup content, 63 onclick-only rows and 327 visible words. After, against the working branch on a local dev host, it had one <h1>, seven <h2> group headers, 63 real href attributes pointing at the 61 individually reachable detail pages, and 390 visible words.
Every one of those numbers was a real, checked fact. None of them said whether a person clicking a feature name would still see the popup and nothing else. That question needs a browser actually clicking something, and this session didn’t have one. It said so in its own report and named the one test still missing: a live click-test on the branch before shipping. It stopped there. It did not round “the markup is right” up to “this works.”
What the second session ran
A separate session picked up that recommendation and ran it in a real browser against the local dev copy. It made eight checks, each against an observed value:
- Click the feature name anchor. Record the URL before and after. It must not change.
- Click elsewhere in the same row, off the anchor. Same popup, same content.
- Repeat both on a row in a different feature group, to rule out a per-group difference.
- Confirm the popup closes normally afterward.
- Read the console for the entire sequence.
- Screenshot the feature name: plain text, and no visible link.
- Screenshot the seven group headers for layout defects now that they render as real headings.
- Load a second page that shares the same underlying component and confirm it still renders correctly, with exactly one heading of its own.
The URL never changed across any click. The console carried only a pre-existing, unrelated deprecation notice that fired identically before the change. The feature name rendered as plain gray text with no underline, matching its surroundings exactly. All seven headers rendered clean. The second page, sharing the same code, still worked. Only after all eight came back with real values did the change move toward shipping.
The compile step
Before anything went out, the styling reference still pointed at the uncompiled source file, since this codebase compiles CSS at release time only. That had to run through the repo’s own compile step and get repointed at a dated, minified bundle. Then we checked again with the same curl counts as before: one heading, seven group headers, sixty-three real links. A compile step changes bytes, and the only way to know it didn’t change behavior is to check again.
The fix shipped the same day and was confirmed live with the same numbers it had in review. What made it trustworthy was that the session without a browser reported what it couldn’t check, and a clean set of curl numbers never stood in for a click nobody had made.
Clean measurements show what the markup contains. Whether the page still behaves for a person using it takes someone clicking.