diff options
Diffstat (limited to 'testing/marionette/puppeteer/firefox/firefox_puppeteer/ui/update_wizard/wizard.py')
-rw-r--r-- | testing/marionette/puppeteer/firefox/firefox_puppeteer/ui/update_wizard/wizard.py | 291 |
1 files changed, 291 insertions, 0 deletions
diff --git a/testing/marionette/puppeteer/firefox/firefox_puppeteer/ui/update_wizard/wizard.py b/testing/marionette/puppeteer/firefox/firefox_puppeteer/ui/update_wizard/wizard.py new file mode 100644 index 0000000000..9687ac9178 --- /dev/null +++ b/testing/marionette/puppeteer/firefox/firefox_puppeteer/ui/update_wizard/wizard.py @@ -0,0 +1,291 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this file, +# You can obtain one at http://mozilla.org/MPL/2.0/. + +from marionette_driver import By, Wait + +from firefox_puppeteer.ui.base import UIBaseLib +from firefox_puppeteer.ui.deck import Panel + + +class Wizard(UIBaseLib): + + def __init__(self, *args, **kwargs): + super(Wizard, self).__init__(*args, **kwargs) + + Wait(self.marionette).until( + lambda _: self.selected_panel, + message='No panel has been selected by default.') + + def _create_panel_for_id(self, panel_id): + """Creates an instance of :class:`Panel` for the specified panel id. + + :param panel_id: The ID of the panel to create an instance of. + + :returns: :class:`Panel` instance + """ + mapping = {'checking': CheckingPanel, + 'downloading': DownloadingPanel, + 'dummy': DummyPanel, + 'errorpatching': ErrorPatchingPanel, + 'errors': ErrorPanel, + 'errorextra': ErrorExtraPanel, + 'finished': FinishedPanel, + 'finishedBackground': FinishedBackgroundPanel, + 'manualUpdate': ManualUpdatePanel, + 'noupdatesfound': NoUpdatesFoundPanel, + 'updatesfoundbasic': UpdatesFoundBasicPanel, + + # TODO: Remove once we no longer support version Firefox 45.0ESR + 'incompatibleCheck': IncompatibleCheckPanel, + 'incompatibleList': IncompatibleListPanel, + } + + panel = self.element.find_element(By.ID, panel_id) + return mapping.get(panel_id, Panel)(self.marionette, self.window, panel) + + # Properties for visual buttons of the wizard # + + @property + def _buttons(self): + return self.element.find_element(By.ANON_ATTRIBUTE, {'anonid': 'Buttons'}) + + @property + def cancel_button(self): + return self._buttons.find_element(By.ANON_ATTRIBUTE, {'dlgtype': 'cancel'}) + + @property + def extra1_button(self): + return self._buttons.find_element(By.ANON_ATTRIBUTE, {'dlgtype': 'extra1'}) + + @property + def extra2_button(self): + return self._buttons.find_element(By.ANON_ATTRIBUTE, {'dlgtype': 'extra2'}) + + @property + def previous_button(self): + return self._buttons.find_element(By.ANON_ATTRIBUTE, {'dlgtype': 'back'}) + + @property + def finish_button(self): + return self._buttons.find_element(By.ANON_ATTRIBUTE, {'dlgtype': 'finish'}) + + @property + def next_button(self): + return self._buttons.find_element(By.ANON_ATTRIBUTE, {'dlgtype': 'next'}) + + # Properties for visual panels of the wizard # + + @property + def checking(self): + """The checking for updates panel. + + :returns: :class:`CheckingPanel` instance. + """ + return self._create_panel_for_id('checking') + + @property + def downloading(self): + """The downloading panel. + + :returns: :class:`DownloadingPanel` instance. + """ + return self._create_panel_for_id('downloading') + + @property + def dummy(self): + """The dummy panel. + + :returns: :class:`DummyPanel` instance. + """ + return self._create_panel_for_id('dummy') + + @property + def error_patching(self): + """The error patching panel. + + :returns: :class:`ErrorPatchingPanel` instance. + """ + return self._create_panel_for_id('errorpatching') + + @property + def error(self): + """The errors panel. + + :returns: :class:`ErrorPanel` instance. + """ + return self._create_panel_for_id('errors') + + @property + def error_extra(self): + """The error extra panel. + + :returns: :class:`ErrorExtraPanel` instance. + """ + return self._create_panel_for_id('errorextra') + + @property + def finished(self): + """The finished panel. + + :returns: :class:`FinishedPanel` instance. + """ + return self._create_panel_for_id('finished') + + @property + def finished_background(self): + """The finished background panel. + + :returns: :class:`FinishedBackgroundPanel` instance. + """ + return self._create_panel_for_id('finishedBackground') + + @property + def incompatible_check(self): + """The incompatible check panel. + + :returns: :class:`IncompatibleCheckPanel` instance. + """ + return self._create_panel_for_id('incompatibleCheck') + + @property + def incompatible_list(self): + """The incompatible list panel. + + :returns: :class:`IncompatibleListPanel` instance. + """ + return self._create_panel_for_id('incompatibleList') + + @property + def manual_update(self): + """The manual update panel. + + :returns: :class:`ManualUpdatePanel` instance. + """ + return self._create_panel_for_id('manualUpdate') + + @property + def no_updates_found(self): + """The no updates found panel. + + :returns: :class:`NoUpdatesFoundPanel` instance. + """ + return self._create_panel_for_id('noupdatesfound') + + @property + def updates_found_basic(self): + """The updates found panel. + + :returns: :class:`UpdatesFoundPanel` instance. + """ + return self._create_panel_for_id('updatesfoundbasic') + + @property + def panels(self): + """List of all the available :class:`Panel` instances. + + :returns: List of :class:`Panel` instances. + """ + panels = self.marionette.execute_script(""" + let wizard = arguments[0]; + let panels = []; + + for (let index = 0; index < wizard.children.length; index++) { + if (wizard.children[index].id) { + panels.push(wizard.children[index].id); + } + } + + return panels; + """, script_args=[self.element]) + + return [self._create_panel_for_id(panel) for panel in panels] + + @property + def selected_index(self): + """The index of the currently selected panel. + + :return: Index of the selected panel. + """ + return int(self.element.get_property('pageIndex')) + + @property + def selected_panel(self): + """A :class:`Panel` instance of the currently selected panel. + + :returns: :class:`Panel` instance. + """ + return self._create_panel_for_id(self.element.get_attribute('currentpageid')) + + +class CheckingPanel(Panel): + + @property + def progress(self): + """The DOM element which represents the progress meter. + + :returns: Reference to the progress element. + """ + return self.element.find_element(By.ID, 'checkingProgress') + + +class DownloadingPanel(Panel): + + @property + def progress(self): + """The DOM element which represents the progress meter. + + :returns: Reference to the progress element. + """ + return self.element.find_element(By.ID, 'downloadProgress') + + +class DummyPanel(Panel): + pass + + +class ErrorPatchingPanel(Panel): + pass + + +class ErrorPanel(Panel): + pass + + +class ErrorExtraPanel(Panel): + pass + + +class FinishedPanel(Panel): + pass + + +class FinishedBackgroundPanel(Panel): + pass + + +class IncompatibleCheckPanel(Panel): + + @property + def progress(self): + """The DOM element which represents the progress meter. + + :returns: Reference to the progress element. + """ + return self.element.find_element(By.ID, 'incompatibleCheckProgress') + + +class IncompatibleListPanel(Panel): + pass + + +class ManualUpdatePanel(Panel): + pass + + +class NoUpdatesFoundPanel(Panel): + pass + + +class UpdatesFoundBasicPanel(Panel): + pass |