"""Run: python selenium_demo.py --page selenium_lab.html --output results
Requires selenium, Chrome and a compatible ChromeDriver (Selenium Manager can obtain it).
"""
from pathlib import Path
import argparse
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

def main():
    p=argparse.ArgumentParser();p.add_argument('--page',type=Path,default=Path('selenium_lab.html'));p.add_argument('--output',type=Path,default=Path('results'));p.add_argument('--driver',type=Path);p.add_argument('--chrome',type=Path);args=p.parse_args()
    if not args.page.is_file():raise FileNotFoundError(args.page.resolve())
    args.output.mkdir(parents=True,exist_ok=True)
    options=webdriver.ChromeOptions();options.add_argument('--headless=new');options.add_argument('--window-size=1100,780')
    if args.chrome:options.binary_location=str(args.chrome)
    service=Service(executable_path=str(args.driver)) if args.driver else Service()
    driver=webdriver.Chrome(service=service,options=options)
    try:
        driver.get(args.page.resolve().as_uri())
        wait=WebDriverWait(driver,10)
        field=wait.until(EC.visibility_of_element_located((By.ID,'name')))
        driver.save_screenshot(str(args.output/'selenium-before.png'))
        field.clear();field.send_keys('ArcLab')
        wait.until(EC.element_to_be_clickable((By.ID,'greet'))).click()
        wait.until(EC.text_to_be_present_in_element((By.ID,'status'),'Hello, ArcLab!'))
        assert driver.find_element(By.ID,'status').text=='Hello, ArcLab!'
        driver.save_screenshot(str(args.output/'selenium-after.png'))
        field.clear();driver.find_element(By.ID,'greet').click()
        wait.until(EC.text_to_be_present_in_element((By.ID,'status'),'Please enter a name'))
        print('Passed: greeting, explicit wait, empty-input validation and screenshots.')
    finally:driver.quit()
if __name__=='__main__':main()
