import gradio as gr import cv2 from PIL import Image import google.generativeai as genai import os from dotenv import load_dotenv load_dotenv() api_key = os.getenv('api_key') genai.configure(api_key=api_key) def extract_frames(video_path, fps=30): frames = [] cap = cv2.VideoCapture(video_path) if not cap.isOpened(): raise ValueError("Error: Unable to open video file.") original_fps = cap.get(cv2.CAP_PROP_FPS) if original_fps <= 0: raise ValueError("Error: Unable to retrieve valid FPS from video file.") frame_interval = max(1, int(original_fps // fps)) frame_count = 0 success, frame = cap.read() while success: if frame_count % frame_interval == 0: frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) pil_image = Image.fromarray(frame) frames.append(pil_image) frame_count += 1 success, frame = cap.read() cap.release() if len(frames) == 0: raise ValueError("Error: No frames extracted from the video.") return frames def generate_prompt(button_list): button_descriptions = ", ".join(button_list) return ( f"Generate structured test cases for the following UI button(s): {button_descriptions}.\n\n" "Functionality\n" "- What the button is supposed to do.\n\n" "Preconditions\n" "- Any requirements before interaction.\n\n" "Test Steps\n" "- Concise steps for executing the test.\n\n" "Expected Results\n" "- What the expected outcome should be.\n\n" "Automated Testing Tools\n" "- Recommended tools for testing.\n\n" "Format the output clearly for easy readability, using bullet points for key details." ) def process_video(video_file, buttons_to_test): try: video_path = "uploaded_video.mp4" with open(video_path, "wb") as f: f.write(video_file) frames = extract_frames(video_path, fps=15) frames_to_pass = frames[::10] # use every 10th frame button_list = [button.strip() for button in buttons_to_test.split(",")] prompt = generate_prompt(button_list) frame_prompts = [frame for frame in frames_to_pass] response = genai.GenerativeModel(model_name="gemini-1.5-pro-latest").generate_content([prompt] + frame_prompts) output_text = response.text if hasattr(response, 'text') else "Error: Invalid response from the model." output_text = output_text.replace("Functionality", "📋 Functionality") output_text = output_text.replace("Preconditions", "🔍 Preconditions") output_text = output_text.replace("Test Steps", "📝 Test Steps") output_text = output_text.replace("Expected Results", "✅ Expected Results") output_text = output_text.replace("Automated Testing Tools", "🛠️ Automated Testing Tools") return output_text except Exception as e: return f"Error occurred: {str(e)}" iface = gr.Interface( fn=process_video, inputs=[ gr.File(label="Upload Video", type="binary"), gr.Textbox(label="Buttons/Functions to Test (comma-separated)", placeholder="e.g., booking, cancel"), ], outputs="text", title="Video-to-Test Case Generator with Google Gemini", description="Upload a video and specify the buttons you want to test. The tool will generate structured test cases." ) iface.launch(share=True)