UnexpectedTagNameException:消息:Select 仅适用于 <select> 元素,不适用于 <ul> 使用 Selenium 和 Python 选择下拉选项时出错
UnexpectedTagNameException: Message: Select only works on <select> elements, not on <ul> error selecting an Dropdown option using Selenium and Python
objective select 四个子菜单之一(即 Subject area, Title, Publisher, ISSN
),如下图所示,来自 Scopus 网站,可通过 link: https://www.scopus.com/sources?zone=TopNavBar&origin=NO%20ORIGIN%20DEFINED
class 姓名 ui-menu ui-corner-bottom ui-widget ui-widget-content
的 search result comb drop menu
的 html 片段是
<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>
假设我们对 select 子菜单 Title
感兴趣,那么 objective 可以按照 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()
但是编译return出现如下错误;
Unable to locate element:
{"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')
Return 出现以下错误:
selenium.common.exceptions.UnexpectedTagNameException: Message: Select only works on <select> elements, not on <ul>
请问我哪里做错了吗?感谢您的帮助
到 select 主题区、标题、出版商[中的四个子菜单之一=42=] 和 ISSN 因为项目在他们的 parent <li>
标签的 child <div>
标签内,你必须归纳WebDriverWait for the element_to_be_clickable()
and you can use the following Locator Strategies:
选择 标题 使用 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
参考
您可以在以下位置找到一些相关的详细讨论:
objective select 四个子菜单之一(即 Subject area, Title, Publisher, ISSN
),如下图所示,来自 Scopus 网站,可通过 link: https://www.scopus.com/sources?zone=TopNavBar&origin=NO%20ORIGIN%20DEFINED
class 姓名 ui-menu ui-corner-bottom ui-widget ui-widget-content
的 search result comb drop menu
的 html 片段是
<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>
假设我们对 select 子菜单 Title
感兴趣,那么 objective 可以按照 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()
但是编译return出现如下错误;
Unable to locate element: {"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')
Return 出现以下错误:
selenium.common.exceptions.UnexpectedTagNameException: Message: Select only works on <select> elements, not on <ul>
请问我哪里做错了吗?感谢您的帮助
到 select 主题区、标题、出版商[中的四个子菜单之一=42=] 和 ISSN 因为项目在他们的 parent <li>
标签的 child <div>
标签内,你必须归纳WebDriverWait for the element_to_be_clickable()
and you can use the following Locator Strategies:
选择 标题 使用
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
参考
您可以在以下位置找到一些相关的详细讨论: