我正在尝试让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
您的第一行是错误的。应该是这样的:
tenant_g_element = Select(browser.find_element(By.ID, 'id_tenant_group'))
因为您的属性为id =“ id_tenant_group”。无需使用By.XPATH ...如果您出于某些原因需要使用By.XPATH,则需要查找如何指定XPATH(请注意// span将查找,而不是例如
您的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')
此错误消息...
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_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