UnexpectedTagNameException при нажатии на элемент выпадающего меню - PullRequest
1 голос
/ 10 февраля 2020

Я пытаюсь заставить Python / Selenium правильно щелкнуть по раскрывающемуся меню и выбрать «IT», но лучшее, что я мог сделать, - это найти элемент и получить сообщение об ошибке, в котором говорится, что я не могу ввести текст на том, что я нашли.

Обычно пользователь нажимает на это меню и выбирает IT или набирает IT и нажимает ввод.

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, который вызывает событие, показывающее другой диапазон, где, наконец, можно увидеть мой вариант.

Я не могу выбрать с помощью видимого текста, потому что другие меню также содержат то же самое "- ------- "видимый текст.

Я сделал несколько снимков экрана, чтобы проиллюстрировать проблему, надеюсь, это поможет. html код браузер проверяет

Если честно, я действительно потерян, любые предложения будут высоко оценены.

РЕДАКТИРОВАТЬ: Я попытался сделать следующее:

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

Ответы [ 3 ]

0 голосов
/ 10 февраля 2020

Ваш Xpath кажется неправильным. Вы пытаетесь найти тег span , но вам нужно найти элемент select . Кроме того, вам следует применить ожидание веб-драйвера для 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')
0 голосов
/ 11 февраля 2020

Это сообщение об ошибке ...

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

... подразумевает, что элемент, который вы передаете классу Select , не является узлом <select>, а <span> элемент, который не поддерживается.


Похоже, ваш локатор идентифицировал элемент <span> вместо элемента <select>. Отсюда вы видите ошибку. Кроме того, selectByVisibleText() не является допустимым Python методом, вместо этого вам необходимо использовать select_by_visible_text().

Solution

Чтобы выбрать параметр с текстом в виде IT , вам нужно вызвать WebDriverWait для element_to_be_clickable(), и вы можете использовать любую из следующих стратегий локатора :

  • Использование CSS_SELECTOR и select_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")
    
  • Использование XPATH и select_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
    
0 голосов
/ 10 февраля 2020

Ваша первая строка неверна. Это должно быть примерно так:

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

, потому что у вас есть атрибут id = "id_tenant_group". Нет необходимости использовать By.XPATH ... если у вас есть какая-то причина для этого, вам нужно посмотреть, как указать XPATH (обратите внимание, что // span найдет , а не

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...