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)
[]
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;"))
return windows.Alarms; I get a large dict: {'alarmData': [], 'augmentSingleAlarm': {}, 'bIgnoreError': 0, 'bLog': 0, 'bPrefServer': 0, 'bSkipHtml': 0, 'bSkipOutputUser': 0, .. but alarmData is Empty. Even though I see it in console.return window.Alarms.alarmData; still returns you unexpected output or lead to TimeOutException?print(type(alarm)) returns list or str)... Yes try 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)
Alarmsin this case?Alarms: {alarmData: Array(2), ruledefaults: {…}, rules: {…}, location: "", suppress_sound: 0, …}