selenium python return data from javascript window object

Viewed 1565

How can I get hold of the following object in python selenium:

(in firefox/Chrome console):
>>window.Alarms.alarmData
Array [ {…}, {…} ]

This returns empty:

alarm = driver.execute_script("return window.Alarms.alarmData;")
print(alarm)
[]

2 Answers

You can try to wait until JS object returns any non-empty value:

from selenium.webdriver.support.ui import WebDriverWait

alarm = WebDriverWait(driver, 20).until(lambda driver: driver.execute_script("return window.Alarms.alarmData;"))

With the help of @Andersson I found this issue. When starting window.Alarms.AlarmData is defined as an empty list '[]', so it will be successfully returned, I just need to wait until it is no longer an empty list, The important lession was to check initial state of variables, because they may be defined and just successfully in selenium.

def test2_alarmdata(self):
    """ fetch the data objects """
    driver = self.driver
    cookie_read(driver)
    driver.get(default['url'] + "/alarm_board/index.html")
    alarmData = None
    retries = args.retries
    while not alarmData and retries:
        time.sleep(1)
        alarms = driver.execute_script("return window.Alarms.alarmData;")
        if alarms:
            alarmData = alarms
        retries -= 1
    if isinstance(alarmData, list):
        print("we have {} queued alarms".format(len(alarmData)))

Run the unittest:

we have 2 queued alarms
__main__.T.test2_alarmdata (3.4068s)
Related