{"record":{"id":"ed642f75cc0ea12c","repo":"xpzouying/xiaohongshu-mcp","slug":"error-ed642f","errorCode":null,"errorMessage":"元素无可点击区域","messagePattern":"元素无可点击区域","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"humanize/input.go","lineNumber":111,"sourceCode":"\t}\n\n\tDelay(elem.Page().GetContext(), PointerSettle)\n\n\tif err := elem.WaitEnabled(); err != nil {\n\t\treturn err\n\t}\n\n\treturn pressAndRelease(mouse)\n}\n\n// ClickNoWait 跳过 WaitInteractable 的遮挡重试，用于它会误判而死等的场景。\nfunc ClickNoWait(elem *rod.Element) error {\n\tshape, err := elem.Shape()\n\tif err != nil {\n\t\treturn err\n\t}\n\tif len(shape.Quads) == 0 {\n\t\treturn errors.New(\"元素无可点击区域\")\n\t}\n\n\tq := shape.Quads[0]\n\tcenter := proto.Point{X: (q[0] + q[4]) / 2, Y: (q[1] + q[5]) / 2}\n\n\ttarget := jitterInQuad(center, q)\n\tif err := ensureClickable(elem, target); err != nil {\n\t\treturn err\n\t}\n\n\tmouse := elem.Page().Mouse\n\tif err := moveMouseCurved(mouse, target); err != nil {\n\t\treturn err\n\t}\n\treturn pressAndRelease(mouse)\n}\n\nfunc MoveTo(page *rod.Page, pt proto.Point) error {","sourceCodeStart":93,"sourceCodeEnd":129,"githubUrl":"https://github.com/xpzouying/xiaohongshu-mcp/blob/332d196854a9eac0d2b8c2c0e3d0cc43139d724c/humanize/input.go#L93-L129","documentation":"Raised in ClickNoWait (humanize/input.go:111) when elem.Shape() returns a shape with zero quads, meaning the browser reports no clickable geometry for the element. Without a quad there is no area to compute a center point or jitter target for the humanized mouse move/click.","triggerScenarios":"Calling humanize.ClickNoWait on an element that is display:none, detached from the DOM, or has zero-size layout — Shape() then yields len(shape.Quads)==0 and the error is returned.","commonSituations":"Clicking elements before the page finished layout; stale element handles after SPA re-render; clicking hidden inputs or elements with display:none used purely as data holders.","solutions":["Wait for the element to be visible/laid out (rod WaitVisible / page.WaitStable) before calling ClickNoWait","Re-acquire the element handle if the DOM was re-rendered","Use humanize.Click (which waits for interactability) instead of ClickNoWait for elements that may not be ready","Check the element is not display:none / zero-size; pick a visible parent or sibling trigger instead"],"exampleFix":"// before\nel, _ := page.Element(\"#go\")\nerr := humanize.ClickNoWait(el)\n// after\nel := page.MustWaitVisible(\"#go\")\nerr := humanize.Click(el) // waits for interactability internally","handlingStrategy":"validation","validationCode":"shape, err := elem.Shape()\nif err == nil && len(shape.Quads) > 0 { /* clickable area exists */ }","typeGuard":"func hasClickArea(elem *rod.Element) bool {\n    s, err := elem.Shape()\n    return err == nil && len(s.Quads) > 0\n}","tryCatchPattern":"if err := humanize.ClickNoWait(el); err != nil {\n    if strings.Contains(err.Error(), \"无可点击区域\") {\n        el = page.MustElement(selector) // re-acquire and retry\n    }\n    return err\n}","preventionTips":["Prefer humanize.Click over ClickNoWait when readiness is uncertain","Verify element is not display:none or zero-size","Refresh element handles after DOM mutations"],"tags":["dom","geometry","go-rod","humanize"],"backgroundTag":"element-not-clickable","analyzedSha":"332d196854a9eac0d2b8c2c0e3d0cc43139d724c","analyzedAt":"2026-09-05T22:22:55.988Z","contentChangedAt":"2026-09-05T22:22:55.988Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}