Source code for gaiatest.apps.lockscreen.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 datetime import datetime

from marionette_driver import expected, By, Wait
from marionette_driver.marionette import Actions

from gaiatest.apps.base import Base
from gaiatest.apps.base import PageRegion
from gaiatest.apps.homescreen.app import Homescreen
from gaiatest.apps.camera.app import Camera
from gaiatest.apps.lockscreen.regions.passcode_pad import PasscodePad


[docs]class LockScreen(Base): _lockscreen_window_locator = (By.CLASS_NAME, 'lockScreenWindow') _lockscreen_locator = (By.ID, 'lockscreen') _lockscreen_handle_locator = (By.ID, 'lockscreen-area-slide') _lockscreen_passcode_code_locator = (By.ID, 'lockscreen-passcode-code') _lockscreen_passcode_pad_locator = (By.ID, 'lockscreen-passcode-pad') _unlock_button_locator = (By.ID, 'lockscreen-area-unlock') _camera_button_locator = (By.ID, 'lockscreen-area-camera') _lockscreen_container_locator = (By.ID, 'notifications-lockscreen-container') _notification_locator = (By.CSS_SELECTOR, '#notifications-lockscreen-container > div.notification') _time_locator = (By.ID, 'lockscreen-clock-time')
[docs] def switch_to_frame(self): # XXX: Because we're not in frame yet. LockScreen team now is # trying hard to do decoupling & as-iframe at the same time, # but iframe now stuck at weird test failures, so the team decide # to land decoupling part first, with some dummy functions that # can be modified later to fit the implementation. # # If we finished to make it as an iframe, to this to switch # to the real frame: # # self.marionette.switch_to_frame( # self.marionette.find_element(*self._lockscreen_frame_locator)); # # But now we're not ready to do that yet. self.marionette.switch_to_frame()
@property def time(self): # The lockscreen doesn't display AM/PM since 2.0. It's still present behind a hidden span though. lockscreen_time = self.marionette.execute_script( "return document.getElementById('%s').innerHTML" % self._time_locator[1]) return lockscreen_time.replace('<span>', '').replace('</span>', '') @property def time_in_datetime(self): return datetime.strptime(self.time, '%I:%M %p')
[docs] def unlock(self): self._slide_to_unlock('homescreen') self.wait_for_lockscreen_not_visible() return Homescreen(self.marionette)
[docs] def unlock_to_camera(self): Wait(self.marionette).until(expected.element_displayed(*self._lockscreen_handle_locator)) self._slide_to_unlock('camera') return Camera(self.marionette)
[docs] def unlock_to_emergency_call(self): passcode_pad = self.unlock_to_passcode_pad() return passcode_pad.tap_emergency_call()
[docs] def unlock_to_passcode_pad(self): Wait(self.marionette).until(expected.element_displayed(*self._lockscreen_handle_locator)) self._slide_to_unlock('homescreen') Wait(self.marionette).until( expected.element_displayed(*self._lockscreen_passcode_code_locator)) return PasscodePad(self.marionette)
[docs] def unlock_to_homescreen_using_passcode(self, passcode): passcode_pad = self.unlock_to_passcode_pad() homescreen = passcode_pad.type_passcode(passcode) self.wait_for_lockscreen_not_visible() return homescreen
def _slide_to_unlock(self, destination): lockscreen_handle = self.marionette.find_element(*self._lockscreen_handle_locator) lockscreen_handle_x_centre = int(lockscreen_handle.size['width'] / 2) lockscreen_handle_y_centre = int(lockscreen_handle.size['height'] / 2) handle_destination = lockscreen_handle.size['width'] if destination == 'camera': handle_destination *= -1 # Flick lockscreen handle to the destination Actions(self.marionette).flick( lockscreen_handle, lockscreen_handle_x_centre, lockscreen_handle_y_centre, handle_destination, 0 ).perform()
[docs] def wait_for_lockscreen_not_visible(self): Wait(self.marionette).until(expected.element_not_displayed(*self._lockscreen_locator))
[docs] def wait_for_notification(self): Wait(self.marionette).until(expected.element_displayed(*self._notification_locator))
[docs] def a11y_click_unlock_button(self): self.accessibility.click(self.marionette.find_element(*self._unlock_button_locator)) return Homescreen(self.marionette)
[docs] def a11y_click_camera_button(self): self.accessibility.click(self.marionette.find_element(*self._camera_button_locator)) return Camera(self.marionette)
@property def notifications(self): container = self.marionette.find_element(*self._lockscreen_container_locator) # Avoid the search timeout when there are no notifications if not container.is_displayed() or container.text == '': return [] return [Notification(self.marionette, element) for element in self.marionette.find_elements(*self._notification_locator)]
[docs]class Notification(PageRegion): _body_locator = (By.CSS_SELECTOR, 'div.detail') _title_locator = (By.CSS_SELECTOR, 'div.title') @property def is_visible(self): return self.root_element.is_displayed() @property def content(self): return self.root_element.find_element(*self._body_locator).text @property def title(self): return self.root_element.find_element(*self._title_locator).text