【问题标题】:UnexpectedTagNameException while clicking dropdown menu item单击下拉菜单项时出现 UnexpectedTagNameException
【发布时间】:2020-05-26 03:33:42
【问题描述】:

我正在尝试让 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


    【解决方案1】:

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

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

    因为您具有属性 id="id_tenant_group"。没有必要使用 By.XPATH...如果您有某些理由需要它,那么您需要查找如何指定 XPATH(注意 //span 会找到一个 ,而不是以

    【讨论】:

    • 我用以下代码测试了你的方法:tenant_g_element = Select(browser.find_element(By.ID, 'id_tenant_group')) tenant_g_element.select_by_visible_text("IT") 并得到错误 selenium.common.exceptions.ElementNotInteractableException: Message: Element
    • 嗯,这意味着该项目已找到,但无法滚动到视图中,这是一个不同的问题。我还注意到,您得到的所有其他答案都有相同的新问题。标准的 StackOverflow 方法是将更新后的代码发布到特定于该问题的新问题中。
    • 嘿 Shaheed,我找到了一种通过 JSON 发布我需要的数据的方法,因此不再需要让这个脚本工作了。感谢您的支持。
    【解决方案2】:

    此错误消息...

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

    ...暗示您传递给 Select 类的元素不是 &lt;select&gt; 节点,而是不受支持的 &lt;span&gt; 元素。


    您的定位器似乎在识别 &lt;span&gt; 元素而不是 &lt;select&gt; 元素。因此,您会看到错误。此外,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
      

    【讨论】:

    • 感谢您的回复,我已经测试了您的 XPATH 建议,但出现以下错误:raise TimeoutException(message, screen, stacktrace) selenium.common.exceptions.TimeoutException: Message:跨度>
    • CSS_SELECTOR 给出了一个不同的错误: Traceback(最近一次调用最后一次):文件“subnet.py”,第 39 行,在 tenant_g_element.select_by_value("2") selenium.common.exceptions.ElementNotInteractableException:消息:元素
    【解决方案3】:

    您的 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 = Select(WebDriverWait(driver, 50).until(
            EC.presence_of_element_located((By.ID, "id_tenant_group"))))
        WebDriverWait(driver, 50).until(
            EC.presence_of_element_located((By.XPATH, "//select[@id='id_tenant_group']/option[2]")))
    WebDriverWait(driver, 50).until(EC.element_to_be_clickable((By.XPATH, "//select[@id='id_tenant_group']//options[contains(.,'IT')]")))
        select.select_by_visible_text('IT')
    

    【讨论】:

    • 感谢您的回复。我已经测试了您提供的代码并收到以下错误:Traceback(最近一次调用最后一次):文件“subnet.py”,第 35 行,在 select.select_by_visible_text('IT') AttributeError: ' FirefoxWebElement' 对象没有属性 'select_by_visible_text'
    • @RenanHingel 答案已更新。请立即尝试并告诉我。
    • Muzzamil,感谢您对这个主题感兴趣。我已经测试了您的建议并收到以下错误:selenium.common.exceptions.ElementNotInteractableException: Message: Element 这是完整代码的屏幕截图以及错误: imgur.com/oDogfIZ
    • @RenanHingel 我已根据错误消息更新了答案。立即尝试。
    • 嘿 Muzzamil,我找到了一种通过 JSON 发布我需要的数据的方法,因此不再需要让这个脚本工作了。感谢您的支持。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    相关资源
    最近更新 更多