playwright/tests/pages/LongiLoginPage.js
2025-03-04 17:13:49 +08:00

85 lines
3.2 KiB
JavaScript

/**
* 龙蛟IBP系统登录页面对象模型
*/
const BasePage = require('../utils/BasePage');
const { getEnv } = require('../utils/env');
class LongiLoginPage extends BasePage {
constructor(page) {
super(page);
// 页面元素选择器
this.selectors = {
usernameInput: 'input[name="username"]', // 用户名输入框
passwordInput: 'input[name="passWord"]', // 密码输入框
captchaInput: 'input[placeholder*="验证码"]', // 验证码输入框
captchaImage: 'img[style*="width: 78px"]', // 验证码图片
loginButton: 'button.el-button--large.container-button', // 登录按钮
loginButtonByText: 'button:text("登录"):not(:text("SSO登录"))', // 通过文本定位登录按钮
loginButtonFirst: 'button:has-text("登录")', // 通过文本定位登录按钮(使用first()方法)
errorMessage: '.el-form-item__error, .el-form-item.is-error', // 错误消息
ssoLoginButton: 'button:has-text("SSO登录")' // SSO登录按钮
};
// 设置超时时间
this.timeout = 10000;
}
/**
* 导航到登录页面
*/
async navigateToLoginPage() {
console.log('当前使用的 BASE_URL:', process.env.BASE_URL);
await this.navigate(process.env.BASE_URL);
}
/**
* 点击登录按钮
* @returns {Promise<boolean>} 是否成功点击登录按钮
*/
async clickLoginButton() {
try {
// 方法1: 使用更精确的选择器,指定包含特定类的按钮
await this.click(this.selectors.loginButton);
console.log('使用 container-button 类选择器成功点击登录按钮');
await this.waitForPageLoad();
return true;
} catch (error) {
console.log('第一种方法失败,尝试备用方法...');
try {
// 方法2: 使用精确文本匹配
await this.page.locator(this.selectors.loginButtonByText).click();
console.log('使用精确文本匹配成功点击登录按钮');
await this.waitForPageLoad();
return true;
} catch (secondError) {
console.log('第二种方法也失败,尝试第三种方法...');
try {
// 方法3: 使用first()选择第一个匹配的按钮
await this.page.locator(this.selectors.loginButtonFirst).first().click();
console.log('使用first()方法成功点击登录按钮');
await this.waitForPageLoad();
return true;
} catch (thirdError) {
console.error('所有方法都失败,无法点击登录按钮', thirdError);
return false;
}
}
}
}
/**
* 检查登录是否成功
* @returns {Promise<boolean>} 登录是否成功
*/
async isLoginSuccessful() {
// 登录成功后通常会重定向到其他页面
const currentUrl = await this.getCurrentUrl();
return currentUrl.includes('/dashboard');
}
}
module.exports = LongiLoginPage;