Interesting thing is, you don't need to scroll the container at all. All the results are actually loaded, but part of them are just invisible. You can simply find all li elements with result_content class and get the desired data.
Example working code extracting the "prod names":
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver
driver = webdriver.Chrome("/usr/local/bin/chromedriver")
driver.maximize_window()
driver.get("http://comparefirst.sg/wap/productsListEvent.action?prodGroup=whole&pageAction=prodlisting")
wait = WebDriverWait(driver, 10)
wait.until(EC.visibility_of_element_located((By.ID, "result_container")))
results = driver.find_elements_by_css_selector("li.result_content")
for result in results:
prod_name = result.find_element_by_id('sProdName').get_attribute("innerText")
print(prod_name)
driver.close()
Prints:
AIA Gen3 (II)
AIA Guaranteed Protect Plus
AIA Guaranteed Protect Plus
...
DIRECT- TM Basic Whole Life
DIRECT- TM Basic Whole Life (+ Critical Illness)
TM Legacy
TM Legacy (+ Critical Illness)
TM Legacy LifeFlex
TM Legacy LifeFlex (+ Critical Illness)
TM Retirement GIO
TM Retirement PaycheckLife (Single Life)
Note that we have to use .get_attribute("innerText") instead of .text since the latter would return the visible text only while most of our elements are invisible.