背景
web中的下拉框有的是使用select标签创建,有的不是。对于非select标签的下拉框以及其元素选项,可通过与其他元素相同的方法去定位。对于select标签的下拉框,selenium webdriver提供了Select类来处理,比较方便易用.
Select类导入方式和常用 方法
# 导入方式
from selenium.webdriver.support.select import Select
# 常用方法
# 通过value值定位下拉框选项
Select(element).select_by_value(value)
# 通过text值定位下拉框选项
Select(element).select_by_visible_text(text)
# 通过索引定位下拉框选项,索引从0开始计数,0对应下拉框第一个选项,1对应下拉框第二个选项,依次类推
Select(element).select_by_index(index)
常用方法示例:
首先,我们找到一个select标签的下拉框,如下图:
通过示例代码完成对下拉框选项的定位:
from selenium import webdriver
from selenium.webdriver.support.select import Select
import time
chrome_driver = r'D:\Python3.7\Lib\site-packages\selenium\webdriver\chrome\chromedriver.exe'
driver = webdriver.Chrome(executable_path = chrome_driver)
driver.implicitly_wait(10)
driver.maximize_window()
ulr = r'http://www.baidu.com'
driver.get( ulr )
# 点击百度首页的搜索设置,打开目标页面
driver.find_element_by_link_text('设置').click()
driver.find_element_by_link_text('搜索设置').click()
time.sleep(2)
# 开始使用示例方法定位
# 首先定位到下拉框控件,并展开下拉框,使得下拉框选项可见
select = driver.find_element_by_css_selector('select#nr')
select.click()
# 通过value值定位下拉框选项
Select(select).select_by_value('50')
time.sleep(2)
# 通过text值定位下拉框选项
Select(select).select_by_visible_text('每页显示20条')
time.sleep(2)
# 通过索引定位下拉框选项
Select(select).select_by_index(0)
time.sleep(2)
# ======================================================
# 运行结果:
# 下拉框默认选项是每页显示10条,通过代码,下拉框会依次显示选择每页显示50条,
# 每页显示20条,每页显示10条,
# ======================================================
Select类提供的其他方法:
Select(element).options #返回值是一个元素对象列表,包含了下拉框所有选项。
select = driver.find_element_by_css_selector('select#nr')
select.click()
a_list = Select(select).options
print(a_list)
for i in a_list:
print(i.text)
# ======================================================
# [<selenium.webdriver.remote.webelement.WebElement (session="9e7ddbcbed953b4cd8f5287c7c3c64e1", element="337a4c4d-4037-460c-a10d-d14258e6b536")>,
# <selenium.webdriver.remote.webelement.WebElement (session="9e7ddbcbed953b4cd8f5287c7c3c64e1", element="2c558657-7bb4-434a-bcb1-4e6dd6a8ab6d")>,
# <selenium.webdriver.remote.webelement.WebElement (session="9e7ddbcbed953b4cd8f5287c7c3c64e1", element="5258926b-4081-4713-8f67-2802495cbe5b")>]
# 每页显示10条
# 每页显示20条
# 每页显示50条
#
#
# ======================================================
Select(element).all_selected_options #返回值是一个元素对象列表,包含了下拉框所有已经被选中选项。在支持单选和多选的下拉框都可以使用。
select = driver.find_element_by_css_selector('select#nr')
select.click()
a_list = Select(select).all_selected_options
print(a_list)
for i in a_list:
print(i.text)
driver.quit()
'''
===============================================================
[<selenium.webdriver.remote.webelement.WebElement (session="8691e67802b99f8a0ca907f694087d1a", element="940b5dab-51e4-4167-9b62-e5cc2dc45894")>]
每页显示10条
[Finished in 16.9s]
===============================================================
'''
Select(element).first_selected_option #返回当前被选中的选项对象
select = driver.find_element_by_css_selector('select#nr')
select.click()
Select(select).select_by_index(2)
sleep(2)
a_option= Select(select).first_selected_option
print(a_option)
print(a_option.text)
driver.quit()
'''
===============================================================
<selenium.webdriver.remote.webelement.WebElement (session="a85d795780384bc8c14203d63336a8ed", element="88c3eb7d-2ab2-4c01-91a4-9f6e96860de8")>
每页显示50条
[Finished in 20.5s]
===============================================================
'''
接下来几个方法是Select类提供的反选方法,都是只对支持多选的下拉框有效:
Select(element).deselect_all() #无返回值,且仅对支持多选的下拉框有效。清除所有选中的条目。这仅在SELECT支持多个选择时有效。 如果下拉框不支持多选,则抛出NotImplementedError。
Select(element).deselect_by_value(value) #无返回值,且仅对支持多选的下拉框有效。取消选择所有具有与参数匹配的值的选项。 如果下拉框不支持多选,则抛出NotImplementedError。如果SELECT中没有指定值的选项,则抛出NoSuchElementException
Select(element).deselect_by_index(value) #无返回值,且仅对支持多选的下拉框有效。在给定索引处取消选择该选项。这是通过检查元素的“index”属性实现的,而不仅仅是通过计数。 如果下拉框不支持多选,则抛出NotImplementedError。如果SELECT中没有指定值的选项,则抛出NoSuchElementException
Select(element).deselect_by_visible_text(text) #无返回值,且仅对支持多选的下拉框有效。取消选择所有显示与参数匹配的文本的选项。如果下拉框不支持多选,则抛出NotImplementedError。如果SELECT中没有指定值的选项,则抛出NoSuchElementException