1
0
mirror of https://github.com/mail-in-a-box/mailinabox.git synced 2025-04-01 23:57:05 +00:00
mailinabox/tests/lib/python/browser/NextcloudAutomation.py
2024-09-20 15:16:21 -04:00

121 lines
4.0 KiB
Python

#####
##### This file is part of Mail-in-a-Box-LDAP which is released under the
##### terms of the GNU Affero General Public License as published by the
##### Free Software Foundation, either version 3 of the License, or (at
##### your option) any later version. See file LICENSE or go to
##### https://github.com/downtownallday/mailinabox-ldap for full license
##### details.
#####
from selenium.common.exceptions import (
NoSuchElementException,
ElementNotInteractableException,
ElementClickInterceptedException,
)
from .NcContactsAutomation import NcContactsAutomation
class NextcloudAutomation(object):
def __init__(self, d):
''' `d` is a browser.automation TestDriver object '''
self.d = d
def wait_for_login_screen(self, secs=7):
d = self.d
d.say("Wait for login screen")
d.wait_for_el('form[name=login] input#user', secs=secs)
def login(self, login, pw):
d = self.d
d.say("Login %s to Nextcloud", login)
d.find_el('input#user').send_text(login)
d.find_el('input#password').send_text(pw)
submit = d.find_el('button[type="submit"]', throws=False)
# submit button for nextcloud < 25 (jquery)
if not submit: submit = d.find_el('#submit-wrapper') # nc<25
submit.click()
def click_avatar(self):
d = self.d
d.say("click avatar")
el = d.find_el('#user-menu > a', throws=False)
if not el:
el = d.find_el('#user-menu > button', throws=False)
if not el:
# nc < 26
d.find_el('#settings .avatardiv').click()
else:
# nc >= 26
try:
el.click()
except ElementClickInterceptedException as e:
self.close_first_run_wizard()
el.click()
d.wait_tick(100)
def logout(self):
d = self.d
d.say("Logout of Nextcloud")
self.click_avatar()
el = d.find_el('a#logout', throws=False)
if not el:
# nc >= 29
el = d.find_el('[data-id="logout"] a', throws=False) # nc < 26
if not el:
# nc >= 26
el = d.find_el('#logout > a', throws=False)
if el:
el.click()
else:
raise NoSuchElementException('could not find logout link')
def open_contacts(self):
d = self.d
d.say("Open contacts")
# nc 25+
el = d.find_el('header [title="Contacts"]', throws=False)
if not el:
# nc < 29
el = d.find_el('header [data-app-id="contacts"]', throws=False)
if not el:
# nc < 25
el = d.find_el('header [data-id="contacts"]')
self.close_first_run_wizard()
el.click()
return NcContactsAutomation(self)
def wait_for_app_load(self, secs=7):
d = self.d
d.say("Wait for app to load")
# some apps are vue, some jquery (legacy)
vue = d.find_el('#app-content-vue', throws=False)
if not vue: vue = d.find_el('#app-dashboard', throws=False)
jquery = d.find_el('#app-content', throws=False)
if vue:
d.wait_tick(1000)
elif jquery:
d.say_verbose('Waiting on a jquery app')
d.wait_until_true('return window.$.active == 0', secs=secs)
else:
raise NoSuchElementException('#app-dashboard, #app-content or #app-content-vue')
def close_first_run_wizard(self):
d = self.d
firstrunwiz = d.find_el('#firstrunwizard', throws=False, quiet=True)
if firstrunwiz and not firstrunwiz.is_displayed():
d.say_verbose("wait for first run wizard to display")
d.sleep(1)
if firstrunwiz and firstrunwiz.is_displayed():
d.say_verbose("closing first run wizard")
# ElementNotInteractableException
# d.find_el('#firstrunwizard span.close-icon').click()
d.execute_script('document.querySelector("#firstrunwizard span.close-icon").click()')
d.wait_tick(1)