select_dropdown does not handle readonly inputs backed by clickable native listboxes
Problem
Some web forms expose a read-only text input as the visible control while the actual options live in a separate native listbox:
<input id="lookup-code" readonly onclick="picker.style.display='block'; picker.focus()">
<select id="picker" size="8" style="display:none"
onclick="document.querySelector('#lookup-code').value=this.value; this.style.display='none'"
onblur="this.style.display='none'">
<option value="v0">Choice 0</option>
<option value="v1">Choice 1</option>
</select>
The input cannot accept typed values. The page expects the user to click the input, click a native option, and let the page's own handlers update the visible field and dependent state.
The existing dropdown flow did not cover this structure because the visible target is an INPUT, while the hidden <select> is separate. The programmatic value-setting path can change the native value without running the page's click callback, or the page framework can revert the change.
Proposed improvement
When dropdown_options sees a read-only text-like input, detect an associated native single-select listbox only when the relationship is explicit through aria-controls, aria-owns, or a verified opener reference. Then let select_dropdown automatically click the input when needed, click the requested option, and verify the read-only field value.
Ordinary text inputs, ordinary <select> controls, unrelated read-only fields, and ambiguous relationships should retain their existing behavior.
Why this improves the flow
This keeps the existing dropdown_options and select_dropdown interface while following the component's actual interaction contract. It preserves framework and business callbacks without changing the behavior of unrelated controls.
Regression coverage
The browser fixture and tests cover hidden pickers, callback-driven read-only field updates, onclick/aria-controls/aria-owns relationships, discovery without opening or mutating the picker, ordinary text inputs, ordinary native selects, stale and ambiguous associations, disabled/hidden/inert/covered options, and same-frame/iframe/cross-frame cases.
Source: browser-use/browser-use