Skip to content

Commit fe27997

Browse files
committed
fix: implement smart login with state-aware authentication flow
1 parent 32cd757 commit fe27997

File tree

1 file changed

+102
-49
lines changed

1 file changed

+102
-49
lines changed

sample/Tests/test/test_windows.py

Lines changed: 102 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -28,61 +28,114 @@ def restart_app_and_altdriver(self):
2828
self.__class__.altdriver = AltDriver(timeout=120)
2929

3030
def login(self):
31-
# Wait for unauthenticated screen
32-
self.get_altdriver().wait_for_current_scene_to_be("UnauthenticatedScene")
33-
34-
for attempt in range(2):
31+
"""
32+
Smart login method that handles different app states:
33+
- UnauthenticatedScene: Proceed with normal login
34+
- AuthenticatedScene: Logout first, then login
35+
- Other scenes: Wait for proper state
36+
"""
37+
print("=== SMART LOGIN: Checking app state ===")
38+
39+
# Check what scene we're starting in
40+
try:
41+
current_scene = self.get_altdriver().get_current_scene()
42+
print(f"Current scene: {current_scene}")
43+
except Exception as e:
44+
print(f"Could not get current scene: {e}")
45+
raise SystemExit("Failed to determine app state")
46+
47+
# Handle different starting states
48+
if current_scene == "UnauthenticatedScene":
49+
print("[OK] App is already unauthenticated - proceeding with login")
50+
self._perform_login()
51+
52+
elif current_scene == "AuthenticatedScene":
53+
print("[WARNING] App is already authenticated - need to logout first")
54+
self._logout_and_login()
55+
56+
else:
57+
print(f"[ERROR] Unexpected scene: {current_scene}")
58+
# Try to wait for a known state
59+
print("Waiting for app to reach a known state...")
60+
for wait_attempt in range(3):
61+
try:
62+
current_scene = self.get_altdriver().get_current_scene()
63+
if current_scene in ["UnauthenticatedScene", "AuthenticatedScene"]:
64+
print(f"App reached known state: {current_scene}")
65+
return self.login() # Recursive call with known state
66+
time.sleep(5)
67+
except Exception as e:
68+
print(f"Wait attempt {wait_attempt + 1} failed: {e}")
69+
70+
raise SystemExit(f"App stuck in unknown scene: {current_scene}")
71+
72+
def _perform_login(self):
73+
"""Perform normal login flow when app is in UnauthenticatedScene"""
74+
try:
75+
# Check for login button
76+
login_button = self.get_altdriver().find_object(By.NAME, "LoginBtn")
77+
print("Found login button - performing login")
78+
79+
# Login
80+
launch_browser()
81+
bring_sample_app_to_foreground()
82+
login_button.tap()
83+
login()
84+
bring_sample_app_to_foreground()
85+
86+
# Wait for authenticated screen
87+
self.get_altdriver().wait_for_current_scene_to_be("AuthenticatedScene")
88+
stop_browser()
89+
print("[SUCCESS] Login successful")
90+
91+
except Exception as err:
92+
stop_browser()
93+
raise SystemExit(f"Login failed: {err}")
94+
95+
def _logout_and_login(self):
96+
"""Handle logout and then login when app starts authenticated"""
97+
print("Attempting logout to reset to unauthenticated state...")
98+
99+
try:
100+
# Use our improved logout method
101+
print("Using controlled browser logout...")
102+
logout_with_controlled_browser()
103+
104+
# Wait for unauthenticated state
105+
print("Waiting for UnauthenticatedScene after logout...")
106+
self.get_altdriver().wait_for_current_scene_to_be("UnauthenticatedScene", timeout=30)
107+
print("[SUCCESS] Successfully logged out")
108+
109+
# Now perform normal login
110+
self._perform_login()
111+
112+
except Exception as logout_err:
113+
print(f"Controlled logout failed: {logout_err}")
114+
print("Trying fallback logout method...")
115+
35116
try:
36-
# Check app state
37-
login_button = self.get_altdriver().find_object(By.NAME, "LoginBtn")
38-
print("Found login button, app is in the correct state")
39-
40-
# Login
41-
print("Logging in...")
117+
# Fallback: Direct logout button approach
42118
launch_browser()
43119
bring_sample_app_to_foreground()
44-
login_button.tap()
45-
login()
120+
logout_button = self.get_altdriver().find_object(By.NAME, "LogoutBtn")
121+
logout_button.tap()
122+
time.sleep(10) # Give more time for logout
46123
bring_sample_app_to_foreground()
47-
48-
# Wait for authenticated screen
49-
self.get_altdriver().wait_for_current_scene_to_be("AuthenticatedScene")
124+
125+
# Wait for unauthenticated screen
126+
self.get_altdriver().wait_for_current_scene_to_be("UnauthenticatedScene", timeout=30)
50127
stop_browser()
51-
print("Logged in")
52-
return
53-
except Exception as err:
128+
print("[SUCCESS] Fallback logout successful")
129+
130+
# Now perform normal login
131+
self._perform_login()
132+
133+
except Exception as fallback_err:
54134
stop_browser()
55-
56-
if attempt == 0:
57-
# Reset app
58-
59-
# Relogin (optional: only if the button is present)
60-
print("Try reset the app and log out once...")
61-
try:
62-
self.get_altdriver().wait_for_object(By.NAME, "ReloginBtn").tap()
63-
except Exception as e:
64-
print("ReloginBtn not found, skipping relogin step. User may already be in AuthenticatedScene.")
65-
66-
# Wait for authenticated screen
67-
self.get_altdriver().wait_for_current_scene_to_be("AuthenticatedScene")
68-
print("Re-logged in")
69-
70-
# Logout
71-
print("Logging out...")
72-
launch_browser()
73-
bring_sample_app_to_foreground()
74-
self.get_altdriver().find_object(By.NAME, "LogoutBtn").tap()
75-
time.sleep(5)
76-
bring_sample_app_to_foreground()
77-
78-
# Wait for unauthenticated screen
79-
self.get_altdriver().wait_for_current_scene_to_be("UnauthenticatedScene")
80-
stop_browser()
81-
print("Logged out and successfully reset app")
82-
83-
time.sleep(5)
84-
else:
85-
raise SystemExit(f"Failed to reset app {err}")
135+
print(f"[ERROR] Both logout methods failed:")
136+
print(f" - Controlled logout: {logout_err}")
137+
print(f" - Fallback logout: {fallback_err}")
138+
raise SystemExit("Could not logout to reset app state")
86139

87140
def test_1_login(self):
88141
print("=" * 60)

0 commit comments

Comments
 (0)