95 lines
2.9 KiB
Python
95 lines
2.9 KiB
Python
|
from bs4 import BeautifulSoup
|
||
|
|
||
|
|
||
|
class DashPageMixin:
|
||
|
def _get_dash_dom_by_attribute(self, attr):
|
||
|
return BeautifulSoup(
|
||
|
self.find_element(self.dash_entry_locator).get_attribute(attr), "lxml"
|
||
|
)
|
||
|
|
||
|
@property
|
||
|
def devtools_error_count_locator(self):
|
||
|
return ".test-devtools-error-count"
|
||
|
|
||
|
@property
|
||
|
def dash_entry_locator(self):
|
||
|
return "#react-entry-point"
|
||
|
|
||
|
@property
|
||
|
def dash_outerhtml_dom(self):
|
||
|
return self._get_dash_dom_by_attribute("outerHTML")
|
||
|
|
||
|
@property
|
||
|
def dash_innerhtml_dom(self):
|
||
|
return self._get_dash_dom_by_attribute("innerHTML")
|
||
|
|
||
|
@property
|
||
|
def redux_state_paths(self):
|
||
|
return self.driver.execute_script(
|
||
|
"""
|
||
|
var p = window.store.getState().paths;
|
||
|
return {strs: p.strs, objs: p.objs}
|
||
|
"""
|
||
|
)
|
||
|
|
||
|
@property
|
||
|
def redux_state_rqs(self):
|
||
|
return self.driver.execute_script(
|
||
|
"""
|
||
|
|
||
|
// Check for legacy `pendingCallbacks` store prop (compatibility for Dash matrix testing)
|
||
|
var pendingCallbacks = window.store.getState().pendingCallbacks;
|
||
|
if (pendingCallbacks) {
|
||
|
return pendingCallbacks.map(function(cb) {
|
||
|
var out = {};
|
||
|
for (var key in cb) {
|
||
|
if (typeof cb[key] !== 'function') { out[key] = cb[key]; }
|
||
|
}
|
||
|
return out;
|
||
|
});
|
||
|
}
|
||
|
|
||
|
// Otherwise, use the new `callbacks` store prop
|
||
|
var callbacksState = Object.assign({}, window.store.getState().callbacks);
|
||
|
delete callbacksState.stored;
|
||
|
delete callbacksState.completed;
|
||
|
|
||
|
return Array.prototype.concat.apply([], Object.values(callbacksState));
|
||
|
"""
|
||
|
)
|
||
|
|
||
|
@property
|
||
|
def redux_state_is_loading(self):
|
||
|
return self.driver.execute_script(
|
||
|
"""
|
||
|
return window.store.getState().isLoading;
|
||
|
"""
|
||
|
)
|
||
|
|
||
|
@property
|
||
|
def window_store(self):
|
||
|
return self.driver.execute_script("return window.store")
|
||
|
|
||
|
def _wait_for_callbacks(self):
|
||
|
return (not self.window_store) or self.redux_state_rqs == []
|
||
|
|
||
|
def get_local_storage(self, store_id="local"):
|
||
|
return self.driver.execute_script(
|
||
|
f"return JSON.parse(window.localStorage.getItem('{store_id}'));"
|
||
|
)
|
||
|
|
||
|
def get_session_storage(self, session_id="session"):
|
||
|
return self.driver.execute_script(
|
||
|
f"return JSON.parse(window.sessionStorage.getItem('{session_id}'));"
|
||
|
)
|
||
|
|
||
|
def clear_local_storage(self):
|
||
|
self.driver.execute_script("window.localStorage.clear()")
|
||
|
|
||
|
def clear_session_storage(self):
|
||
|
self.driver.execute_script("window.sessionStorage.clear()")
|
||
|
|
||
|
def clear_storage(self):
|
||
|
self.clear_local_storage()
|
||
|
self.clear_session_storage()
|