# RPA-verktyg Generellt verktyg för webbläsar-automation byggt på Playwright, med en webbaserad flödesbyggare där du klickar ihop steg (gå till URL, klicka, skriv i fält, extrahera data, ladda ner filer, loopa över listor, spara till JSON/CSV, köra egna Python-script, ...) istället för att skriva kod för varje ny automation. Byggt för fall där inloggningen kräver manuell interaktion (BankID, 2FA, captcha) och därför inte kan helautomatiseras säkert: verktyget öppnar en synlig webbläsare, du loggar in en gång manuellt, och sessionen sparas i en persistent profil så du slipper göra om det varje körning. Repot innehåller dels det generella ramverket (webui + `rpa/`-paketet), dels ett fristående exempel på en färdig automation byggd med det (hämtning av egenremisser från personal.1177.se) - se sist i dokumentet. För en fullständig referens över alla stegtyper, villkor, variabel- interpolering, loop-typer och felsökningsverktyg, se [`docs/wiki.html`](docs/wiki.html) (öppna lokalt i en webbläsare). ## Setup **Linux/macOS:** använd medföljande skript, som skapar `.venv`, installerar paket + Playwright Chromium, och sen aktiverar venv åt dig vid start: ```bash ./install.sh # engångssetup ./start.sh # aktiverar venv, startar webui:t på http://127.0.0.1:8765 ./start.sh main # aktiverar venv, kör main.py (fristående 1177-exempel) ``` **Windows:** använd medföljande skript (engångssetup – skapar `.venv`, installerar paket + Playwright Chromium): ```powershell powershell -ExecutionPolicy Bypass -File .\install_win.ps1 ``` (eller dubbelklicka `install_win.bat`). Starta sedan: ```powershell .venv\Scripts\Activate.ps1 python run_webui.py # webui:t på http://127.0.0.1:8765 python run_webui.py --force # om en gammal instans redan kör: ta över porten python main.py # fristående 1177-exempel ``` Manuellt, om du hellre gör stegen själv: ```powershell python -m venv .venv .venv\Scripts\Activate.ps1 pip install -r requirements.txt python -m playwright install chromium ``` Webb-UI:t är en färdigbyggd React-app (incheckad i `webui/static/`), så `python run_webui.py` funkar utan Node. Node behövs bara om du vill **ändra** UI:t – se "Utveckla webb-UI:t" nedan. ## Webb-UI: node-canvas `python run_webui.py` → öppna http://127.0.0.1:8765. Flödet är en **graf** på ett node-canvas (pan/zoom/minikarta): varje nod är ett steg, och du **drar kablar** mellan noderna för att bestämma körordningen. `if`-noder har ett utgångshandtag per gren (`case0`, `case1`, … + `else`); `loop`-noder har `each` (per varv) och `done` – koppla kroppens sista nod tillbaka till loopens `in`. Nodens in-handtag sitter upptill, utgångarna nedtill. Dra en nod för att flytta den (positionen sparas med flödet). "Autoplacera" lägger ut grafen uppifrån och ner. - **Vänsterpalett** – dra en stegtyp till canvasen (eller dubbelklicka) för att lägga till en lös nod; koppla sedan ihop den. Typ-dropdownen i noden finns kvar för att byta typ på plats. Fliken **Block** = återanvändbara flödesdelar (se nedan). - **Subflöden & flikar** – flikraden ovanför canvasen visar `Main` + en flik per lokal subgraf (`+` skapar, dubbelklick döper om). En **`call_flow`**-nod kör ett annat flöde eller en lokal subgraf som ett steg, med explicit in-/ut-mappning (`target` = flödesnamn eller `#`). Varje subflow-flik har en "Kör denna flik"-knapp för att testa den isolerat. - **⚙-menyn** (uppe till höger) – Nytt/Ta bort flöde, Exportera, close-mode, körningsinställningar (headless/skip_browser/viewport…), **Kör-parametrar / indata**, språk, **Inspektera fönster**, Wiki. - **Block** – markera noder på canvasen → "💾 Spara markering som block" → de dyker upp i palettens Block-flik och kan dras in i andra flöden. Sparas i `data/blocks/`. Medföljande exempel ligger i repo-mappen `blocks/`. - **Kör-parametrar / indata** – deklarera vilka variabler flödet förväntar sig vid körning (⚙ → "Kör-parametrar / indata"): namn, etikett, standardvärde, ev. `Alternativ` (komma-separerat → rullista i stället för textfält). Har flödet minst en deklarerad indata öppnas en dialog automatiskt vid "Kör flöde" – fyll i värden, eller välj ett sparat **värde-set** i rullistan ("💾 Spara som set" sparar aktuella värden under ett namn, t.ex. "Produktion"/"Test"). Extra ad-hoc-variabler kan läggas till där också. Värdena når stegen som vanliga `{variabel}`. Seten sparas i flödet, följer med vid export (`--set NAMN` / `--var namn=värde` på kommandoraden) och kan väljas via MCP:s `run_flow(..., input_set="...")`. ## Desktop-automation (Windows) Utöver webbläsaren kan flöden styra **Windows-appar** – både vanliga appar via Windows UI Automation och bild-/koordinatklick för appar utan tillgänglighets-API. Stegen heter `desktop_*` och syns i "Desktop (Windows)"-kategorin i nod-editorn. Kräver Windows + paketen i `requirements.txt` (`pywinauto`, `pyautogui`, `opencv-python` – installeras bara på Windows). Ett `desktop_*`-steg på annan plattform ger ett tydligt fel, inte en krasch. - **Starta app** (`desktop_launch`) – kör t.ex. `notepad.exe`. För paketerade appar (Win11:s Notepad, Kalkylatorn m.fl.) har den startade processen inget eget fönster – fyll i fältet **Fönstertitel** (regex) så hittas rätt fönster ändå. **Anslut till fönster** (`desktop_connect`) attachar till en app som redan körs. - **Klicka / Skriv i / Läs kontroll** – hitta en kontroll via `name` (synlig text), `auto_id` (AutomationId), `control_type` (Button/Edit…) eller `class_name`. `window` (titel-regex) begränsar till ett visst fönster; tomt = "aktuellt" fönster (senast startat/anslutet). - **Tryck tangenter** (`desktop_press_key`) – pywinauto-syntax: `^s` = Ctrl+S, `{ENTER}`, `%{F4}` … - **Klicka på bild / Vänta på bild** – matcha en referensbild på skärmen (pyautogui + OpenCV). I steget finns en **📷 Fånga**-knapp som öppnar ett overlay – dra en ruta över det du vill fånga, så sparas bilden i `data/desktop_images/` och fylls i automatiskt. Från terminalen: `python -m rpa.desktop_capture [namn]`. - **Klicka på koordinat** (`desktop_click_xy`) – absoluta skärmkoordinater. Appar som ett flöde startat med `desktop_launch` städas enligt samma close-mode-val som webbläsaren (stäng alltid / håll öppen vid fel / håll alltid öppen). Ett flöde utan webbläsarsteg (bara `desktop_*` och variabelsteg) **startar ingen webbläsare** – det upptäcks automatiskt. Vill du tvinga bort den (t.ex. under utveckling) finns "Starta ingen webbläsare" i ⚙ Inställningar (`skip_browser`); ett webbläsarsteg med den påslagen ger då ett tydligt fel. Hitta rätt selectors: **⚙ → Inspektera fönster** i webui:t (välj ett körande fönster → lista dess kontroller → "Nytt `desktop_click`" fyller i `by`/`value` åt dig). Eller från terminalen: ```powershell python -m rpa.desktop_inspect # listar synliga toppfönster python -m rpa.desktop_inspect "Anteckningar" # dumpar kontroll-identifierare ``` ### OCR, frågor & uppslag För arbetsflöden som blandar webb, skrivbord och skannade dokument: - **`ocr_read`** – OCR (Windows: winocr + pymupdf) av en inskannad PDF, ett fönster, ett skärmområde eller en bildfil → variabel. `pattern` (regex) eller `near` (värdet bredvid en etikett) plockar ut just det du vill ha. Kräver att svenskt OCR-språk är installerat i Windows. - **`prompt`** – pausa och visa en ruta: bekräfta (OK/Avbryt), fråga efter ett värde, eller visa variabler redigerbara så användaren kan rätta OCR-fel innan de skrivs vidare. - **`lookup`** – slå upp en nyckel (`{grupp}|{spec}`) i en JSON-map (inläst variabel eller fil i `data/exports/`). **`merge_json`** skriver tillbaka en nyckel – för kom-ihåg-tabeller. **`read_url`** läser aktuell URL (+ regex). **`stop`** avbryter med ett meddelande. Ett komplett exempel som använder allt detta finns i [`docs/salma-elvis.md`](docs/salma-elvis.md) (remissregistrering Sälma → ELVIS). ## AI: bygg och kör flöden med en AI-agent Verktyget kan drivas av en AI på två sätt. Båda använder samma stegschema ([`rpa/schema.py`](rpa/schema.py)) som webui:t, så en AI bara kan de steg som faktiskt finns. ### 1. "Föreslå ändringar" i webui:t (beskriv i text → flöde) I sidopanelen finns en ruta "AI-assistent". Skriv på svenska vad flödet ska göra (t.ex. *"gå till example.com, vänta på inloggning, lista alla länkar och spara som CSV"*) och klicka **Föreslå ändringar**. Förslaget läggs in i editorn i osparat läge – granska, och tryck sedan **Spara** / **Kör flöde** som vanligt. Kräver en Claude-nyckel: sätt miljövariabeln `ANTHROPIC_API_KEY` (eller kör `ant auth login`) innan du startar `run_webui.py`. Modell styrs av `RPA_ASSIST_MODEL` (default `claude-opus-5`). ### 2. MCP-server (Claude Code / Claude Desktop styr verktyget) [`rpa/mcp_server.py`](rpa/mcp_server.py) exponerar verktyget som en MCP-server: en AI-agent kan lista/hämta/skapa/redigera/ta bort flöden, validera dem, samt köra dem och läsa körloggen. Registrera i **Claude Code** (byt ut sökvägen mot din `.venv`-python): ```powershell claude mcp add rpa -- C:\Users\\Desktop\proj\RPA-Remisser\.venv\Scripts\python.exe -m rpa.mcp_server ``` Eller i **Claude Desktop** (`%AppData%\Claude\claude_desktop_config.json`): ```json { "mcpServers": { "rpa": { "command": "C:\\Users\\\\Desktop\\proj\\RPA-Remisser\\.venv\\Scripts\\python.exe", "args": ["-m", "rpa.mcp_server"] } } } ``` MCP-servern körs från projektmappen (den hittar `rpa/`-paketet via `-m`). Fråga sen agenten t.ex. *"lista mina RPA-flöden"*, *"skapa ett flöde som ..."*, *"kör flödet X och visa loggen"*. **OBS:** MCP-servern och webui:t delar samma Chromium-profilmapp (`data/browser_profile/`) – bara en körning åt gången. Stäng ett körande flöde i webui:t innan du kör ett via MCP, och tvärtom. ## Kom igång: hitta rätt selectors för en ny sida **Rekommenderat sätt: Playwright Codegen.** Den öppnar en webbläsare + ett inspector-fönster; klicka runt manuellt på sidan du vill automatisera så genereras exakta selectors åt dig i realtid – inget gissningsarbete: ```powershell python -m rpa.codegen ``` Den återanvänder samma profil (`data/browser_profile/`) som webui:t, så en giltig inloggningssession följer med. Stäng ev. körande flöde i webui:t först (en Chromium-profilmapp kan bara användas av en process åt gången). Använd de genererade text-/CSS-värdena direkt i webui:ts steg (t.ex. "Klicka", "Skriv i textfält", "Lista poster"). Alternativ (mer manuellt): `python -m rpa.discover` loggar in och låter dig, för varje sida du manuellt navigerar till, spara en HTML-dump + skärmdump i `data/discover/` genom att trycka Enter i terminalen - bra när du hellre vill läsa igenom den faktiska HTML-strukturen själv. ```powershell python -m rpa.discover ``` ## Webb-UI för att bygga och köra flöden ```powershell python run_webui.py ``` Öppna sedan http://127.0.0.1:8765 i webbläsaren. Servern lyssnar bara på 127.0.0.1 (inte nätverket) eftersom den styr en riktig webbläsare mot din inloggade session. I UI:t bygger du ett flöde som en lista av steg: - **Gå till URL** – navigerar (t.ex. `https://example.com/`) - **Vänta (sekunder)** – fast paus - **Vänta på att sidan laddas** – väntar på domcontentloaded - **Gå tillbaka** – webbläsarens "bakåt" (historik), t.ex. efter att ha klickat in på en post från en lista, för att fortsätta en loop över listan - **Vänta på inloggning (BankID)** – pausar tills du godkänt inloggningen manuellt - **Vänta på element** – pausar tills ett element via text/CSS/roll finns/syns - **Klicka** – hittar ett element via text/CSS/roll och klickar - **Skriv i textfält** – hittar ett fält via text/CSS/roll och skriver in text - **Tryck tangent** – trycker en tangent (t.ex. Enter) på ett element eller, om inget element anges, på hela sidan - **Välj i dropdown** – väljer ett alternativ (synlig text) i en `