Multi-select handling in Selenium Python - Build an Automation Script
from selenium import webdriver from selenium.webdriver.support.ui import Select from selenium.webdriver.common.by import By import unittest class TestMultiSelect(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome() self.driver.get('https://example.com/multiselect') # Replace with actual URL def test_multi_select_handling(self): driver = self.driver select_element = driver.find_element(By.ID, 'fruits') select = Select(select_element) # Select 'Apple' and 'Banana' select.select_by_visible_text('Apple') select.select_by_visible_text('Banana') # Verify both are selected selected_options = [opt.text for opt in select.all_selected_options] self.assertIn('Apple', selected_options, "Apple should be selected") self.assertIn('Banana', selected_options, "Banana should be selected") # Deselect 'Apple' select.deselect_by_visible_text('Apple') # Verify only 'Banana' remains selected selected_options_after = [opt.text for opt in select.all_selected_options] self.assertNotIn('Apple', selected_options_after, "Apple should be deselected") self.assertIn('Banana', selected_options_after, "Banana should still be selected") def tearDown(self): self.driver.quit() if __name__ == '__main__': unittest.main()
This test uses Selenium WebDriver with Python's unittest framework.
In setUp, the browser opens the target page with the multi-select dropdown.
We locate the dropdown by its id='fruits' and create a Select object to handle multi-select options easily.
We select 'Apple' and 'Banana' by their visible text, then check that both appear in the list of selected options.
Next, we deselect 'Apple' and verify that only 'Banana' remains selected.
Assertions ensure the test fails if the selections do not match expectations.
Finally, tearDown closes the browser to clean up.
Now add data-driven testing to select and deselect multiple sets of fruits: ['Apple', 'Banana'], ['Orange', 'Grape'], ['Banana', 'Grape']
Practice
Select class in Selenium help you do when testing multi-select dropdowns?Solution
Step 1: Understand the purpose of the Select class
The Select class is designed to interact with dropdown elements, especially those that allow multiple selections.Step 2: Identify multi-select capability
It provides methods like select_by_visible_text to pick multiple options, which is not possible with simple click commands.Final Answer:
Select multiple options from a dropdown list -> Option BQuick Check:
Select class = multi-option selection [OK]
- Thinking Select only picks one option
- Confusing Select with browser control commands
- Assuming Select submits forms automatically
Solution
Step 1: Review method usage for selecting multiple options
The select_by_visible_text method accepts a single string, so to select multiple options, call it multiple times separately.Step 2: Analyze each option
select.select_by_visible_text(['Option1', 'Option2']) tries to pass a list directly, which is invalid. select.select_by_visible_text('Option1'); select.select_by_visible_text('Option2') calls the method twice correctly. select.select_by_index([1, 2]) uses select_by_index with a list, which is invalid. select.select('Option1', 'Option2') uses a non-existent method.Final Answer:
select.select_by_visible_text('Option1'); select.select_by_visible_text('Option2') -> Option CQuick Check:
Call select_by_visible_text separately for each option [OK]
- Passing a list to select_by_visible_text
- Using non-existent methods like select()
- Trying to select multiple indexes with a list
print([option.text for option in select.all_selected_options])?
from selenium.webdriver.support.ui import Select
select = Select(driver.find_element(By.ID, 'fruits'))
select.select_by_visible_text('Apple')
select.select_by_visible_text('Banana')
select.deselect_by_visible_text('Apple')Solution
Step 1: Trace the selection and deselection steps
First, 'Apple' and 'Banana' are selected. Then 'Apple' is deselected, leaving only 'Banana' selected.Step 2: Understand what all_selected_options returns
It returns a list of currently selected options, so after deselecting 'Apple', only 'Banana' remains.Final Answer:
['Banana'] -> Option DQuick Check:
Deselect removes 'Apple', so only 'Banana' remains [OK]
- Assuming deselect_by_visible_text does not remove selection
- Expecting all_selected_options to include deselected items
- Confusing select_by_visible_text with deselect
select = Select(driver.find_element(By.ID, 'colors')) select.select_by_index(1, 2)
Solution
Step 1: Check method signature of select_by_index
The select_by_index method accepts a single integer index, not multiple arguments.Step 2: Identify the error in argument usage
Passing two arguments (1, 2) causes a TypeError because the method expects only one index at a time.Final Answer:
select_by_index does not accept multiple arguments -> Option AQuick Check:
select_by_index takes one index, not multiple [OK]
- Passing multiple indexes as separate arguments
- Confusing select_by_index with a method that accepts lists
- Assuming select_by_index works with visible text
Solution
Step 1: Select all options in the dropdown
Loop through all options and select each by visible text to ensure all are selected.Step 2: Deselect options containing 'Red'
Loop through all selected options and deselect those whose text contains 'Red'.Step 3: Verify logic correctness
for option in select.options: select.select_by_visible_text(option.text) for option in select.all_selected_options: if 'Red' in option.text: select.deselect_by_visible_text(option.text) correctly selects all, then deselects only 'Red' options. select.select_all() select.deselect_by_visible_text('Red') uses a non-existent select_all method. select.select_by_visible_text('Red') select.deselect_all() selects only 'Red' and then deselects all, which is incorrect. for option in select.options: if 'Red' not in option.text: select.select_by_visible_text(option.text) selects only non-'Red' options, not all first.Final Answer:
for option in select.options: select.select_by_visible_text(option.text) for option in select.all_selected_options: if 'Red' in option.text: select.deselect_by_visible_text(option.text) -> Option AQuick Check:
Select all first, then deselect 'Red' options [OK]
- Using non-existent select_all method
- Selecting only 'Red' options instead of all
- Deselecting all options instead of conditional ones
Ready to prove it?
Pass the test and this pattern moves unknown
