Vinnaren i pepparkakshustävlingen!
2017-02-06, 10:35
  #1
Medlem
Hej!

Jag är nybörjare på kod men försöker lära mig. Håller just nu på att försöka göra lite handkodade UI tester för en webbapplikation.
Problemet jag fastnat på är att jag får inte koden att vänta i X antal sekunder på att webbsidan har laddat klart innan koden kör vidare.

Jag har tills nu använt mig av:

Kod:
Thread.Sleep(10000); 

Men insåg snabbt att det är ingen snygg lösning, speciellt inte när sidan ibland laddas klart på 2 sekunder, då går ju många sekunder till spillo bara för att vänta

Jag anropar denna metod efter varje klick där jag får en sidladdning:

Kod:
public void WaitForPageToLoad(BrowserWindow Browserint WaitTimeOut)
    {
        
// Waiting on all threads enable to wait for any background process to complete
        
Playback.PlaybackSettings.WaitForReadyLevel WaitForReadyLevel.AllThreads;
        
// Wait 
        
Browser.WaitForControlReady(WaitTimeOut 1000);
        
// Revert the playback settings (As waiting on all threads may sometime have a toll on execution speed 
        
Playback.PlaybackSettings.WaitForReadyLevel WaitForReadyLevel.UIThreadOnly;
    } 

Anropen gör jag enligt nedan exempel:

Kod:
ClickButton(Repo.LeftButton(Browser));
    
WaitForPageToLoad(Browser120); 

("Browser" är min parent.)

Det verkar som att koden hoppar över eller ignorerar WaitForPageToLoad(Browser, 120); raden, eller så fungerar den inte?
Har fått lite hjälp på stackoverflow men sitter fortfarande fast med detta och vänder mig därför nu till er på Flashback forumet.

Är det någon som har tips på hur jag kan få till detta? Eller någon annan lösning för att få koden att vänta tills webbsidan har laddat klart innan den fortsätter sin exekvering?
Citera
2017-02-09, 02:25
  #2
Medlem
Citat:
Ursprungligen postat av blk
Hej!

Jag är nybörjare på kod men försöker lära mig. Håller just nu på att försöka göra lite handkodade UI tester för en webbapplikation.
Problemet jag fastnat på är att jag får inte koden att vänta i X antal sekunder på att webbsidan har laddat klart innan koden kör vidare.

Jag är inte riktigt med på vad du försöker åstadkomma. Jag har bara en lusig liten resedator med futtig skärm så man kan inte se så mycket kod i taget, så ursäkta attt mitt svar är inte ditt efterfrågade svar, ännu mindre kunna köra compilern här. Enligt vad jag letat så körs koden för browsern för sig, i bakgrunden kan man säga. Det går ju inte att säga i förväg om hur lång tid en webbsida tar att laddas. Dagens reklamtunga webbsidor är ju nedskitade med reklam, och varje anrop till dessa reklamsnutteservrar ökar ju på väntetiden.

Här finns ett liknande problem beskrivet:
http://stackoverflow.com/questions/2...e-page-loading

I korthet beskrivet ungefär så här: När eventet page completed kommer så kollas IsBusy, ifall IsBusy returnerar false så låter du din kod köra

Men tx en sådan flagga elr metod som IsBusy utgör så blir ju en webbsida som visar tex en stream aldrig färdigladdad, så länge streamen är online.

Särskilt bekymmersamt om det finns någon reklam som streamas, eftersom om den stoppas, den kör ofta om samma slinga igen.

Skriver man en browser själv så kan man ju detaljstyra beteendet. Fast då tar man ju på sig ett gigantiskt uppdateringsproblem.

Å andra sidan så är det ju svårt att testa koden under alla upptänkliga situationer, Jag har ett minne av någon kod som medvetet sätter in fördröjningar i nätverket för att testa.

Jag har nog ngn gammal 10 MBit switch här, den kan man faktiskt sätta ner till tex 1 MBit.
Citera
2017-02-10, 08:22
  #3
Medlem
Trillskes avatar
Borde be klienten berätta när den är klar istället? Om du har tillgång till den dvs.
Citera
2017-02-10, 15:18
  #4
Medlem
Citat:
Ursprungligen postat av blk
Det verkar som att koden hoppar över eller ignorerar WaitForPageToLoad(Browser, 120); raden, eller så fungerar den inte?
Har fått lite hjälp på stackoverflow men sitter fortfarande fast med detta och vänder mig därför nu till er på Flashback forumet.

Är det någon som har tips på hur jag kan få till detta? Eller någon annan lösning för att få koden att vänta tills webbsidan har laddat klart innan den fortsätter sin exekvering?

Tips gör några enkla stubbar som testar page load på några sidor så du ser hur det är tänkt att fungera. Använd eventuellt trace klasserna eller ngn slags debug output liknande TRACE(....) ifall du inte kan köra debuggern i interaktivt läge pga tex tidskritiskhet, så du kan se om hur din
WaitForPageToLoad exekverar.

Jag hittade igår något exempel på att eventet pagecompleted kan komma flera ggr under en webbsidesinladdning, ibland tex för varje frame som laddats klart
Så du kan behöva anropa WaitForPageToLoad flera ggr,
Man kollar sen om sidan är klar med IsBusy, när den returnerar false så är sidan klar.
pseudokod:
while (IsBusy)
{
WaitForPageToLoad(....)
/* eventuellt en kort sleep här */
}

/* Kör din kod här */

Eller bättre:
do {
WaitForPageToLoad(....)
/* eventuellt en kort sleep här, alltså för att se till att ge upp några time slices */
} while (IsBusy);
/* Kör din kod här */

Om du tex kör din kod i debuggern så borde du se om WaitForPageToLoad alltid exekverar och returnerar som den ska,
Om du vill se till att inladdningen försenas avsiktligt för testning så kan man ju manuellt bryta nätverksanslutningen tillfälligt, tex rycka ut nätverkskabeln elr stänga av routern.

Citat:
Ursprungligen postat av Trillske
Borde be klienten berätta när den är klar istället? Om du har tillgång till den dvs.

Ja, det är väl fördelaktigast att den tråden som läser in webbsidan rapporterar när den har läst in den klart, Men det finns webbisar som ger flera sådana events fastän den inte är helt klar. Tex om du har en karta öppen i en webbläsare och trycker på zoom knappen så kan dt troligen bli många events osv..

Jag är rätt dåligt uppdaterad på detta, eftersom det är ett tag sen jag tittade på sådant här, kan ej heller leta gamla kodexempel just nu, det finns ju flera potentiella fallgropar när man kör trådat.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback