使用 Python + Selenium 从列表的下拉菜单中选择一个项目
Selecting an item from the dropdown menu of a list using Python + Selenium
我正在尝试 select 在 Python 中使用 Selenium 从无序列表中提取一个元素。我当前的代码点击下拉菜单并将其打开,但我无法让它点击列表中的项目。
我正在尝试让它点击 Inactive。
这是 HTML 片段:
<form method="post" action="/user/admin/user/practice/edit/18" id="qf_admin_practice_edit" class="qf-form"
onsubmit="return validate(this)">
<fieldset id="qf_admin_practice_edit__data" class="qf-fieldset">
<legend>Edit Practice</legend>
<div class="qf-select-wrapper" id="qf_admin_practice_edit__data__status_id__wrapper">
<span class="qf-label-span" id="qf_admin_practice_edit__data__status_id__label_span">
<label id="qf_admin_practice_edit__data__status_id__label" for="qf_admin_practice_edit__data__status_id">Practice Status</label>
</span>
<span class="qf-select-span" id="qf_admin_practice_edit__data__status_id__span">
<span class="qf-select-inner" id="qf_admin_practice_edit__data__status_id__inner">
<div class="selectric-wrapper selectric-qf-select selectric-above selectric-open">
<div class="selectric-hide-select">
<select title="Practice Status" name="admin_practice_edit__data__status_id"
id="qf_admin_practice_edit__data__status_id" class="qf-select" tabindex="-1">
<option value="1" class="qf-option">Active</option>
<option value="2" class="qf-option">Inactive</option>
<option value="3" class="qf-option">Pending</option>
<option value="4" class="qf-option">Billing Suspension</option>
<option value="5" class="qf-option">Activity Suspension</option>
<option value="6" class="qf-option">Declined</option>
<option value="7" selected="selected" class="qf-option">Deleted</option>
<option value="8" class="qf-option">Cancelled</option>
<option value="9" class="qf-option">Reschedule</option>
<option value="10" class="qf-option">Expired</option>
<option value="11" class="qf-option">New</option>
</select>
</div>
<div class="selectric">
<span class="label">Deleted</span>
<b class="button">▾</b>
</div>
<div class="selectric-items" tabindex="-1" style="width: 718px; height: 300px;">
<div class="selectric-scroll">
<ul>
<li data-index="0" class="qf-option">Active</li>
<li data-index="1" class="qf-option">Inactive</li>
<li data-index="2" class="qf-option">Pending</li>
<li data-index="3" class="qf-option">Billing Suspension</li>
<li data-index="4" class="qf-option">Activity Suspension</li>
<li data-index="5" class="qf-option">Declined</li>
<li data-index="6" class="qf-option selected highlighted">Deleted</li>
<li data-index="7" class="qf-option">Cancelled</li>
<li data-index="8" class="qf-option">Reschedule</li>
<li data-index="9" class="qf-option">Expired</li>
<li data-index="10" class="qf-option last">New</li>
</ul>
</div>
</div>
<input class="selectric-input" tabindex="0">
</div>
</span>
</span>
</div>
</fieldset>
<div class="qf-button-wrapper" id="qf_admin_practice_edit__submit__wrapper">
<button type="submit" value="Submit" id="qf_admin_practice_edit__submit" class="qf-button">
<span>Submit</span>
</button>
</div>
<div>
<input value="2449978437" type="hidden" name="qf" class="qf-hidden-input qf-input">
</div>
</form>
我 selecting/opening 在下拉菜单中使用:
clickDropDown = driver.find_element_by_id('qf_admin_practice_edit__data__status_id__wrapper').click()
您应该能够 select 选项的文本或其值:
dropDown = Select(driver.find_element_by_id("admin_practice_edit__data__status_id"))
dropDown.click()
# Select by text
dropDown.select_by_visible_text("Inactive")
# or by value
dropDown.select_by_value('2')
您可以在此处找到有关使用下拉菜单的更多信息:https://seleniumhq.github.io/selenium/docs/api/py/webdriver_support/selenium.webdriver.support.select.html
你的定位器ID
错误识别Select
element.However到select一个元素不需要点击element.You即可首先通过定位器分配 select 元素,然后使用以下方法访问该元素。
element.select_by_visible_text("text")
element.select_by_index(index number)
element.select_by_value("option value")
然而,访问任何 webpage.I 提供的代码时最好使用 WebDriverWait
希望这对您有所帮助。
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
from selenium import webdriver
from selenium.webdriver.support.select import Select
driver=webdriver.Chrome()
driver.get("url here")
dropdownelement=WebDriverWait(driver,20).until(expected_conditions.element_to_be_clickable((By.ID,'qf_admin_practice_edit__data__status_id')))
select=Select(dropdownelement)
select.select_by_visible_text("Inactive")
或
select.select_by_index(1)
或
select.select_by_value("2")
所需的 DropDown 不是 <select>
标签,因为它具有 class
属性 作为 selectric-hide-select。使用 through Python you need to induce WebDriverWait and you can use either of the following :
从 DropDown 到文本为 Active 的元素上 click()
使用CSS_SELECTOR
:
driver.find_element_by_css_selector("div.qf-select-wrapper#qf_admin_practice_edit__data__status_id__wrapper").click()
WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.selectric-items>div.selectric-scroll li.qf-option[data-index='0']"))).click()
使用XPATH
:
driver.find_element_by_xpath("//div[@class='qf-select-wrapper' and @id='qf_admin_practice_edit__data__status_id__wrapper']").click()
WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//div[@class='selectric-items']/div[@class='selectric-scroll']//li[@class='qf-option' and text()='Active']"))).click()
注意:您必须添加以下导入:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
想通了,但这是一个我不喜欢的丑陋解决方案,但它确实有效。
openDropDown = driver.find_element_by_id('qf_admin_practice_edit__data__status_id__wrapper').click()
swapToActive = driver.switch_to.active_element
swapToActive.send_keys(Keys.UP)
swapToActive.send_keys(Keys.UP)
swapToActive.send_keys(Keys.UP)
swapToActive.send_keys(Keys.UP)
swapToActive.send_keys(Keys.UP)
swapToActive.send_keys(Keys.RETURN)
我正在尝试 select 在 Python 中使用 Selenium 从无序列表中提取一个元素。我当前的代码点击下拉菜单并将其打开,但我无法让它点击列表中的项目。
我正在尝试让它点击 Inactive。
这是 HTML 片段:
<form method="post" action="/user/admin/user/practice/edit/18" id="qf_admin_practice_edit" class="qf-form"
onsubmit="return validate(this)">
<fieldset id="qf_admin_practice_edit__data" class="qf-fieldset">
<legend>Edit Practice</legend>
<div class="qf-select-wrapper" id="qf_admin_practice_edit__data__status_id__wrapper">
<span class="qf-label-span" id="qf_admin_practice_edit__data__status_id__label_span">
<label id="qf_admin_practice_edit__data__status_id__label" for="qf_admin_practice_edit__data__status_id">Practice Status</label>
</span>
<span class="qf-select-span" id="qf_admin_practice_edit__data__status_id__span">
<span class="qf-select-inner" id="qf_admin_practice_edit__data__status_id__inner">
<div class="selectric-wrapper selectric-qf-select selectric-above selectric-open">
<div class="selectric-hide-select">
<select title="Practice Status" name="admin_practice_edit__data__status_id"
id="qf_admin_practice_edit__data__status_id" class="qf-select" tabindex="-1">
<option value="1" class="qf-option">Active</option>
<option value="2" class="qf-option">Inactive</option>
<option value="3" class="qf-option">Pending</option>
<option value="4" class="qf-option">Billing Suspension</option>
<option value="5" class="qf-option">Activity Suspension</option>
<option value="6" class="qf-option">Declined</option>
<option value="7" selected="selected" class="qf-option">Deleted</option>
<option value="8" class="qf-option">Cancelled</option>
<option value="9" class="qf-option">Reschedule</option>
<option value="10" class="qf-option">Expired</option>
<option value="11" class="qf-option">New</option>
</select>
</div>
<div class="selectric">
<span class="label">Deleted</span>
<b class="button">▾</b>
</div>
<div class="selectric-items" tabindex="-1" style="width: 718px; height: 300px;">
<div class="selectric-scroll">
<ul>
<li data-index="0" class="qf-option">Active</li>
<li data-index="1" class="qf-option">Inactive</li>
<li data-index="2" class="qf-option">Pending</li>
<li data-index="3" class="qf-option">Billing Suspension</li>
<li data-index="4" class="qf-option">Activity Suspension</li>
<li data-index="5" class="qf-option">Declined</li>
<li data-index="6" class="qf-option selected highlighted">Deleted</li>
<li data-index="7" class="qf-option">Cancelled</li>
<li data-index="8" class="qf-option">Reschedule</li>
<li data-index="9" class="qf-option">Expired</li>
<li data-index="10" class="qf-option last">New</li>
</ul>
</div>
</div>
<input class="selectric-input" tabindex="0">
</div>
</span>
</span>
</div>
</fieldset>
<div class="qf-button-wrapper" id="qf_admin_practice_edit__submit__wrapper">
<button type="submit" value="Submit" id="qf_admin_practice_edit__submit" class="qf-button">
<span>Submit</span>
</button>
</div>
<div>
<input value="2449978437" type="hidden" name="qf" class="qf-hidden-input qf-input">
</div>
</form>
我 selecting/opening 在下拉菜单中使用:
clickDropDown = driver.find_element_by_id('qf_admin_practice_edit__data__status_id__wrapper').click()
您应该能够 select 选项的文本或其值:
dropDown = Select(driver.find_element_by_id("admin_practice_edit__data__status_id"))
dropDown.click()
# Select by text
dropDown.select_by_visible_text("Inactive")
# or by value
dropDown.select_by_value('2')
您可以在此处找到有关使用下拉菜单的更多信息:https://seleniumhq.github.io/selenium/docs/api/py/webdriver_support/selenium.webdriver.support.select.html
你的定位器ID
错误识别Select
element.However到select一个元素不需要点击element.You即可首先通过定位器分配 select 元素,然后使用以下方法访问该元素。
element.select_by_visible_text("text")
element.select_by_index(index number)
element.select_by_value("option value")
然而,访问任何 webpage.I 提供的代码时最好使用 WebDriverWait
希望这对您有所帮助。
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
from selenium import webdriver
from selenium.webdriver.support.select import Select
driver=webdriver.Chrome()
driver.get("url here")
dropdownelement=WebDriverWait(driver,20).until(expected_conditions.element_to_be_clickable((By.ID,'qf_admin_practice_edit__data__status_id')))
select=Select(dropdownelement)
select.select_by_visible_text("Inactive")
或
select.select_by_index(1)
或
select.select_by_value("2")
所需的 DropDown 不是 <select>
标签,因为它具有 class
属性 作为 selectric-hide-select。使用
click()
使用
CSS_SELECTOR
:driver.find_element_by_css_selector("div.qf-select-wrapper#qf_admin_practice_edit__data__status_id__wrapper").click() WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.selectric-items>div.selectric-scroll li.qf-option[data-index='0']"))).click()
使用
XPATH
:driver.find_element_by_xpath("//div[@class='qf-select-wrapper' and @id='qf_admin_practice_edit__data__status_id__wrapper']").click() WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//div[@class='selectric-items']/div[@class='selectric-scroll']//li[@class='qf-option' and text()='Active']"))).click()
注意:您必须添加以下导入:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC
想通了,但这是一个我不喜欢的丑陋解决方案,但它确实有效。
openDropDown = driver.find_element_by_id('qf_admin_practice_edit__data__status_id__wrapper').click()
swapToActive = driver.switch_to.active_element
swapToActive.send_keys(Keys.UP)
swapToActive.send_keys(Keys.UP)
swapToActive.send_keys(Keys.UP)
swapToActive.send_keys(Keys.UP)
swapToActive.send_keys(Keys.UP)
swapToActive.send_keys(Keys.RETURN)