def destroy(driver: WebDriver, tries: int = 2) -> None: """Destroy a driver""" # This is some very flaky code in selenium. Hence the retries # and catch-all exceptions try: retry_call(driver.close, max_tries=tries) except Exception: # pylint: disable=broad-except pass try: driver.quit() except Exception: # pylint: disable=broad-except pass
def destroy_webdriver( driver: Union[chrome.webdriver.WebDriver, firefox.webdriver.WebDriver] ) -> None: """ Destroy a driver """ # This is some very flaky code in selenium. Hence the retries # and catch-all exceptions try: retry_call(driver.close, max_tries=2) except Exception: # pylint: disable=broad-except pass try: driver.quit() except Exception: # pylint: disable=broad-except pass
def validate(self) -> None: """ Validate the query result as a Pandas DataFrame """ # When there are transient errors when executing queries, users will get # notified with the error stacktrace which can be avoided by retrying df = retry_call( self._execute_query, exception=AlertQueryError, max_tries=app.config["ALERT_REPORTS_QUERY_EXECUTION_MAX_TRIES"], ) if df.empty and self._is_validator_not_null: self._result = None return if df.empty and self._is_validator_operator: self._result = 0.0 return rows = df.to_records() if self._is_validator_not_null: self._validate_not_null(rows) return self._validate_operator(rows)
def _get_slice_visualization(slc: Slice, delivery_type: EmailDeliveryType, session: Session) -> ReportContent: # Create a driver, fetch the page, wait for the page to render driver = create_webdriver(session) window = config["WEBDRIVER_WINDOW"]["slice"] driver.set_window_size(*window) slice_url = _get_url_path("Superset.slice", slice_id=slc.id) slice_url_user_friendly = _get_url_path("Superset.slice", slice_id=slc.id, user_friendly=True) driver.get(slice_url) time.sleep(EMAIL_PAGE_RENDER_WAIT) # Set up a function to retry once for the element. # This is buggy in certain selenium versions with firefox driver element = retry_call( driver.find_element_by_class_name, fargs=["chart-container"], max_tries=2, interval=EMAIL_PAGE_RENDER_WAIT, ) try: screenshot = element.screenshot_as_png except WebDriverException: # Some webdrivers do not support screenshots for elements. # In such cases, take a screenshot of the entire page. screenshot = driver.screenshot() finally: destroy_webdriver(driver) # Generate the email body and attachments return _generate_report_content(delivery_type, screenshot, slc.slice_name, slice_url_user_friendly)
def deliver_dashboard( # pylint: disable=too-many-locals dashboard_id: int, recipients: Optional[str], slack_channel: Optional[str], delivery_type: EmailDeliveryType, deliver_as_group: bool, ) -> None: """ Given a schedule, delivery the dashboard as an email report """ with session_scope(nullpool=True) as session: dashboard = session.query(Dashboard).filter_by(id=dashboard_id).one() dashboard_url = _get_url_path("Superset.dashboard", dashboard_id_or_slug=dashboard.id) dashboard_url_user_friendly = _get_url_path( "Superset.dashboard", user_friendly=True, dashboard_id_or_slug=dashboard.id) # Create a driver, fetch the page, wait for the page to render driver = create_webdriver(session) window = config["WEBDRIVER_WINDOW"]["dashboard"] driver.set_window_size(*window) driver.get(dashboard_url) time.sleep(EMAIL_PAGE_RENDER_WAIT) # Set up a function to retry once for the element. # This is buggy in certain selenium versions with firefox driver get_element = getattr(driver, "find_element_by_class_name") element = retry_call( get_element, fargs=["grid-container"], max_tries=2, interval=EMAIL_PAGE_RENDER_WAIT, ) try: screenshot = element.screenshot_as_png except WebDriverException: # Some webdrivers do not support screenshots for elements. # In such cases, take a screenshot of the entire page. screenshot = driver.screenshot() finally: destroy_webdriver(driver) # Generate the email body and attachments report_content = _generate_report_content( delivery_type, screenshot, dashboard.dashboard_title, dashboard_url_user_friendly, ) subject = __( "%(prefix)s %(title)s", prefix=config["EMAIL_REPORTS_SUBJECT_PREFIX"], title=dashboard.dashboard_title, ) if recipients: _deliver_email( recipients, deliver_as_group, subject, report_content.body, report_content.data, report_content.images, ) if slack_channel: deliver_slack_msg( slack_channel, subject, report_content.slack_message, report_content.slack_attachment, )