webook / book.py
Mohammed Foud
Add application file
f959aff
import time # Import the time module
from utils import WeBookBase, logger
class WeBookBooking(WeBookBase):
def __init__(self, page, profile_dir=None):
super().__init__(profile_dir, page=page)
if not self.page:
raise ValueError("A Playwright page object must be provided to WeBookBooking")
def book_event(self, event_url):
try:
logger.info(f"Navigating to event booking page: {event_url}")
self.page.goto(event_url, wait_until='networkidle')
self._handle_cookies()
# Locate and click the '+' button for the first ticket offer
# Locate the button containing the specific '+' SVG icon
try:
# We are looking for a button that contains an SVG with the specific path
plus_button = self.page.locator('button:has(svg path[d="M7 1C7 0.447715 6.55228 0 6 0C5.44772 0 5 0.447715 5 1V5H1C0.447715 5 0 5.44772 0 6C0 6.55228 0.447715 7 1 7H5V11C5 11.5523 5.44772 12 6 12C6.55228 12 7 11.5523 7 11V7H11C11.5523 7 12 6.55228 12 6C12 5.44772 11.5523 5 11 5H7V1Z"])').first
if plus_button.is_visible():
plus_button.click()
logger.info("Clicked '+' button (SVG) for the first ticket offer")
# Wait for the main summary/payment button to become visible
summary_button = self.page.locator('[data-testid="ticketing_tickets_go_to_summary_button"]')
summary_button.wait_for(state='visible', timeout=5000) # Wait up to 5 seconds
else:
logger.warning("Could not find the '+' button (SVG) for ticket selection.")
return False # Exit if ticket selection failed
except Exception as click_e:
logger.error(f"Failed to click '+' button (SVG) or wait for summary button: {str(click_e)}")
return False # Exit on error
# Locate and click the main summary/payment button using its data-testid
if summary_button.is_visible():
summary_button.click()
logger.info("Clicked main summary/payment button (using data-testid)")
# --- New Step: Wait for and click the "Skip to Payment" button ---
# Use a more specific selector for the Skip to checkout button
skip_button = self.page.get_by_role("button", name="Skip to checkout")
try:
skip_button.wait_for(state='visible', timeout=5000) # Wait up to 5 seconds for the skip button
if skip_button.is_visible():
skip_button.click()
logger.info("Clicked 'Skip to Payment' button")
else:
logger.warning("'Skip to Payment' button not visible after waiting.")
return False
except Exception as skip_e:
logger.error(f"Failed to wait for or click 'Skip to Payment' button: {str(skip_e)}")
return False # Exit on error during skip button click
# --- End New Step ---
else:
logger.warning("Main summary/payment button not visible after waiting.")
return False # Exit if summary button is not visible
# Wait for and click the terms checkbox
terms_checkbox = self.page.locator('[data-testid="ticketing_summary_resell_terms_checkbox"]')
if terms_checkbox.is_visible():
terms_checkbox.click()
logger.info("Accepted terms and conditions")
else:
logger.warning("Could not find the terms checkbox.") # Might be critical depending on site
# Consider returning False here if accepting terms is mandatory
# return False
# Add final step to click the Confirm & pay button
confirm_button = self.page.locator('[data-testid="ticketing_summary_proceed_to_payment"]')
try:
confirm_button.wait_for(state='visible', timeout=5000)
if confirm_button.is_visible():
confirm_button.click()
logger.info("Clicked 'Confirm & pay' button")
else:
logger.warning("'Confirm & pay' button not visible after waiting.")
return False
except Exception as confirm_e:
logger.error(f"Failed to wait for or click 'Confirm & pay' button: {str(confirm_e)}")
return False
time.sleep(330)
return True
except Exception as e:
logger.error(f"Booking process failed: {str(e)}")
return False