背景

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标签的下拉框,如下图:

Python下拉二级菜单 python自动化下拉框_下拉框


通过示例代码完成对下拉框选项的定位:

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