Opdater siden ved hjælp af Selenium Webdriver

⚡ Smart opsummering

Opdatering af en side i Selenium WebDriver genindlæser den aktuelle URL således at hvert element gengives, før assertions køres, og frameworket tilbyder fem forskellige kommandoer, der opnår den samme genindlæsning på forskellige måder.

  • 🔘 Standardvalg: driver.navigate().refresh() er den indbyggede genindlæsning og tager ingen argumenter og returnerer ingen værdi.
  • ☑️ Rekursive varianter: Hvis getCurrentUrl() sendes til get() eller navigate().to(), genindlæses den samme adresse.
  • Tastaturrute: sendKeys accepterer Keys.F5 eller Unicode-værdien \uE035, men den skal være målrettet mod et reelt element.
  • 🧪 Scriptrute: JavascriptExecutor, der kører location.reload(), fungerer, når WebDriver-kommandoen er blokeret.
  • 🛠️ Efter genindlæsning: Enhver elementreference, der er registreret tidligere, bliver forældet og skal findes igen.
  • 📊 Moderne opsætning: Selenium Manager ankom i version 4.6, så driverstien behøver ikke længere at blive indstillet manuelt.

Opdater siden ved hjælp af Selenium WebDriver-kommandoer

Under testautomatisering af en webbaseret applikation er der behov for at opdatere siden flere gange for at alle webelementer kan indlæses fuldstændigt. Ved den første sideindlæsning kan nogle webelementer blive indlæst, mens det kræver en anden sideopdatering, før de alle vises. Dette kan gøres ved hjælp af refresh-kommandoen fra Selenium WebDriver.

Sådan opdaterer du siden Selenium

Browseropdatering kan udføres på følgende måder Selenium. Vi vil diskutere nedenstående måder i detaljer gennem artiklen.

  1. driver.navigate().refresh() kommando
  2. Get-metoden
  3. Send nøgler kommando
  4. Navigeringsmetode
  5. driver.navigate().to() kommando

1) driver.navigate().refresh() Kommando

Dette er den indbyggede metode til at udføre en sideopdateringsoperation leveret af Selenium WebDriver. Denne kommando er den mest almindeligt anvendte kommando i testautomatisering til at udføre en sideopdateringshandling. Opdateringskommandoen kan bruges på en simpel måde som nævnt nedenfor.

driver.get("https://demo.guru99.com/selenium/guru99home/");
driver.navigate().refresh();

Navigation er en grænseflade, der bruges til at udføre forskellige browserhandlinger, såsom at navigere til forrige side, navigere til næste side, opdatere siden og lukke browseren. Navigationsgrænseflademetoder kan tilgås ved hjælp af kommandoen driver.navigate(). Navigationsgrænsefladen opdaterer ingen argumenter og returnerer ingen værdi.

Eksempel:

Testscenarie:

  1. Åbn Chrome-browseren med websiden https://demo.guru99.com/selenium/guru99home/
  2. Når siden er indlæst korrekt, skal du opdatere websiden ved hjælp af driver.navigate().refresh()-metoden.
  3. Luk browseren ved hjælp af driver.close()-metoden

Code

package Guru99Demo;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class RefreshDemo {
public static void main(String args[]) throws InterruptedException
{
System.setProperty("webdriver.chrome.driver", "D:\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("https://demo.guru99.com/selenium/guru99home/");
driver.manage().window().maximize();
driver.navigate().refresh();
driver.close();
}
}

⚠️ Versionsnotat: Selenium Leder sendt med Selenium 4.6 og downloader automatisk den matchende browserdriver, så System.setProperty-linjen ovenfor ikke længere er nødvendig på en nuværende version — new ChromeDriver() er nok. Den oprindelige linje bevares, fordi den stadig er korrekt for Selenium 3 stilopsætninger, som eksemplet blev skrevet i forhold til.

Code Output:

På den første side, der indlæses, vises demo-hjemmesiden som vist nedenfor.

Guru99 demo-hjemmeside ved den første indlæsning, før opdateringskommandoen køres

Efter sidens opdatering er videoen på siden ændret, hvilket bekræfter, at genindlæsningen rent faktisk fandt sted.

Guru99 demo-hjemmeside efter driver.navigate().refresh() viser en anden video

Flere andre måder at opdatere en side på

Opdateringsmetoden er ikke den eneste vej til en genindlæsning. De fire teknikker nedenfor giver det samme resultat og er værd at kende, fordi en låst applikation eller en stædig browser lejlighedsvis blokerer en af ​​dem.

2) Get-metoden

Get-metoden kan bruges rekursivt til at opdatere en side. For at opnå dette skal vi sende en anden metode som et argument til get-metoden.

Eksempel:

driver.get("https://www.guru99.com");
driver.get(driver.getCurrentUrl());

3) Navigeringsmetode

Denne metode bruger det samme rekursionskoncept som nævnt ovenfor. Metoden getCurrentUrl() sendes som et argument til metoden driver.navigate().to().

Eksempel:

driver.get("https://www.guru99.com");
driver.navigate().to(driver.getCurrentUrl());

4) Send nøglemetode ved hjælp af F5-tasten

Dette er den næstmest anvendte metode til at opdatere en side på SeleniumDen bruger opdateringstasten (F5) som et argument til sendKeys-metoden. Da sendKeys kun fungerer på webelementer i stedet for i browseren, skal vi først identificere et gyldigt webelement på websiden og derefter bruge sendKeys-metoden. Dette kan gøres som vist nedenfor.

Eksempel:

driver.get("https://www.guru99.com");
driver.findElement(By.id("username")).sendKeys(Keys.F5);

Da tastetrykket leveres til et element i stedet for til browserens Chrome, afhænger denne rute af det element, der holder fokus. Hvis locator matcher et felt, der ikke kan tage fokus, sluges nøglen, og siden genindlæses aldrig.

5) Send nøglemetode ved hjælp af ASCII Code

Denne metode bruger det samme koncept som ovenfor, men i stedet for at sende F5-tasten som et argument, sender vi kodepunktet for opdateringstasten som et argument. Dette kan gøres som vist nedenfor.

driver.get("https://www.guru99.com");
driver.findElement(By.id("username")).sendKeys("\uE035");

Værdien \uE035 er WebDriver Unicode-kodepunktet, som protokollen knytter til F5, så dette kodestykke og det forrige er ækvivalente.

Sådan opdaterer du en side ved hjælp af JavaScriptExecutor

Hver browser eksponerer en genindlæsningsfunktion til sidescripts, og Selenium kan ringe til det via JavascriptExecutor-grænseflade. Dette er den sædvanlige alternative funktion, når WebDriver-opdateringskommandoen opfanges af applikationen eller af en browserudvidelse.

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("location.reload();");

To variationer er værd at huske:

  1. placering.genindlæs() udfører en normal genindlæsning og kan muligvis vise siden fra cachen.
  2. historie.go(0) er en ældre ækvivalent, som nogle ældre suiter stadig bruger.

Executor-ruten kører inde i siden, så den venter ikke på det nye dokument alene. Følg den op med en eksplicit ventetid præcis som du ville gøre efter driver.navigate().refresh(), og husk at en scriptdrevet genindlæsning ikke vil rydde en dialogboks på browserniveau. Hvis programmet under test indlæser sit indhold asynkront, gælder samme forsigtighed som når håndtering af AJAX-kald Selenium webdriver.

Sådan undgår du StaleElementReferenceException efter en opdatering

En opdatering ødelægger den nuværende DOM og bygger en ny. Hvert WebElement, der registreres før genindlæsningen, peger nu på en node, der ikke længere eksisterer, så det næste kald mod den udløser StaleElementReferenceException. Dette er den mest almindelige fejl, der følger en sideopdatering.

Tre vaner fjerner næsten alle disse fejl:

  1. Find efter, aldrig før. Gem By-locatoren i stedet for WebElement, og kald findElement igen, når genindlæsningen er færdig.
  2. Vent på et rigtigt signal. En eksplicit venten på synligheden af ​​et element, der først eksisterer efter genindlæsningen, er langt mere pålidelig end en fast dvaletilstand.
  3. Opdater, og læs derefter igen. Medbring aldrig en tekstværdi eller en attribut, der er registreret før genindlæsningen, i en påstand, der er foretaget efter den.

Mønsteret nedenfor gælder for alle tre:

WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
driver.navigate().refresh();
WebElement search = wait.until(
        ExpectedConditions.visibilityOfElementLocated(By.id("username")));
search.sendKeys("guru99");

WebDriverWait tager en varighed i Selenium 4, hvilket er en ændring fra heltals-sekunder-konstruktøren, der bruges i Selenium 3. Bredere teknikker til disse fejl er dækket i vores guide til undtagelseshåndtering i Selenium.

Sammenligning af Selenium Metoder til sideopdatering

Alle seks kommandoer genindlæser siden, men de adskiller sig i, hvad de afhænger af, og hvordan de fejler.

Metode Afhænger af Genoplader via Når det er det rigtige valg
driver.navigate().refresh() Intet ekstra Browserens genindlæsningskommando Næsten altid — standardindstillingen
driver.get(driver.getCurrentUrl()) En læsbar strøm URL En frisk navigation Når du også vil slette historikposten
driver.navigate().to(driver.getCurrentUrl()) En læsbar strøm URL En frisk navigation Samme som ovenfor, skrevet via navigationsgrænsefladen
sendKeys(Keys.F5) Et fokuserbart element Et tastetryk Når du bevidst tester tastaturstien
sendKeys(“\uE035”) Et fokuserbart element Et tastetryk Identisk med F5, skrevet som et kodepunkt
JavascriptExecutor location.reload() Scripting aktiveret Et sidescript Når WebDriver-kommandoen er blokeret

Start med opdateringskommandoen, og find kun en anden række, når den fejler af en grund, du forstår. Den samme prioriterede rækkefølge gælder, når du maksimer eller tilpas størrelsen på browservinduet: foretrækker det native WebDriver-kald og behandler scriptruten som fallback.

Ofte Stillede Spørgsmål

Det kan det. Hvis den aktuelle side blev produceret af en POST, kan browseren bede om at sende dataene igen, og genindlæsningen stopper bag den dialogboks. Navigering til URL igen med get() undgår prompten helt.

Bindingsnavnene er forskellige, men kommandoen er den samme: driver.refresh() i Python, driver.Navigate().Refresh() i C# og driver.navigate().refresh() i JavaAlle tre udsteder den identiske WebDriver-instruktion.

Nej. En genindlæsning holder cookies, sessionslagring og lokal lagring fra samme oprindelse, hvilket er grunden til, at opdatering er en dårlig måde at nulstille tilstanden på. Slet cookies eksplicit, eller start en ny browsersession i stedet.

Selvreparerende motorer genfinder en locator fra flere attributter, når den genindlæste DOM ikke længere matcher, og fejlanalysemodeller klynger genindlæsningstiming-flakes, så teamet løser én ventetid i stedet for halvtreds tests.

Ja, og opdateringsopkaldet på én linje er et forslag, som det konsekvent lykkes med. Det er ventetiden, der følger efter, der gør forkerte forslag, så tjek eventuel genereret timeout i forhold til, hvordan applikationen rent faktisk indlæses.

Der er ingen dedikeret kommando. Holdene når tilnærmelsesvis én ved at sende Ctrl og F5 samtidig via Actions-klassen eller ved at deaktivere cachen via browserindstillinger, hvilket er den mest pålidelige rute.

Ikke med refresh-kommandoen, som altid genindlæser det øverste dokument. Skift til rammen og genindlæs den med et script, eller nulstil dens source-attribut, og skift derefter tilbage til standardindholdet.

Gæt ikke med en fast søvn. Brug en eksplicit ventetid på ti til tredive sekunder på en betingelse, der kun er sand efter genindlæsning, så testen fortsætter i det øjeblik siden er klar.

Opsummer dette indlæg med: