webook / login.py
Mohammed Foud
Add application file
f959aff
import logging
import os
from pathlib import Path
from playwright.sync_api import sync_playwright
from utils import WeBookBase, logger
# Configure logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler('logs/webook_login.log'),
logging.StreamHandler()
]
)
logger = logging.getLogger(__name__)
class WeBookLogin(WeBookBase):
def __init__(self, email, password, profile_dir=None):
super().__init__(profile_dir)
self.email = email
self.password = password
def _submit_login_form(self):
try:
self.page.locator('[data-testid="auth_login_email_input"]').fill(self.email)
self.page.locator('#password').fill(self.password)
login_button = self.page.locator('[data-testid="auth_login_submit_button"]')
login_button.click()
logger.info("Login form submitted")
loading_spinner = self.page.locator('[data-testid="circle-spinner"]')
if loading_spinner.is_visible():
logger.info("Waiting for login to process...")
loading_spinner.wait_for(state="hidden")
except Exception as e:
logger.error(f"Login form submission failed: {str(e)}")
raise
def _check_login_result(self):
try:
error_message = self.page.locator('p.text-error')
if error_message.is_visible():
error_text = error_message.inner_text()
logger.error(f"Login failed: {error_text}")
self.page.screenshot(path="login_failed.png")
return False
self.page.wait_for_url("https://webook.com/en", timeout=10000)
logger.info("Successfully redirected to dashboard")
return True
except Exception as e:
logger.error(f"Login verification failed: {str(e)}")
return False
def _check_already_logged_in(self):
try:
# Navigate to login page
self.page.goto("https://webook.com/en/login", wait_until='networkidle')
# Check if we're redirected to dashboard
current_url = self.page.url
if current_url == "https://webook.com/en":
logger.info("Already logged in - redirected to dashboard")
return True
return False
except Exception as e:
logger.error(f"Error checking login status: {str(e)}")
return False
def login(self):
try:
# Setup browser and get the page/context, even if using an existing one
self.context, self.page = self._setup_browser()
# First check if already logged in
if self._check_already_logged_in():
return self.page # Return the page if already logged in
logger.info("Not logged in, proceeding with login form")
self._handle_cookies()
self._submit_login_form()
# Check login result and return page or False
if self._check_login_result():
return self.page # Return the page if login was successful
else:
return False # Return False if login failed
except Exception as e:
logger.error(f"Login process failed: {str(e)}")
return False