UnexpectedTagNameException:消息:选择仅适用于元素,而不适用于使用Selenium和Python单击下拉菜单项时的跨度错误

问题描述 投票:1回答:2

我正在尝试让Python / Selenium正确单击下拉菜单并选择“ IT”,但我能做的最好的事情就是找到该元素,并收到一条错误消息,指出我无法在找到的内容上输入文本。

基本上,用户将单击该菜单并选择IT或键入IT并按Enter。

HTML代码:

<div class="form-group">

        <label class="col-md-3 control-label" for="id_tenant_group">Tenant group</label>
        <div class="col-md-9">
            <select name="tenant_group" nullable="true" class="netbox-select2-api form-control" data-url="/api/tenancy/tenant-groups/" data-filter-for-tenant="group_id" placeholder="None" id="id_tenant_group">
  <option value="" selected>---------</option>

  <option value="2">IT</option>

  <option value="1">OT</option>

</select>



        </div>

[当我检查该元素时,我看到有一个span元素触发了一个事件,该事件显示了另一个可以最终看到我的选择的span。

我无法通过可见文本进行选择,因为其他菜单也包含相同的“ ---------”可见文本。

我已捕获了几个屏幕快照以说明问题,希望能有所帮助。html codebrowser inspect

老实说,我真的迷失了,任何建议将不胜感激。

编辑:我尝试了以下操作:

tenant_g_element = Select(browser.find_element(By.XPATH, '//span[@id="select2-id_tenant_group-container"]'))
tenant_g_element.selectByVisibleText("IT")

但是我遇到以下错误:

selenium.common.exceptions.UnexpectedTagNameException: Message: Select only works on <select> elements, not on span
python selenium select xpath css-selectors
2个回答
0
投票

您的第一行是错误的。应该是这样的:

tenant_g_element = Select(browser.find_element(By.ID, 'id_tenant_group'))

因为您的属性为id =“ id_tenant_group”。无需使用By.XPATH ...如果您出于某些原因需要使用By.XPATH,则需要查找如何指定XPATH(请注意// span将查找,而不是例如


0
投票

您的Xpath似乎不正确。您试图找到一个跨度tag,但是您应该找到select元素。另外,您应该应用webdriver等待select元素

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


select = WebDriverWait(driver, 50).until(
    EC.presence_of_element_located((By.ID, "id_tenant_group")))

select.select_by_visible_text('IT')

0
投票

此错误消息...

selenium.common.exceptions.UnexpectedTagNameException: Message: Select only works on elements, not on span

...表示要传递给Select类的元素不是<select>节点,而是不受支持的<span>元素。


似乎您的定位器正在标识<span>元素而不是<select>元素。因此,您会看到错误。另外,selectByVisibleText()不是有效的Python方法,相反,您需要使用select_by_visible_text()

解决方案

要单击文本为IT的选项,您必须为element_to_be_clickable()引入WebDriverWait,并且可以使用以下任何一个Locator Strategies

  • 使用CSS_SELECTORselect_by_value()

    tenant_g_element = Select(WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "select.netbox-select2-api.form-control#id_tenant_group[name='tenant_group']"))))
    tenant_g_element.select_by_value("2")
    
  • 使用XPATHselect_by_visible_text()

    tenant_g_element = Select(WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//select[@class='netbox-select2-api form-control' and @id='id_tenant_group'][@name='tenant_group']"))))
    tenant_g_element.select_by_visible_text("IT")
    
  • :您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.ui import Select
    
© www.soinside.com 2019 - 2024. All rights reserved.