Ruby Watir操作md-select下拉框无法修改选中项问题求助
解决思路
该报错核心是元素已在DOM中被定位,但实际处于不可交互状态,可以按以下优先级排查解决:
1. 先等待元素达到可交互状态再执行点击
Watir默认点击前会做状态校验,直接定位就点击容易因为AngularJS还在渲染组件导致状态校验不通过超时,调整代码为:
# 先等待下拉组件存在、启用、可见 select_element = browser.element(id: 'active-data-select') select_element.wait_until(timeout: 10, &:present?) select_element.wait_until(timeout: 10, &:enabled?) select_element.click
2. 滚动元素到视口后再点击
如果下拉组件不在当前可视区域,真实点击会触发校验失败,先滚动再操作:
select_element = browser.element(id: 'active-data-select') select_element.scroll.to :center select_element.wait_until(&:interactable?).click
3. 用JS原生点击绕过前端交互校验
如果组件被CSS遮罩、或者有渲染层重叠导致模拟点击被拦截,可以用执行JS的方式直接触发点击事件:
select_element = browser.element(id: 'active-data-select') browser.execute_script("arguments[0].click();", select_element.wd)
4. 下拉展开后的选值逻辑
点击下拉后需要等待选项容器渲染完成再选择对应值,示例代码如下:
# 展开下拉 select_element = browser.element(id: 'active-data-select') browser.execute_script("arguments[0].click();", select_element.wd) # 等待选项列表可见 option_container = browser.element(id: 'select_listbox_10') option_container.wait_until(timeout: 5, &:visible?) # 选择第二个选项My test data 2 browser.element(id: 'select_option_15').click # 如果选项id是动态生成的,也可以通过文本匹配选择 browser.element(xpath: "//md-option[contains(.,'My test data 2')]").click
额外排查点
- 确认本地Chrome浏览器的大版本和ChromeDriver 94完全匹配,跨版本会出现元素交互异常
- 检查
md-select是否位于iframe内,如果是需要先调用browser.iframe.switch_to!切换到对应iframe再操作元素 - 如果页面有全局加载遮罩,需要先等待遮罩消失再操作下拉组件
内容的提问来源于stack exchange,提问作者Andrey
相关产品推荐
相关产品推荐

