File size: 3,542 Bytes
f959aff
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
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