Python-Selenium:输入值后无法选择自动生成的下拉菜单选项
解决Selenium无法操作AJAX自动补全下拉框的问题
问题原因
你遇到的UnexpectedTagNameException是因为**Select类仅支持HTML原生的<select>标签**,但你要操作的是一个<input>类型的搜索自动补全框(从HTML的data-completer="AJAXTableCompleter"和role="combobox"能看出,这是ServiceNow风格的AJAX动态生成下拉菜单),所以不能用Select来处理。
解决方案
这类自定义下拉框的处理逻辑是:输入关键词触发下拉加载 → 等待下拉菜单可见 → 定位并点击目标选项。
修改后的代码
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 定位输入框并输入关键词 input_box = driver.find_element(By.CSS_SELECTOR, '#sys_display.sn_vul_vulnerable_item.cmdb_ci') input_box.clear() input_box.send_keys("server_name") # 等待自动补全下拉容器加载并可见(对应HTML中aria-owns属性指定的ID) wait = WebDriverWait(driver, 10) dropdown_menu = wait.until(EC.visibility_of_element_located((By.ID, 'AC.sn_vul_vulnerable_item.cmdb_ci'))) # 定位并点击目标选项(精确匹配文本) target_option = wait.until(EC.element_to_be_clickable( (By.XPATH, '//*[@id="AC.sn_vul_vulnerable_item.cmdb_ci"]//*[text()="server_name"]') )) target_option.click()
补充说明
- 模糊匹配选项:如果选项文本不是完全和输入值一致,可以用
contains来模糊定位://*[@id="AC.sn_vul_vulnerable_item.cmdb_ci"]//*[contains(text(), "server_name")] - 按属性定位:部分ServiceNow的补全选项会带有
data-value或data-id属性,也可以用CSS选择器直接定位:target_option = wait.until(EC.element_to_be_clickable( (By.CSS_SELECTOR, '#AC.sn_vul_vulnerable_item.cmdb_ci .ac_item[data-value="你的服务器ID"]') )) - 等待策略:用
visibility_of_element_located确保下拉菜单完全可见,element_to_be_clickable确保选项可以点击,避免因元素未加载完成导致的点击失败。
内容的提问来源于stack exchange,提问作者Limprevisible
相关产品推荐
相关产品推荐

