Search code examples
pythonselenium-webdriverdrop-down-menudropdown

how to scrape multilevel drop down list using selenium python [dependent selection]


i want to extract some data from a multilevel selection dependent drop down menu can any one tell me how can i select and click items using selenium so sub drop downs may be updated automatically!

you can visit the source for reference or run the code to see the output once clicked it never selects item.

i have written several codes here is one of them!

from selenium import webdriver
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.by import By
import csv
import time

//#from selenium.webdriver.support import Select 

print ("opening chorome....")  
driver = webdriver.Chrome()
driver.get('https://www.wheelmax.com/')
time.sleep(10)

csvData = ['Year', 'Make', 'Model', 'Body', 'Submodel', 'Size']

Yindex = Mkindex = Mdindex = Bindex = Smindex = Sindex = 0
print ("waiting for program to set variables....")
time.sleep(10)

print ("initializing and setting variables....")

Year = Select(driver.find_element_by_id("icm-years-select"))
for year in driver.find_elements(By.XPATH, '//*[@id="icm-years-select"]'):
    Year.select_by_index(++Yindex)
    year.click()
    time.sleep(1)
    Make = Select(driver.find_element_by_id("icm-makes-select"))
    for make in driver.find_elements(By.XPATH, '//*[@id="icm-makes-select"]'):
        Make.select_by_index(++Mkindex)
        make.click()
        time.sleep(1)
        Model = Select(driver.find_element_by_id("icm-models-select"))
        for model in driver.find_elements(By.XPATH, '//*[@id="icm-models-select"]'):
            Model.select_by_index(++Mdindex)
            model.click()
            time.sleep(1)
            Body = Select(driver.find_element_by_id("icm-drivebodies-select"))
            for body in driver.find_elements(By.XPATH, '//*[@id="icm-drivebodies-select"]'):
                Body.select_by_index(++Bindex)
                body.click()
                time.sleep(1)
                Submodel = Select(driver.find_element_by_id("icm-submodels-select"))
                for subm in driver.find_elements(By.XPATH, '//*[@id="icm-submodels-select"]'):
                    Submodel.select_by_index(++Smindex)
                    subm.click()
                    time.sleep(1)
                    Size = Select(driver.find_element_by_id("icm-sizes-select"))
                    for size in driver.find_elements(By.XPATH, '//*[@id="icm-sizes-select"]'):
                        Size.select_by_index(++Sindex)
                        csvData.append([year.text, make.text, model.text, body.text, subm.text, size.text])

Solution

  • Try this:

    Select multilevel dependent drop-down menu option

    selectYear = Select(driver.find_element_by_id("icm-years-select"))
    
    for yearOption in selectYear.options:
        yearText = yearOption.text
        selectYear.select_by_visible_text(yearText)
        time.sleep(1)
    
        selectMakes = Select(driver.find_element_by_id("icm-makes-select"))
    
        for makesOption in selectMakes.options:
            makesText = makesOption.text
            selectMakes.select_by_visible_text(makesText)
            time.sleep(1)
            selectModel = Select(driver.find_element_by_id("icm-models-select"))
    
            for modelOption in selectModel.options:
                modelText = modelOption.text
                selectModel.select_by_visible_text(modelText)
    

    enter image description here See more