Link til KY dokumentation – https://dok.kombit.dk/arbejdsmarked-og-beskaeftigelse/kommunernes-ydelsessystem-ky
1. Pagination / Udtræk af data fra tabeller #
Enkelte problemer starter ved udtræk af data fra siderne. Man får ikke vist alle resultater på en gang, og skal klikke igennem flere sider, for at kunne se alt data. Benytter man sig af en Extract data from web page med en pager til at klikke næste, og trække data ud, vil denne forsætte uendeligt. Problemet er at Næste knappen i eksemplet nedenfor ikke ændrer sig når den bliver klikket, og er tilgængelig hele tiden. Så bruger man Recorder til at prøve at hive det hele ud, vil robotten altid klikke på Næste, fordi der hverken er noget i Selector eller CSS delen der ændrer sig, så den ved at den skal stoppe.
Der findes to løsninger, som kan bruges efter forskellige behov, der vil blive gennemgået herunder. Løsning 1 er at trække alt ud ukritisk, hvis man har behov for dette. Løsning 2 trækker data ud per side enkeltvis, til man har fundet hvad man leder efter. Dette kræver man gemmer data et sted, hvis det ikke skal overskrides fra side til side. I tilfælde med datoer, og skillelinjer kan denne være hurtigere end førstnævnte.
1.1 Løsning 1 – Udregn sidste side og træk alt data ud #
En løsning til at komme udenom dette, er at trække teksten ud fra den div der indeholder sideantallet, og så køre et regex match herpå, for at finde ud af hvor mange sider der er. Selve teksten der kommer ud fra Get details kan se ud på to måder. I koden tjekker vi først med regex \d+, som samler tallen i en kæde hvis der ikke er noget som skiller dem ad. Hvis der er mange sider, vil vi få to tal ud, i eksemplet nedenunder 12345 og 55 i en liste. Er det tilfældet, vil vi gerne hive de 55 sider ud. Er der ikke noget sider til de bliver delt på denne måde, ved vi at sideantalelt er småt, og derfor kun et ciffer. Hertil matcher vi med \d{1} som skiller hver tal ud med en cifre. I denne er vi interesseret i det sidste tal på listen, og skal derfor bruge mængden af items i denne -1, da index i lister starter ved 0. Vi ved derfor at det sidste tal i listen må være det den sidste side, og kan herefter trække denne ud.
I selve extract vil man slå Only the first til, og så skrive variablen til max antal sider ind. Herefter trykker robotten selv til og med den sidste side, og hiver data ud.
1.2 Løsning 2 – Træk data ud per side, indtil man har fundet det man søger #
En anden måde udenom dette er at lave en loop condition der automatisk stopper robotten. Det skal nævnes at data vil blive overskredet ved hver engang af loopet, så man skal indbygge en metode i denne, for at gemme data hvis man har behov for dette (eksempelvis en foreach bygget ud fra det Output der kommer, sætte data ind i et excel ark eller lignende, næste loop append på denne osv.).
Til at starte med kan vi trække total antallet af rækker ud, markeret i gul på billedet, og herefter regne ud hvor man sider der er totalt. Vi dividere med 5, da dette er antallet af rækker per side. Yderligere skal vi have trukket den rigtige integer ud, til dette formål kigger vi på decimalen. Hvis decimalet er .00 antages det er det er hele 5, og vi kan trække den ud som den er. Står der noget i decimalet, skal vi runde op, da der dog kan stå 0.2 eksempelvis, bliver dette ikke rundet op med en truncate, og vi øger variablen manuelt og hiver integeren ud efterfølgende.
Vi kan herefter sættes vores loop condition op, som hiver data ud fra hver side. Som nævnt tidligere, så overskrider den OutputData hver gang den laver et nyt. Hvis man skal bruge dataen senere, kan man som i eksemplet herunder, lave en for each efter extracten, skrive det data ind man skal bruge i eksempelvis et excel-ark, og så hive dette data ud efter loop condition slutter, så man kan bruge det videre i kørslen.
2. Loop opsætning #
Et af de store problemer med KY er måden tabellerne er bygget på. Fremfor en standard 0 UID fra toppen og så +1 (I eksemplet nedenunder ville det være 0-9 normalt), så skifter selectoren mellem Odd og Even, og tæller individuelt på disse også. Yderligere kompliceret bliver det i hovedemenuen, som vi arbejder fra. Foruden at holde styr den unikke selector i hver række, så forsvinder en række hvis opgaven udføres. Det vil sige hvis borgeren skal til manuel gennemgang, skal robotten blot springe til næste række. Hvis borgeren bliver udført af robotten, så forsvinder rækken, og tabellen skubbes op i den forstand. Så robotten vil skulle klikke på samme række igen, som så er er ny borger.
Ud fra dette er der meget logik til at holde robotten kørende. Hvis vi starter med eksemplet herunder på et loop, så bruger vi CountCPRdone mod VarTotalUbehandledeCPR til at holde styr på når vi er færdige, da den er den nemmest condition at sætte, da vi kan +1 på CountCPRdone hver gang vi har kørt en borger i loopet. Såfremt ingen sagsbehandler arbejder samtidigt med robotten, så burde det virke. Arbejder de samtidigt kan de fjerne fra listen, som vil trække fra VarTotalUbehandledeCPR, som den ikke tjekker løbende. Den vil derfor automatisk fejle når den skal trykke på sin custom selector, hvortil den forventer der stadig er data. VarTotalPages bruges til at navigere til næste side, hver gang CountTens rammer 11.
I eksemplet, så bruges den til at udregne selectoren til borgertabellen på forsiden, og til indtægtstabellen. BoolCPRIndt afgør dette i starten, 0 for borger, og 1 for indtægt. Yderligere afgøres om det er odd eller even via BoolOddEven CPR eller Indt, som så holder styr på det hele. Hertil nulstiller den selv til 0, når deres respektive counts rammer 5.
Selve custom selectoren til borger tabellen ser således ud.