UnexpectedTagNameException: Сообщение: Select работает только с элементами <select>, а не с ошибкой <ul>при выборе параметра раскрывающегося списка с использованием Selenium и Python - PullRequest
1 голос
/ 10 июля 2020

Цель состоит в том, чтобы выбрать одно из четырех подменю (например, Subject area, Title, Publisher, ISSN), как показано на рисунке ниже с веб-сайта Scopus, доступного по ссылке: https://www.scopus.com/sources?zone=TopNavBar&origin=NO%20ORIGIN%20DEFINED

image

<ul aria-hidden="false" aria-labelledby="srcResultComboDrp-button" id="srcResultComboDrp-menu" role="listbox" tabindex="0" class="ui-menu ui-corner-bottom ui-widget ui-widget-content" aria-activedescendant="ui-id-1" aria-disabled="false" style="width: 251px;">
  <li class="ui-menu-item">
    <div id="ui-id-1" tabindex="-1" role="option" class="ui-menu-item-wrapper ui-state-active">Subject area</div>
  </li>
  <li class="ui-menu-item">
    <div id="ui-id-2" tabindex="-1" role="option" class="ui-menu-item-wrapper">Title</div>
  </li>
  <li class="ui-menu-item">
    <div id="ui-id-3" tabindex="-1" role="option" class="ui-menu-item-wrapper">Publisher</div>
  </li>
  <li class="ui-menu-item">
    <div id="ui-id-4" tabindex="-1" role="option" class="ui-menu-item-wrapper">ISSN</div>
  </li>
</ul>

Допустим, мы хотим выбрать подменю Title, тогда цель может быть достигнута, как предлагается OP1 , следующими строками ;

from selenium import webdriver

driver = webdriver.Chrome(r"C:Browsers\chromedriver.exe")
url = 'https://www.scopus.com/sources?zone=TopNavBar&origin=NO%20ORIGIN%20DEFINED'
driver.get(url)
driver.find_element_by_xpath('//*[@id="ui-id-2"]').click()

Однако компилятор возвращает следующую ошибку:

Невозможно найти элемент: {"method": "xpath", "selector": "// * [@ id = "ui-id-2"] "}

Точно так же, используя следующую строку, предложенную OP2

from selenium import webdriver
from selenium.webdriver.support.ui import Select

driver = webdriver.Chrome(r"C:Browsers\chromedriver.exe")
url = 'https://www.scopus.com/sources?zone=TopNavBar&origin=NO%20ORIGIN%20DEFINED'
driver.get(url)
my_select = Select(driver.find_element_by_id('srcResultComboDrp-menu'))
my_select.select_by_visible_text('Title')

Верните следующая ошибка:

selenium.common.exceptions.UnexpectedTagNameException: Message: Select only works on <select> elements, not on <ul>

Могу ли я узнать, где я сделал не так? Благодарю за любую помощь

Ответы [ 2 ]

1 голос
/ 10 июля 2020

Для выбора одного из четырех подменю среди Тема , Заголовок , Издатель и ISSN , поскольку элементы находятся внутри дочернего элемента. <div> теги их родительского тега <li>, вы должны вызвать WebDriverWait для element_to_be_clickable(), и вы можете использовать следующие стратегии локатора :

  • Выбор Заголовок с использованием XPATH:

    driver.get("https://www.scopus.com/sources?zone=TopNavBar&origin=NO%20ORIGIN%20DEFINED")
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//span[@class='ui-selectmenu-text' and text()='Subject area']"))).click()
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//ul[@id='srcResultComboDrp-menu']//li[@class='ui-menu-item']/div[text()='Title']"))).click()
    
  • Примечание : Вам необходимо добавить следующие импорты:

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

Ссылка

Вы можете найти пару соответствующих подробных обсуждений в:

0 голосов
/ 10 июля 2020

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

driver.find_element_by_xpath("//*[@id='ui-id-2']").click()
...