Uppdatera sidan med hjälp av Selenium Webdriver

⚡ Smart sammanfattning

Uppdaterar en sida i Selenium WebDriver laddar om den aktuella URL så att varje element renderas innan assertions körs, och ramverket erbjuder fem distinkta kommandon som uppnår samma omladdning på olika sätt.

  • 🔘 Standardval: driver.navigate().refresh() är den inbyggda omladdningen och tar inga argument och returnerar inget värde.
  • ☑️ Rekursiva varianter: Om getCurrentUrl() skickas till get() eller navigate().to() laddas samma adress om.
  • Tangentbordsrutt: sendKeys accepterar Keys.F5 eller Unicode-värdet \uE035, men det måste rikta in sig på ett verkligt element.
  • 🧪 Skriptväg: JavascriptExekutorn som kör location.reload() fungerar när WebDriver-kommandot är blockerat.
  • 🛠️ Efter omladdning: Varje elementreferens som registrerats tidigare blir inaktuell och måste lokaliseras på nytt.
  • 📊 Modern uppställning: Selenium Manager kom i version 4.6, så sökvägen till drivrutinen behöver inte längre ställas in manuellt.

Uppdatera sidan med Selenium WebDriver-kommandon

Under testautomatisering av en webbaserad applikation uppstår ett behov av att sidan uppdateras flera gånger för att alla webbelement ska laddas helt. Vid den första sidans inläsning kan vissa webbelement laddas, medan det krävs en andra sidans uppdatering för att alla ska visas. Detta kan göras med hjälp av kommandot refresh som tillhandahålls av Selenium WebDriver.

Hur man uppdaterar sidan in Selenium

Webbläsarens uppdateringsoperation kan utföras på följande sätt Selenium. Vi kommer att diskutera nedan nämnda sätt i detalj genom hela artikeln.

  1. kommandot driver.navigate().refresh()
  2. Get-metoden
  3. Kommandot Skicka nycklar
  4. Navigeringsmetod
  5. kommandot driver.navigate().to()

1) driver.navigate().refresh()-kommandot

Detta är den inbyggda metoden för att utföra en siduppdateringsoperation som tillhandahålls av Selenium WebDriver. Detta kommando är det vanligaste kommandot inom testautomation för att utföra en siduppdateringsoperation. Refresh-kommandot kan användas på ett enkelt sätt som nämns nedan.

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

Navigering är ett gränssnitt som används för att utföra olika webbläsaråtgärder, såsom att navigera till föregående sida, navigera till nästa sida, uppdatera sidan och stänga webbläsaren. Navigeringsgränssnittsmetoder kan nås med kommandot driver.navigate(). Uppdateringsmetoden i navigeringsgränssnittet tar inga argument och returnerar inget värde.

Exempel:

Testscenario:

  1. Öppna Chrome-webbläsaren med webbsidan https://demo.guru99.com/selenium/guru99home/
  2. När sidan har laddats uppdaterar du webbsidan med metoden driver.navigate().refresh().
  3. Stäng webbläsaren med metoden driver.close()

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();
}
}

⚠️ Versionsnotering: Selenium Chefen skickades med Selenium 4.6 och laddar ner matchande webbläsardrivrutin automatiskt, så raden System.setProperty ovan behövs inte längre på en aktuell version — new ChromeDriver() är tillräckligt. Den ursprungliga raden behålls eftersom den fortfarande är korrekt för Selenium 3 stiluppsättningar som exemplet skrevs mot.

Code Produktion:

På den första sidan laddas demosidan och visas som nedan.

Guru99 demohemsida vid den första laddningen innan uppdateringskommandot körs

Efter sidans uppdatering har videon på sidan ändrats, vilket bekräftar att omladdningen faktiskt skedde.

Guru99 demohemsida efter att driver.navigate().refresh() visar en annan video

Flera andra sätt att uppdatera en sida

Uppdateringsmetoden är inte den enda vägen till en omladdning. De fyra teknikerna nedan ger samma resultat och är värda att känna till, eftersom en låst applikation eller en envis webbläsare ibland blockerar en av dem.

2) Get-metoden

Metoden get kan användas rekursivt för att uppdatera en sida. För att uppnå detta behöver vi skicka en annan metod som argument till get-metoden.

Exempel:

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

3) Navigeringsmetod

Den här metoden använder samma rekursionskoncept som nämnts ovan. Metoden getCurrentUrl() skickas som ett argument till metoden driver.navigate().to().

Exempel:

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

4) Skicka nycklar-metoden med F5-tangenten

Detta är den näst vanligaste metoden för att uppdatera en sida på SeleniumDen tar uppdateringstangenten (F5) som ett argument till sendKeys-metoden. Eftersom sendKeys bara fungerar på webbelement snarare än i webbläsaren måste vi först identifiera ett giltigt webbelement på webbsidan och sedan använda sendKeys-metoden. Detta kan åstadkommas enligt nedan.

Exempel:

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

Eftersom tangenttryckningen levereras till ett element snarare än till webbläsarens Chrome, beror denna rutt på vilket element som håller fokus. Om locator matchar ett fält som inte kan ta fokus, nyckeln sväljs och sidan laddas aldrig om.

5) Skicka nycklar-metoden med ASCII Code

Den här metoden använder samma koncept som ovan, men istället för att skicka F5-tangenten som ett argument skickar vi kodpunkten för uppdateringstangenten som ett argument. Detta kan åstadkommas enligt nedan.

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

Värdet \uE035 är WebDriver Unicode-kodpunkten som protokollet mappar till F5, så det här och det föregående kodavsnittet är likvärdiga.

Hur man uppdaterar en sida med hjälp av JavaScriptExecutor

Varje webbläsare exponerar en omladdningsfunktion för sidskript, och Selenium kan ringa det via JavascriptExecutor-gränssnitt. Detta är den vanliga reservlösningen när WebDriver-uppdateringskommandot stoppas av programmet eller av ett webbläsartillägg.

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

Två varianter är värda att komma ihåg:

  1. plats.omladdning() utför en normal omladdning och kan hantera sidan från cachen.
  2. historia.go(0) är en äldre motsvarighet som vissa äldre programsviter fortfarande använder.

Executor-rutten körs inuti sidan, så den väntar inte på det nya dokumentet på egen hand. Följ den med en explicit väntan precis som du skulle göra efter driver.navigate().refresh(), och kom ihåg att en skriptdriven omladdning inte kommer att rensa en dialogruta på webbläsarnivå. Om programmet som testas laddar sitt innehåll asynkront gäller samma försiktighet som när hantera AJAX-anrop i Selenium webbdrivrutin.

Hur man undviker StaleElementReferenceException efter en uppdatering

En uppdatering förstör den nuvarande DOM:en och skapar en ny. Varje WebElement som registrerats före omladdningen pekar nu på en nod som inte längre finns, så nästa anrop mot den utlöser StaleElementReferenceException. Detta är det enskilt vanligaste felet som följer en siduppdatering.

Tre vanor tar bort nästan alla dessa misslyckanden:

  1. Lokalisera efter, aldrig före. Lagra By-lokaliseringsverktyget istället för WebElement och anropa findElement igen när omladdningen är klar.
  2. Vänta på en riktig signal. En uttrycklig väntan på synligheten av ett element som bara existerar efter omladdningen är mycket mer tillförlitlig än en fast sömn.
  3. Uppdatera och läs sedan om. Använd aldrig ett textvärde eller ett attribut som hämtats före omladdningen i en påstående som görs efter det.

Mönstret nedan gäller alla 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 tar en Duration i Selenium 4, vilket är en ändring från heltalssekunderskonstruktorn som används i Selenium 3. Mer omfattande tekniker för dessa fel behandlas i vår guide till undantagshantering i Selenium.

Jämförelse av Selenium Metoder för siduppdatering

Alla sex kommandon laddar om sidan, men de skiljer sig åt i vad de är beroende av och i hur de misslyckas.

Metod Beror på Laddar om via När det är rätt val
drivrutin.navigera().uppdatera() Inget extra Kommandot för webbläsarens omladdning Nästan alltid — standardinställningen
drivrutin.get(drivrutin.getCurrencyUrl()) En läsbar ström URL En ny navigering När du även vill ta bort historikposten
driver.navigate().to(driver.getCurrentUrl()) En läsbar ström URL En ny navigering Samma som ovan, skrivet via navigationsgränssnittet
sendKeys(Keys.F5) Ett fokuserbart element Ett tangenttryck När du avsiktligt testar tangentbordssökvägen
sendKeys("\uE035") Ett fokuserbart element Ett tangenttryck Identisk med F5, skriven som en kodpunkt
JavascriptExekutor location.reload() Skript aktiverat Ett sidskript När WebDriver-kommandot är blockerat

Börja med kommandot uppdatera och använd en annan rad endast när det misslyckas av en anledning du förstår. Samma ordning gäller när du maximera eller ändra storlek på webbläsarfönstret: föredra det inbyggda WebDriver-anropet och behandla skriptvägen som reserv.

Vanliga frågor

Det kan det. Om den aktuella sidan skapades av ett POST-program kan webbläsaren be om att skicka om data och omladdningen stannar bakom den dialogrutan. Navigera till URL återigen undviker get() prompten helt.

Bindningsnamnen skiljer sig åt men kommandot är detsamma: driver.refresh() i Python, driver.Navigate().Refresh() i C# och driver.navigate().refresh() i JavaAlla tre utfärdar identisk WebDriver-instruktion.

Nej. En omladdning sparar cookies, sessionslagring och lokal lagring från samma ursprung, vilket är anledningen till att uppdatering är ett dåligt sätt att återställa tillståndet. Ta bort cookies explicit eller starta en ny webbläsarsession istället.

Självläkande motorer löser upp en locator från flera attribut när den omladdade DOM:n inte längre matchar, och felanalysmodeller klustrar omladdningstidsflakes så att teamet fixar en väntetid istället för femtio tester.

Ja, och uppdateringsanropet på en rad är ett förslag som det gör rätt konsekvent. Väntetiden som måste följa är där förslagen går fel, så jämför eventuell genererad timeout mot hur applikationen faktiskt laddas.

Det finns inget dedikerat kommando. Team når ungefär samma nivå genom att använda Ctrl och F5 samtidigt via klassen Actions, eller genom att inaktivera cachen via webbläsarinställningar, vilket är den mer pålitliga vägen.

Inte med kommandot refresh, som alltid laddar om det översta dokumentet. Växla till ramen och ladda om den med ett skript, eller återställ dess källattribut och växla sedan tillbaka till standardinnehållet.

Gissa inte med en fast sömn. Använd en explicit väntetid på tio till trettio sekunder på ett villkor som bara är sant efter omladdningen, så att testet fortsätter i det ögonblick sidan är klar.

Sammanfatta detta inlägg med: