Source code for gaiatest.apps.email.app

# 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 expected, By, Wait

from gaiatest.apps.base import Base
from gaiatest.apps.base import PageRegion
from gaiatest.apps.email.regions.setup import SetupEmail
from gaiatest.apps.email.regions.setup import ManualSetupEmail
from gaiatest.apps.email.regions.settings import Settings
from gaiatest.apps.email.regions.google import GoogleLogin


[docs]class Email(Base): name = 'E-Mail' _email_locator = (By.CSS_SELECTOR, '#cardContainer .msg-header-item:not([data-index="-1"])') _syncing_locator = (By.CSS_SELECTOR, '#cardContainer .msg-messages-syncing > .small') _manual_setup_locator = (By.CSS_SELECTOR, '#cardContainer .sup-manual-config-btn') _message_list_locator = (By.CSS_SELECTOR, 'cards-message-list') _setup_account_info = (By.TAG_NAME, 'cards-setup-account-info') _setup_manual_config = (By.TAG_NAME, 'cards-setup-manual-config') _folder_picker_locator = (By.TAG_NAME, 'cards-folder-picker') _settings_main_locator = (By.TAG_NAME, 'cards-settings-main') _settings_account_locator = (By.TAG_NAME, 'cards-settings-account') _confirm_dialog_locator = (By.TAG_NAME, 'cards-confirm-dialog') _refresh_button_locator = (By.CLASS_NAME, 'msg-refresh-btn') _search_textbox_locator = (By.CSS_SELECTOR, 'form[role="search"]') _email_subject_locator = (By.XPATH, '//a[@data-index!="-1"]/div/span[text()="%s"]') _back_button_locator = (By.CLASS_NAME, 'sup-back-btn') emails_list_header_locator = (By.CSS_SELECTOR, '.msg-list-header')
[docs] def basic_setup_email(self, name, email, password): setup = SetupEmail(self.marionette) setup.type_name(name) setup.type_email(email) setup.tap_next() google_login = GoogleLogin(self.marionette) # check if the google autocomplete on email field works as expected assert google_login.email == email # dismiss the keyboard and return to the correct frame google_login.keyboard.dismiss() google_login.switch_to_frame() google_login.tap_next() google_login.type_password(password) google_login.tap_sign_in() # approve access to your account google_login.wait_for_approve_access() google_login.tap_approve_access() self.apps.switch_to_displayed_app() setup.tap_account_prefs_next() setup.wait_for_setup_complete() setup.tap_continue() self.wait_for_message_list()
[docs] def setup_IMAP_email(self, imap, smtp): basic_setup = SetupEmail(self.marionette) basic_setup.type_name('IMAP account') basic_setup.type_email(imap['email']) setup = self.tap_manual_setup() setup.select_account_type('IMAP+SMTP') setup.type_imap_hostname(imap['hostname']) setup.type_imap_name(imap['username']) setup.type_imap_password(imap['password']) setup.type_imap_port(imap['port']) setup.type_smtp_hostname(smtp['hostname']) setup.type_smtp_name(smtp['username']) setup.type_smtp_password(smtp['password']) setup.type_smtp_port(smtp['port']) setup.tap_next() setup.check_for_emails_interval('20000') setup.tap_account_prefs_next() setup.wait_for_setup_complete() setup.tap_continue() self.wait_for_message_list()
[docs] def setup_active_sync_email(self, active_sync): basic_setup = SetupEmail(self.marionette) basic_setup.type_name('ActiveSync account') basic_setup.type_email(active_sync['email']) setup = self.tap_manual_setup() setup.select_account_type('ActiveSync') setup.type_password(active_sync['password']) setup.type_activesync_hostname(active_sync['hostname']) setup.type_activesync_name(active_sync['username']) setup.tap_next() setup.check_for_emails_interval('20000') setup.tap_account_prefs_next() setup.wait_for_setup_complete() setup.tap_continue() self.wait_for_message_list()
[docs] def delete_email_account(self, index): toolbar = self.header.tap_menu() toolbar.tap_settings() settings = Settings(self.marionette) account_settings = settings.email_accounts[index].tap() delete_confirmation = account_settings.tap_delete() delete_confirmation.tap_delete()
[docs] def tap_manual_setup(self): manual_setup = Wait(self.marionette).until( expected.element_present(*self._manual_setup_locator)) Wait(self.marionette).until(expected.element_displayed(manual_setup)) manual_setup.tap() return ManualSetupEmail(self.marionette)
[docs] def a11y_click_manual_setup(self): manual_setup = Wait(self.marionette).until( expected.element_present(*self._manual_setup_locator)) Wait(self.marionette).until(expected.element_displayed(manual_setup)) self.accessibility.click(manual_setup) return ManualSetupEmail(self.marionette)
[docs] def a11y_navigate_to_manual_setup(self, name, email): setup = SetupEmail(self.marionette) setup.type_name(name) setup.type_email(email) setup = self.a11y_click_manual_setup()
@property def header(self): return Header(self.marionette, self.marionette.find_element(*self.emails_list_header_locator)) @property def toolbar(self): return ToolBar(self.marionette) @property def mails(self): return [Message(self.marionette, mail) for mail in self.marionette.find_elements(*self._email_locator)]
[docs] def wait_for_emails_to_sync(self): element = self.marionette.find_element(*self._refresh_button_locator) Wait(self.marionette, timeout=60).until( lambda m: element.get_attribute( 'data-state') == 'synchronized')
[docs] def wait_for_message_list(self): element = self.marionette.find_element(*self._message_list_locator) Wait(self.marionette).until( lambda m: element.is_displayed() and element.location['x'] == 0)
[docs] def wait_for_search_textbox_displayed(self): Wait(self.marionette).until(expected.element_displayed(*self._search_textbox_locator))
[docs] def tap_email_subject(self, subject): subject_locator = ( self._email_subject_locator[0], self._email_subject_locator[1] % subject ) self.marionette.find_element(*subject_locator).tap() from gaiatest.apps.email.regions.read_email import ReadEmail return ReadEmail(self.marionette)
[docs] def wait_for_email(self, subject, timeout=120): Wait(self.marionette, timeout, interval=5).until( self.email_exists(self, subject))
[docs] class email_exists(object): def __init__(self, app, subject): self.app = app self.subject = subject def __call__(self, marionette): if self.subject in [mail.subject for mail in self.app.mails]: return True else: self.app.toolbar.tap_refresh() self.app.wait_for_emails_to_sync() self.app.mails[0].scroll_to_message() return False
[docs]class ToolBar(Base): _toolbar_locator = (By.CSS_SELECTOR, '#cardContainer .card.center .fld-nav-toolbar') _refresh_locator = (By.CSS_SELECTOR, '#cardContainer .card.center .msg-refresh-btn') _search_locator = (By.CSS_SELECTOR, '#cardContainer .card.center .msg-search-btn') _edit_locator = (By.CSS_SELECTOR, '#cardContainer .card.center .msg-edit-btn') _settings_locator = (By.CSS_SELECTOR, '#cardContainer .card.center .fld-nav-settings-btn') _settings_a11y_locator = (By.CSS_SELECTOR, '#cardContainer .card.center .fld-nav-toolbar.bottom-toolbar')
[docs] def tap_refresh(self): refresh = Wait(self.marionette).until( expected.element_present(*self._refresh_locator)) Wait(self.marionette).until(expected.element_displayed(refresh)) refresh.tap()
[docs] def tap_edit(self): edit = Wait(self.marionette).until( expected.element_present(*self._edit_locator)) Wait(self.marionette).until(expected.element_displayed(edit)) edit.tap()
[docs] def a11y_click_settings(self): settings = Wait(self.marionette).until( expected.element_present(*self._settings_a11y_locator)) Wait(self.marionette).until(lambda m: self.accessibility.is_visible(settings)) self.accessibility.click(settings) return Settings(self.marionette)
[docs] def tap_settings(self): settings = Wait(self.marionette).until( expected.element_present(*self._settings_locator)) Wait(self.marionette).until(expected.element_displayed(settings)) settings.tap()
@property def is_visible(self): return self.marionette.find_element(*self._toolbar_locator).location['x'] == 0 @property def is_a11y_visible(self): return self.accessibility.is_visible(self.marionette.find_element(*self._toolbar_locator)) @property def is_refresh_visible(self): return self.is_element_displayed(*self._refresh_locator) @property def is_search_visible(self): return self.is_element_displayed(*self._search_locator) @property def is_edit_visible(self): return self.is_element_displayed(*self._edit_locator) @property def is_settings_visible(self): return self.is_element_displayed(*self._settings_locator)
[docs]class Message(PageRegion): _subject_locator = (By.CSS_SELECTOR, '.msg-header-subject') _senders_email_locator = (By.CSS_SELECTOR, '.msg-header-author') @property def subject(self): return self.root_element.find_element(*self._subject_locator).text @property def senders_email(self): return self.root_element.find_element(*self._senders_email_locator).text
[docs] def scroll_to_message(self): self.marionette.execute_script("arguments[0].scrollIntoView(false);", [self.root_element])