Fix login and logout flows for newer Kalamar versions
Change-Id: If7d15f1ada102f7201b97c76f277f2a1db41afb9
diff --git a/lib/korap_rc.js b/lib/korap_rc.js
index 5a650a4..158ecbb 100644
--- a/lib/korap_rc.js
+++ b/lib/korap_rc.js
@@ -18,8 +18,31 @@
if (username == "") return false;
if (password == "") return false;
+ // Check if already logged in as the correct user
+ const currentLoggedInUser = await page.evaluate(() => {
+ const profileBtn = document.querySelector('.dropdown-btn.profile');
+ if (profileBtn) {
+ const userNameEl = profileBtn.querySelector('.user-name');
+ return userNameEl ? userNameEl.textContent.trim() : null;
+ }
+ return null;
+ });
+
+ if (currentLoggedInUser === username) {
+ console.log(`Already logged in as ${username}`);
+ return true;
+ } else if (currentLoggedInUser) {
+ console.log(`Logged in as different user: ${currentLoggedInUser}. Logging out...`);
+ await this.logout(page);
+ await page.goto(this.korap_url, { waitUntil: 'domcontentloaded' });
+ }
+
await page.waitForSelector('.dropdown-btn', { visible: true });
- await page.click('.dropdown-btn');
+ const loginBtn = await page.$('.dropdown-btn.login') || await page.$('.dropdown-btn');
+ if (!loginBtn) {
+ return false;
+ }
+ await loginBtn.click();
await page.waitForSelector('input[name=handle_or_email]', { visible: true });
const username_field = await page.$("input[name=handle_or_email]")
if (username_field != null) {
@@ -35,7 +58,7 @@
await page.waitForNavigation({ waitUntil: 'domcontentloaded' }); // Wait for navigation after login
await page.waitForSelector("#q-field", { visible: true }); // Wait for query field to confirm login
- const logout = await page.$(".logout")
+ const logout = await page.$(".logout, a[data-testid=\"logout\"], .dropdown-btn.profile")
if (logout == null) {
return false
}
@@ -143,17 +166,36 @@
async logout(page) {
try {
- // Direct navigation to logout URL - most reliable method
- const currentUrl = await page.url();
- const logoutUrl = currentUrl.replace(/\/$/, '') + '/logout';
+ // First, try to find the logout link in the page
+ const logoutHref = await page.evaluate(() => {
+ const logoutEl = document.querySelector('a.logout, a[data-testid="logout"]');
+ return logoutEl ? logoutEl.getAttribute('href') : null;
+ });
- await page.goto(logoutUrl, { waitUntil: 'domcontentloaded', timeout: 10000 });
+ if (logoutHref) {
+ const absoluteLogoutUrl = new URL(logoutHref, page.url()).href;
+ await page.goto(absoluteLogoutUrl, { waitUntil: 'domcontentloaded', timeout: 10000 });
+ } else {
+ const currentUrl = await page.url();
+ const baseUrl = currentUrl.replace(/\/$/, '');
+ try {
+ await page.goto(baseUrl + '/user/logout', { waitUntil: 'domcontentloaded', timeout: 5000 });
+ } catch (e) {
+ await page.goto(baseUrl + '/logout', { waitUntil: 'domcontentloaded', timeout: 5000 });
+ }
+ }
// Navigate back to main page to ensure clean state for subsequent tests
await page.goto(this.korap_url, { waitUntil: 'domcontentloaded', timeout: 10000 });
- return true;
+ // Verify we are actually logged out
+ const loggedOut = await page.evaluate(() => {
+ return document.querySelector('a.logout, a[data-testid="logout"], .dropdown-btn.profile') === null;
+ });
+
+ return loggedOut;
} catch (error) {
+ console.error(`Logout failed: ${error.message}`);
return false;
}
}