* Get element labels (from selectorUtils.ts lines 115-131)
(element)
| 219 | * Get element labels (from selectorUtils.ts lines 115-131) |
| 220 | */ |
| 221 | function getElementLabels(element) { |
| 222 | // Check aria-labelledby first |
| 223 | const labelledBy = element.getAttribute('aria-labelledby'); |
| 224 | if (labelledBy) { |
| 225 | const ids = labelledBy.split(' ').filter(id => id); |
| 226 | const labels = ids.map(id => document.getElementById(id)).filter(el => el); |
| 227 | if (labels.length) |
| 228 | return labels.map(label => elementText(label)); |
| 229 | } |
| 230 | |
| 231 | // Check aria-label |
| 232 | const ariaLabel = element.getAttribute('aria-label'); |
| 233 | if (ariaLabel && ariaLabel.trim()) |
| 234 | return [{ full: ariaLabel, normalized: normalizeWhiteSpace(ariaLabel), immediate: [ariaLabel] }]; |
| 235 | |
| 236 | // Check HTML labels for form elements |
| 237 | const isNonHiddenInput = element.nodeName === 'INPUT' && element.type !== 'hidden'; |
| 238 | if (['BUTTON', 'METER', 'OUTPUT', 'PROGRESS', 'SELECT', 'TEXTAREA'].includes(element.nodeName) || isNonHiddenInput) { |
| 239 | const labels = element.labels; |
| 240 | if (labels && labels.length) |
| 241 | return [...labels].map(label => elementText(label)); |
| 242 | } |
| 243 | |
| 244 | return []; |
| 245 | } |
| 246 | |
| 247 | /** |
| 248 | * Get accessible name for element (simplified from roleUtils.ts lines 504-528) |
no test coverage detected