Developer Snippet Diary

Playwrite un dected code

from playwright.sync_api import sync_playwright,expect
import re

with sync_playwright() as p:
    browser = p.chromium.launch(
        headless=False, # Launch browser with additional args to mimic a real Chrome instance
        args=[
            "--disable-blink-features=AutomationControlled",  # Hides automation flags
            "--disable-infobars",  # Removes "Chrome is being controlled" banner
            "--start-maximized"  # Makes it look like a user-opened browser
        ]
    )
    context = browser.new_context( # Create a context with realistic settings
        user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
        viewport={"width": 1280, "height": 720},
        locale="en-US",
    )

    page = context.new_page() # Spoof webdriver detection
    page.add_init_script("""
        Object.defineProperty(navigator, 'webdriver', {get: () => undefined});
        Object.defineProperty(navigator, 'plugins', {get: () => [1, 2, 3]});
        Object.defineProperty(navigator, 'languages', {get: () => ['en-US', 'en']});
    """)


    page.goto("https://accounts.google.com/ServiceLogin", wait_until="domcontentloaded") # Navigate to Google login page
    try:
        expect(page).to_have_title(re.compile("Google"), timeout=2000)
    except AssertionError as e:
        print(f"Title mismatch: {e}")
        print("Proceeding despite title mismatch...")
        print(page.title()) #print page title -

    input("Press Enter to close the browser...")
    browser.close()

 

OR CLASS BASED:

from playwright.sync_api import sync_playwright, expect, TimeoutError
import time
import re
import csv

class Init:
    def __init__(self):
        # Initialize Playwright and browser
        self.playwright = sync_playwright().start()
        self.browser = self.playwright.chromium.launch(
            channel="chrome",
            headless=False,
            args=[
                "--disable-blink-features=AutomationControlled",
                "--disable-infobars",
                "--start-maximized"  # Maximizes the browser window
            ]
        )
        
        # Create context with realistic settings
        self.context = self.browser.new_context(
            user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
            locale="en-US",
            viewport=None  # Ensures maximum screen size with --start-maximized
        )

        # Create page object accessible to all methods
        self.page = self.context.new_page()
        
        # Spoof webdriver detection
        self.page.add_init_script("""
            Object.defineProperty(navigator, 'webdriver', {get: () => undefined});
            Object.defineProperty(navigator, 'plugins', {get: () => [1, 2, 3]});
            Object.defineProperty(navigator, 'languages', {get: () => ['en-US', 'en']});
        """)

    def google_login(self):
        """Perform Google login using the initialized page"""
        # Navigate to Google login page
        self.page.goto("https://accounts.google.com/ServiceLogin", wait_until="domcontentloaded")
        
        # Fill email field
        email_field = self.page.get_by_role("textbox", name="Email or phone")
        email_field.click()
        email_field.fill("mail@gmail.com")
        self.page.get_by_role("button", name="Next").click()


    def cleanup(self):
        """Clean up resources"""
        self.context.close()
        self.browser.close()
        self.playwright.stop()


init = Init()
init.google_login()
input("Press any key to exit")
init.cleanup() # Cleanup when done
Posted by: R GONDAL
Email: rizikmw@gmail.com