For each select element, make the function select options one by one, then call itself recursively on the next select element.
While doing this, you can save the currently selected items in an array, and when you reach the last select item, use them however you want. Here is your code modified, that works on the URL you posted.
driver.get(url)
elem_cat = ('brand','family','year','cc','transmission','variant')
def multi_define(driver, elem_index, selected):
select = Select(driver.find_element_by_id(elem_cat[elem_index]))
options = select.options
# select each option
for i in range(1, len(options)):
select.select_by_index(i)
time.sleep(0.3)
if elem_index == 5:
# we are at the last select item
driver.find_element_by_id("loan-calculate").click()
selected = selected + [options[i].text]
# clicked the button. selected options are in selected array.
# do whatever you need to do with this information
time.sleep(0.1)
print(selected)
elif options[i].text != "": # skip placeholders
# recursive call for the next select. you can change [options[i].text]
# to whatever information you need about this option
multi_define(driver, elem_index + 1, selected + [options[i].text])
multi_define(driver, 0, [])
Output of this code:
['ALFA ROMEO', '145', '2001', '1598', '5 SP MANUAL']
['ALFA ROMEO', '145', '2000', '1598', '5 SP MANUAL']
['ALFA ROMEO', '145', '1999', '1598', '5 SP MANUAL']
['ALFA ROMEO', '145', '1998', '1598', '5 SP MANUAL']
['ALFA ROMEO', '145', '1997', '1598', '5 SP MANUAL']
['ALFA ROMEO', '145', '1996', '1598', '5 SP MANUAL']
['ALFA ROMEO', '145', '1995', '1598', '5 SP MANUAL']
['ALFA ROMEO', '145', '1995', '1598', '5 SP MANUAL']
['ALFA ROMEO', '146', '2002', '1598', '5 SP MANUAL']
...