Files
QSfera/Desktop/test/gui/pageObjects/AccountConnectionWizard.py
T
Курнат Андрей 2315f25754 Initial QSfera import
2026-06-07 10:20:04 +03:00

237 lines
8.1 KiB
Python

import os
from types import SimpleNamespace
from appium.webdriver.common.appiumby import AppiumBy as By
from helpers.WebUIHelper import authorize_via_webui
from helpers.ConfigHelper import get_config
from helpers.SetupClientHelper import (
create_user_sync_path,
get_temp_resource_path,
set_current_user_sync_path,
)
from helpers.SyncHelper import listen_sync_status_for_item
from helpers.AppHelper import app
class AccountConnectionWizard:
SERVER_ADDRESS_BOX = SimpleNamespace(
by=By.ACCESSIBILITY_ID,
selector="QApplication.Settings.centralwidget.dialogStack.SetupWizardWidget.contentWidget.ServerUrlSetupWizardPage.urlLineEdit",
)
NEXT_BUTTON = SimpleNamespace(
by=By.ACCESSIBILITY_ID,
selector="QApplication.Settings.centralwidget.dialogStack.SetupWizardWidget.nextButton",
)
ACCEPT_CERTIFICATE_YES = SimpleNamespace(
by=By.NAME,
selector="Yes",
)
SELECT_LOCAL_FOLDER = SimpleNamespace(by=None, selector=None)
DIRECTORY_NAME_BOX = SimpleNamespace(
by=By.ACCESSIBILITY_ID,
selector="QApplication.Settings.centralwidget.dialogStack.SetupWizardWidget.contentWidget.AccountConfiguredWizardPage.advancedConfigGroupBox.advancedConfigGroupBoxContentWidget.localDirectoryGroupBox.chooseLocalDirectoryButton",
)
CHOOSE_FOLDER_BUTTON = SimpleNamespace(by=By.NAME, selector="Choose")
OAUTH_CREDENTIAL_PAGE = SimpleNamespace(by=None, selector=None)
COPY_URL_TO_CLIPBOARD_BUTTON = SimpleNamespace(
by=By.NAME,
selector="Copy URL",
)
CONF_SYNC_MANUALLY_RADIO_BUTTON = SimpleNamespace(
by=By.NAME, selector="Configure synchronization manually"
)
ADVANCED_CONFIGURATION_CHECKBOX = SimpleNamespace(
by=By.NAME,
selector="Advanced configuration",
)
DIRECTORY_NAME_EDIT_BOX = SimpleNamespace(
by=By.ACCESSIBILITY_ID,
selector="QApplication.QFileDialog.fileNameEdit",
)
SYNC_EVERYTHING_RADIO_BUTTON = SimpleNamespace(by=None, selector=None)
@staticmethod
def add_server(server_url):
url_input = app().find_element(
AccountConnectionWizard.SERVER_ADDRESS_BOX.by,
AccountConnectionWizard.SERVER_ADDRESS_BOX.selector,
)
url_input.clear()
url_input.send_keys(get_config("localBackendUrl"))
AccountConnectionWizard.next_step()
@staticmethod
def accept_certificate():
buttons = app().find_elements(
AccountConnectionWizard.ACCEPT_CERTIFICATE_YES.by,
AccountConnectionWizard.ACCEPT_CERTIFICATE_YES.selector,
)
# click the last button
last_button = buttons.pop()
last_button.click()
@staticmethod
def add_user_credentials(username, password):
AccountConnectionWizard.oidc_login(username, password)
@staticmethod
def oidc_login(username, password):
AccountConnectionWizard.browser_login(username, password)
@staticmethod
def copy_login_url():
app().find_element(
AccountConnectionWizard.COPY_URL_TO_CLIPBOARD_BUTTON.by,
AccountConnectionWizard.COPY_URL_TO_CLIPBOARD_BUTTON.selector,
).click()
@staticmethod
def browser_login(username, password):
AccountConnectionWizard.copy_login_url()
authorize_via_webui(username, password)
@staticmethod
def next_step():
app().find_element(
AccountConnectionWizard.NEXT_BUTTON.by,
AccountConnectionWizard.NEXT_BUTTON.selector,
).click()
@staticmethod
def select_sync_folder(user):
# create sync folder for user
sync_path = create_user_sync_path(user)
AccountConnectionWizard.select_advanced_config()
app().find_element(
AccountConnectionWizard.DIRECTORY_NAME_BOX.by,
AccountConnectionWizard.DIRECTORY_NAME_BOX.selector,
).click()
dir_location_input = app().find_element(
AccountConnectionWizard.DIRECTORY_NAME_EDIT_BOX.by,
AccountConnectionWizard.DIRECTORY_NAME_EDIT_BOX.selector,
)
dir_location_input.clear()
dir_location_input.send_keys(sync_path)
app().find_element(
AccountConnectionWizard.CHOOSE_FOLDER_BUTTON.by,
AccountConnectionWizard.CHOOSE_FOLDER_BUTTON.selector,
).click()
return os.path.join(sync_path, get_config('syncConnectionName'))
@staticmethod
def set_temp_folder_as_sync_folder(folder_name):
sync_path = get_temp_resource_path(folder_name)
# clear the current path
squish.mouseClick(
squish.waitForObject(AccountConnectionWizard.SELECT_LOCAL_FOLDER)
)
squish.waitForObject(AccountConnectionWizard.SELECT_LOCAL_FOLDER).setText("")
squish.type(
squish.waitForObject(AccountConnectionWizard.SELECT_LOCAL_FOLDER),
sync_path,
)
set_current_user_sync_path(sync_path)
return sync_path
@staticmethod
def add_account(account_details):
AccountConnectionWizard.add_account_information(account_details)
AccountConnectionWizard.next_step()
@staticmethod
def add_account_information(account_details):
if account_details["server"]:
AccountConnectionWizard.add_server(account_details["server"])
AccountConnectionWizard.accept_certificate()
if account_details["user"]:
AccountConnectionWizard.add_user_credentials(
account_details["user"],
account_details["password"],
)
sync_path = ""
if account_details["sync_folder"]:
AccountConnectionWizard.select_advanced_config()
sync_path = AccountConnectionWizard.set_temp_folder_as_sync_folder(
account_details["sync_folder"]
)
elif account_details["user"]:
sync_path = AccountConnectionWizard.select_sync_folder(
account_details["user"]
)
if sync_path:
# listen for sync status
listen_sync_status_for_item(sync_path)
@staticmethod
def select_manual_sync_folder_option():
app().find_element(
AccountConnectionWizard.CONF_SYNC_MANUALLY_RADIO_BUTTON.by,
AccountConnectionWizard.CONF_SYNC_MANUALLY_RADIO_BUTTON.selector,
).click()
@staticmethod
def select_download_everything_option():
squish.clickButton(
squish.waitForObject(AccountConnectionWizard.SYNC_EVERYTHING_RADIO_BUTTON)
)
@staticmethod
def is_new_connection_window_visible():
visible = False
try:
squish.waitForObject(AccountConnectionWizard.SERVER_ADDRESS_BOX)
visible = True
except:
pass
return visible
@staticmethod
def is_credential_window_visible():
visible = False
try:
squish.waitForObject(AccountConnectionWizard.OAUTH_CREDENTIAL_PAGE)
visible = True
except:
pass
return visible
@staticmethod
def select_advanced_config():
app().find_element(
AccountConnectionWizard.ADVANCED_CONFIGURATION_CHECKBOX.by,
AccountConnectionWizard.ADVANCED_CONFIGURATION_CHECKBOX.selector,
).click()
@staticmethod
def can_change_local_sync_dir():
can_change = False
try:
squish.waitForObjectExists(AccountConnectionWizard.SELECT_LOCAL_FOLDER)
squish.clickButton(
squish.waitForObject(AccountConnectionWizard.DIRECTORY_NAME_BOX)
)
squish.waitForObjectExists(AccountConnectionWizard.CHOOSE_FOLDER_BUTTON)
can_change = True
except:
pass
return can_change
@staticmethod
def is_sync_everything_option_checked():
return squish.waitForObjectExists(
AccountConnectionWizard.SYNC_EVERYTHING_RADIO_BUTTON
).checked
@staticmethod
def get_local_sync_path():
return str(
squish.waitForObjectExists(
AccountConnectionWizard.SELECT_LOCAL_FOLDER
).displayText
)