UnexpectedTagNameException: Select 仅适用于 <select> 元素,不适用于使用 Selenium 和 Python 选择下拉值的“<form>”错误

UnexpectedTagNameException: Select only works on <select> elements, not on "<form>" error selecting a drop-down value using Selenium and Python

我正在尝试 select 使用 Python

使用 Selenium 从这个下拉列表中选择一个选项

<div class="form-group mt-2 mb-3 p-3">
                            <form id="did_atd_provide_pnc">
                                <fieldset>
                                    <label for="did_atd_provide_pnc">Did ATD Consultants provide a Plan & Cost review for
                                        this project*?</label>
                                    <select class="form-control form-control-sm required-field atd_provided_dropdown" id="did_atd_provide_pnc"
                                            name="did_atd_provide_pnc" data-error-name="Did ATD Provide P&C">
                                        <option value="">-----</option>
                                        <option value="Yes">Yes</option>
                                        <option value="No">No</option>
                                    </select>
                                </fieldset>
                            </form>
                        </div>

我正在写这段代码

select = Select(driver.find_element_by_id('did_atd_provide_pnc'))
select.select_by_visible_text('No')

但是我收到这个错误

UnexpectedTagNameException: Select only works on <select> elements, not on "<form>"

有没有其他解决方案我可以用任何其他可靠的解决方案来测试这个案例?

你已经足够接近了。然而,通过 find_element_by_id('did_atd_provide_pnc') 识别的第一个元素是 <form> 标签,而您想要的元素是 <select> 标签。

因此,Select() 会抛出 <form> 元素的错误:

UnexpectedTagNameException: Select only works on <select> elements, not on "<form>"

解决方案

To select <option> with text as No you need to induce for the element_to_be_clickable() and you can use the following based :

  • 使用 xpathselect_by_visible_text():

    Select(WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//select[@id='did_atd_provide_pnc' and @name='did_atd_provide_pnc']")))).select_by_visible_text("No")
    
  • 使用 xpath select_by_value():

    Select(WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//select[@id='did_atd_provide_pnc' and @name='did_atd_provide_pnc']")))).select_by_value("No")
    
  • 注意:您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

参考资料

您可以在以下位置找到一些相关的详细讨论: