当今世界公认的最好的开源浏览器自动化工具之一是selenium,selenium WebDriver的 "Select" 类使我们能够顺利地处理下拉菜单。今天,我们将尝试实际了解 "Select"类的所有错综复杂的问题。
选择类的目的
selenium中的"Select"类允许我们切换用<select> html标签创建的下拉菜单的状态。我们可以从这个类中实例化一个对象,并在这个对象上应用各种方法,无论它是单选还是多选的下拉菜单。选择和取消选择的方法都适用于Select 类对象,而取消选择的方法只适用于<multi-select> HTML标签,因为那里可以进行多选。
实例化一个选择类的对象
为了开始这个过程,我们需要从Selenium 包中导入WebDriver 。我们将使用ChromeDriver ,它允许我们使用chrome浏览器来浏览网页。在selenium包中有一个特殊的Select 模块,它将被导入selenium.webdriver.support.ui 。
from selenium import webdriver
from selenium.webdriver.support.ui import Select
import time
driver = webdriver.Chrome(executable_path = r'G:/scraping_practice/chromedriver_win32/chromedriver.exe')
driver.get('https://www.imdb.com/search/title/')
Chromedriver路径被指定,驱动使用get方法连接到*"IMDB高级标题搜索 "*网站。
我们的目标是将用户评级下拉菜单自动化,并将最低评级设为7,因为我喜欢看高评级的电影。通过右键单击用户评级下拉菜单,我们可以检查HTML代码。

从HTML代码中,我们可以看到<select> 这个HTML标签是用来控制 "用户评级 "下拉菜单的,我们可以通过"name"属性选择这个标签,并创建一个WebElement "rating",然后点击它。
rating = driver.find_element_by_name('user_rating-min')
rating.click()
现在,我们可以通过使用一个新的关键字轻松地实例化一个Select 类的对象。在创建一个对象后,我们需要将一个下拉式WebElement 作为参数传递给它的构造函数。我们已经创建了一个类型为WebElement 的变量rating ,现在我们将把它作为一个参数传给 "Select" 类,以创建一个rating_dropdown 对象。
rating_dropdown = Select(rating)
请记住:Select 类以字母大写 "S "开头,select() 方法以字母小写 "S "开头。
从下拉菜单中选择一个值
Select 类为我们提供了多种方法来选择一个下拉值。让我们来熟悉一下这些方法。
select_by_visible_text()
从HTML代码(Image:1)中,我们可以用select() 方法通过文本从<option> 标签中选择一个值。我们只需要在括号内放入所需的字符串格式的文本。让我们试着把用户的评价设为7.0。
rating_dropdown.select_by_visible_text('7.0')
如果我们现在运行这个脚本,我们会看到我们的用户评分被Selenium web驱动自动设置为7.0。
select_by_index()
我们想为每个高级搜索在每页加载100个结果。我们怎样才能做到这一点呢?在页面的最后部分,有一个display options 菜单。让我们试着将下拉菜单设置为每页100个。检查HTML标签,找到选择标签。

我们可以看到100 per page是<select> 标签的第二个元素,我们可以使用索引来到达那里。
display = driver.find_element_by_id('search-count')
display.click()
display_dropdown = Select(display)
display_dropdown.select_by_index('1')
select_by_value()
现在,我们将从语言下拉菜单中选择 "英语"。

当我们检查HTML时,我们可以看到 "value" 元素在<option> 标签中是可用的。首先,我们需要找到<select> 标签,然后输入代表英语的值。
language = driver.find_element_by_name('languages')
language_dropdown = Select(language)
language_dropdown.select_by_value('en')
从下拉菜单中选择多个值
从图片3:中我们可以看到在<select> 标签内有一个 "multiple"属性 。这个 "multiple" 属性允许我们从语言下拉菜单中选择多个值。
现在让我们用''来加强我们的语言选择*German*','French'和'Afrikaans'。
language_dropdown.select_by_value('de')
language_dropdown.select_by_value('fr')
language_dropdown.select_by_value('af')
如果我们运行代码,我们会看到'German'和'French'也被选择为英语。
如何从多个选择值中取消选择一个值
就像选择方法一样,我们可以使用取消选择方法从多个选择值中取消选择。这个选项只适用于多选下拉菜单。我们可以通过使用下面讨论的各种方法从多选下拉菜单中取消选择任何预选的值。
deselect_by_index()。
任何预选的值都可以用deselect_by_index() 方法取消选择。这与select_by_index() 方法的工作方式相同。我们只需要从选择标签中选择该值的索引。让我们尝试从语言下拉菜单中取消选择 "南非荷兰语"。由于 "南非荷兰语 "的索引是4,代码应该是:

language_dropdown.deselect_by_index('4')
'Afrikanns'语言将被取消选择。
deselect_by_value()。
我们可以做同样的事情,通过"value"属性来取消选择的元素。我们可以看到 "Afrikaans "语言的值属性是"af" ,代码应该是。
language_dropdown.deselect_by_value('af')
deselect_by_visible_text()。
至于select_by_visible_text 方法,我们可以用一个文本元素从多个下拉列表中取消预选值。如果 "南非荷兰语 "已经被选中,我们想取消选择它,我们可以这样做。
language_dropdown.deselect_by_visible_text('Afrikaans')
deselect_all()
有时我们需要清除所有已被选中的值。在这种情况下,我们可以使用deselect_all() 选项。这个方法只在 "multiple" 选择选项可用的情况下起作用。让我们从语言下拉菜单中清除所有选定的语言,并使其焕然一新。
language_dropdown.deselect_all()
所有选择的项目将被取消选择。
如何使用选项
如果我们想知道某个下拉菜单中有多少个选项,"选项 "方法将允许我们使用多功能的功能。让我们试着计算一下在 "语言 "下拉菜单中有多少选项可供选择。
language_option = language_dropdown.options
print(len(language_option))
在这里,'language_option' 变量被视为列表 类型,我们可以使用'[len](https://blog.finxter.com/python-len/ "Python len()")'函数来获得可以选择的语言总数。结果将是总共334种语言。
我们可以用列表索引的 方法来选择任何语言。让我们试着从语言下拉菜单中选择第一种语言。
language_option[0].click()
现在我们想选择所有的语言。我们怎样才能做到这一点呢?我们可以使用一个for 循环 作为解决方案。
for language in language_option:
language.click()
如果我们运行该代码,所有的语言都会被选中。
结论
这就是今天关于"Select"类的全部内容。希望你喜欢它。
