Attendere il caricamento della pagina in selenio


Risposte:


138

Puoi anche controllare il pageload usando il seguente codice

IWait<IWebDriver> wait = new OpenQA.Selenium.Support.UI.WebDriverWait(driver, TimeSpan.FromSeconds(30.00));

 wait.Until(driver1 => ((IJavaScriptExecutor)driver).ExecuteScript("return document.readyState").Equals("complete"));

22
Penseresti che qualcosa del genere sia integrato. Aspettare il caricamento della pagina è una cosa abbastanza comune sul web.
PRMan,

19
funziona davvero tutto il tempo? Forse mi manca qualcosa dal tuo codice ma stai aspettando che il dom sia pronto. Ma considera che se il tuo codice viene eseguito troppo velocemente, la pagina precedente potrebbe non essere ancora scaricata e tornerà vera anche se sei ancora nella vecchia pagina. Quello che devi fare è attendere lo scaricamento della pagina corrente e quindi chiamare il codice sopra. Un modo per rilevare lo scarico della pagina è ottenere un elemento web sulla pagina corrente e attendere fino a quando diventa stantio. obeythetestinggoat.com/…
George,

6
Cordiali saluti - Anche se quanto sopra non garantisce che la pagina sia completa - solo che il dom è pronto. Qualsiasi dojo / jquery potrebbe comunque creare elementi dinamici nella pagina, quindi potrebbe essere necessario attendere prima gli elementi dinamici prima di interagire con essi.
George,

3
Tenere presente che questo metodo controlla solo il DOM. Se usi Ajax o AngularJS, questo non funzionerà perché ci saranno alcune chiamate asincrone che non possono essere rilevate da document.readyState.
Homewrecker,

3
Questo è il codice C #. Questo non funziona con Java e la domanda posta su Java .
Kingamere,

89

Utilizzare la classe WebDriverWait

Vedi anche qui

Puoi aspettarti di mostrare qualche elemento. qualcosa come in C #:

WebDriver _driver = new WebDriver();
WebDriverWait _wait = new WebDriverWait(_driver, new TimeSpan(0, 1, 0));

_wait.Until(d => d.FindElement(By.Id("Id_Your_UIElement"));

Questo ha funzionato alla grande. È un modo moderno molto carino per risolvere il problema.
CrazyDart,

3
@ EmmanuelAngelo.R TimeSpan è una struttura di dati .Net.
rjzii,

12
cosa succede se non so quale elemento sarà sulla pagina?
JustGoscha,

3
Questo funzionerà per attendere il caricamento di un particolare elemento e non per l'intera pagina.
xyz,

1
Ciò non garantisce affatto che un elemento verrà caricato completamente, né risponde alla domanda. Come si può dare un voto a questo?
Boris D. Teoharov,

36

Se si imposta l'attesa implicita del driver, quindi si chiama il findElementmetodo su un elemento che si prevede si trovi nella pagina caricata, WebDriver eseguirà il polling per quell'elemento fino a quando non trova l'elemento o raggiunge il valore di timeout.

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

fonte: attese implicite


3
Non aiuta in attesa del caricamento della pagina.
xyz,

Significa che proverà qualcosa per 10 secondi, prima di sollevare un'eccezione. quindi non può assicurarsi che ci vorranno 10 secondi di ritardo.
skysign,

1
@xyz - perché non aiuta?
MasterJoe2,

@ testerjoe2 attende fino a quando non viene trovato un elemento particolare, la domanda è su come attendere il caricamento della pagina.
xyz,

35

In generale, con Selenium 2.0 il driver Web dovrebbe restituire il controllo al codice chiamante solo dopo aver determinato che la pagina è stata caricata. In caso contrario, è possibile chiamare waitforelemement, che cicla intorno alla chiamata findelementfino a quando non viene trovata o scade (è possibile impostare il timeout).


2
Aggiungendo alla risposta di Paul. Si prega di controllare anche questo stackoverflow.com/questions/5858743/… .
9ikhan,

27
Sfortunatamente, Selenium 2 non aspetta in tutti i casi il caricamento di una pagina. Ad esempio WebElement: click () non aspetta e questo è esplicitamente detto nel Javadoc di appartenenza. Tuttavia, non dicono come posso verificare la presenza di una nuova pagina da caricare. If click() causes a new page to be loaded via an event or is done by sending a native event (which is a common case on Firefox, IE on Windows) then the method will not wait for it to be loaded and the caller should verify that a new page has been loaded.
Sebi,

Da doc ..e il metodo si bloccherà fino al completamento del caricamento ...
xyz

2
@Karna: Sì, in teoria dovrebbe sempre e in pratica farlo per la maggior parte del tempo. L'uso del selenio all'epoca ha evidenziato che a volte pensava che il caricamento della pagina fosse terminato, ma non era così. Non ho usato il selenio di recente, quindi potrebbe o non essere ancora così.
Paul Hadfield,

3
Sono d'accordo: in particolare il driver di Internet Explorer è difettoso e restituisce immediatamente il controllo in alcuni casi anche se una pagina è ancora in fase di caricamento. Nel mio caso, ho aggiunto un'attesa utilizzando JavascriptExecutor, in attesa che document.readyState sia "completo". A causa del viaggio di andata e ritorno dal selenio al browser, credo che le condizioni di gara siano mitigate e questo "sempre" funziona per me. Dopo "click ()" quando mi aspetto che una pagina venga caricata, aspetto esplicitamente (utilizzando WebDriverWait) il readystate. ]
dmansfield,

22

Implementazione di Ruby:

wait = Selenium::WebDriver::Wait.new(:timeout => 10)
wait.until {
    @driver.execute_script("return document.readyState;") == "complete" 
}

17
Python equivalente: WebDriverWait (driver, 10) .until (lambda d: d.execute_script ('return document.readyState') == 'complete')
blaze

2
Python usa il codice sopra ma non dimenticare questa linea .. | da selenium.webdriver.support.ui import WebDriverWait
t3dodson

Ho avuto un problema a fare clic su un elemento quando la pagina non era completamente caricata. In Python ho provato time.sleep (30). Ha funzionato. Tuttavia, aspetterà sempre i max 30 secondi. Ho quindi provato il seguente codice ed è più efficiente ora, più veloce. WebDriverWait (driver, 10) .until (lambda d: driver.find_element_by_xpath ("// div [. = 'Administration']"). Click ())
Riaz Ladhani

20

È possibile rimuovere la System.outlinea. È stato aggiunto a scopo di debug.

WebDriver driver_;

public void waitForPageLoad() {

    Wait<WebDriver> wait = new WebDriverWait(driver_, 30);
    wait.until(new Function<WebDriver, Boolean>() {
        public Boolean apply(WebDriver driver) {
            System.out.println("Current Window State       : "
                + String.valueOf(((JavascriptExecutor) driver).executeScript("return document.readyState")));
            return String
                .valueOf(((JavascriptExecutor) driver).executeScript("return document.readyState"))
                .equals("complete");
        }
    });
}

Grazie per questi suggerimenti. Lo aggiungo nel mio SeleniumHelper; cf. javabox
boly38

17

Tutte queste soluzioni vanno bene per casi specifici, ma presentano almeno uno dei due possibili problemi:

  1. Non sono abbastanza generici: vogliono che tu sappia, in anticipo, che alcune condizioni specifiche saranno vere per la pagina che stai andando (ad es. Alcuni elementi verranno visualizzati)

  2. Sono aperti a una condizione di competizione in cui si utilizza un elemento che è effettivamente presente nella vecchia pagina e nella nuova pagina.

Ecco il mio tentativo di una soluzione generica che evita questo problema (in Python):

Innanzitutto, una generica funzione "wait" (usa un WebDriverWait se vuoi, li trovo brutti):

def wait_for(condition_function):
    start_time = time.time()
    while time.time() < start_time + 3:
        if condition_function():
            return True
        else:
            time.sleep(0.1)
    raise Exception('Timeout waiting for {}'.format(condition_function.__name__))

Successivamente, la soluzione si basa sul fatto che il selenio registra un numero ID (interno) per tutti gli elementi di una pagina, incluso l' <html>elemento di livello superiore . Quando una pagina si aggiorna o carica, ottiene un nuovo elemento html con un nuovo ID.

Quindi, supponendo che si desideri fare clic su un collegamento con il testo "il mio collegamento", ad esempio:

old_page = browser.find_element_by_tag_name('html')

browser.find_element_by_link_text('my link').click()

def page_has_loaded():
    new_page = browser.find_element_by_tag_name('html')
    return new_page.id != old_page.id

wait_for(page_has_loaded)

Per ulteriori helper Pythonic, riutilizzabili e generici, puoi creare un gestore di contesto:

from contextlib import contextmanager

@contextmanager
def wait_for_page_load(browser):
    old_page = browser.find_element_by_tag_name('html')

    yield

    def page_has_loaded():
        new_page = browser.find_element_by_tag_name('html')
        return new_page.id != old_page.id

    wait_for(page_has_loaded)

E poi puoi usarlo praticamente su qualsiasi interazione di selenio:

with wait_for_page_load(browser):
    browser.find_element_by_link_text('my link').click()

Credo sia a prova di proiettile! Cosa ne pensi?

Maggiori informazioni in un post sul blog qui


Ho letto la tua pagina web prima di cercare di nuovo più specificamente il codice java che implementa la tua soluzione. Niente finora ...
Andrew Lorien,

11

Puoi anche usare la classe: ExpectedConditionsattendere esplicitamente che un elemento venga visualizzato sulla pagina web prima di poter intraprendere qualsiasi azione ulteriori azioni

È possibile utilizzare la ExpectedConditionsclasse per determinare se un elemento è visibile:

WebElement element = (new WebDriverWait(getDriver(), 10)).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("input#houseName")));

Consulta l' ExpectedConditions class Javadocelenco di tutte le condizioni che puoi verificare.


11

La risposta di Imran è stata riformulata per Java 7:

    WebDriverWait wait = new WebDriverWait(driver, 30);

    wait.until(new ExpectedCondition<Boolean>() {
        public Boolean apply(WebDriver wdriver) {
            return ((JavascriptExecutor) driver).executeScript(
                "return document.readyState"
            ).equals("complete");
        }
    });

10

Questa sembra essere una grave limitazione di WebDriver. Ovviamente l'attesa di un elemento non implica che la pagina venga caricata, in particolare il DOM può essere completamente compilato (già stato) per cui JS è ancora in esecuzione e CSS e immagini stanno ancora caricando.

Credo che la soluzione più semplice sia impostare una variabile JS sull'evento onload dopo che tutto è stato inizializzato e controllare e attendere questa variabile JS in Selenium.


È semplice se il sito è tuo da modificare!
reinierpost,

Sì, basta usare un JavascriptExecutor per eseguire jQuery.js e quindi si ha accesso agli eventi di caricamento di jQuery. È raro, tuttavia, quando ciò è necessario. Il Webdriver standard ha potenza sufficiente per eseguire il 98% delle attese adeguate.
Djangofan,

@djangofan sarebbe fantastico vedere un esempio di questo ... Sono un ragazzo front-end, quindi non sono sicuro di dove o come venga utilizzato JavascriptExecutor.
BradGreens,

@BradGreens - Ok, guarda il mio progetto qui: github.com/djangofan/jquery-growl-selenium-example . Se hai l'ampiezza di banda per finire quell'esempio, non riesco proprio a far funzionare jGrowl in quel progetto di test, sebbene jQuery funzioni bene.
Djangofan,

1
@BradGreens Oltre al commento di djangofan vedere la mia risposta qui: stackoverflow.com/a/24638792/730326
jmathew

9

Se si desidera attendere il caricamento di un elemento specifico, è possibile utilizzare il isDisplayed()metodo su un RenderedWebElement:

// Sleep until the div we want is visible or 5 seconds is over
long end = System.currentTimeMillis() + 5000;
while (System.currentTimeMillis() < end) {
    // Browsers which render content (such as Firefox and IE) return "RenderedWebElements"
    RenderedWebElement resultsDiv = (RenderedWebElement) driver.findElement(By.className("gac_m"));

    // If results have been returned, the results are displayed in a drop down.
    if (resultsDiv.isDisplayed()) {
      break;
    }
}

(Esempio dalla Guida introduttiva a 5 minuti )


4
Un anno dopo (l'attuale versione di Selenium 2.23.1), non è presente RenderedWebElementnell'API. Tuttavia, il isDisplayed()metodo è ora disponibile direttamente su WebElement.
Petr Janeček,

1
Il polling è terribile quando può essere evitato.
reinierpost,

8

Attendere esplicitamente o attendere condizionatamente in questa attesa fino a quando non viene data questa condizione.

WebDriverWait wait = new WebDriverWait(wb, 60);
wait.until(ExpectedConditions.elementToBeClickable(By.name("value")));

Questo attenderà ogni elemento web per 60 secondi.

Usa implicitamente l'attesa di ogni elemento della pagina fino a quel momento.

driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);

Questo attenderà ogni elemento web per 60 secondi.


5

Usa implicitamente l'attesa di ogni elemento della pagina fino a quel momento.

driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

questo aspetta ogni elemento nella pagina per 30 sec.

Un'altra attesa è Attesa esplicita o attesa condizionale in questa attesa fino alla condizione specificata.

WebDriverWait wait = new WebDriverWait(driver, 40);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("someid")));

In id indica l'id dell'elemento statico che viene visualizzato in modo diffuso sulla pagina, non appena la pagina viene caricata.


4

Sono sorpreso che i predicati non siano stati la prima scelta poiché in genere sai con quali elementi interagirai successivamente nella pagina che stai aspettando di caricare. Il mio approccio è sempre stato quello di costruire predicati / funzioni come waitForElementByID(String id)e waitForElemetVisibleByClass(String className), ecc. E quindi di usarli e riutilizzarli ovunque ne avessi bisogno, sia per il caricamento della pagina che per il cambio del contenuto della pagina che sto aspettando.

Per esempio,

Nella mia classe di test:

driverWait.until(textIsPresent("expectedText");

Nel mio genitore della classe di test:

protected Predicate<WebDriver> textIsPresent(String text){
    final String t = text;
    return new Predicate<WebDriver>(){
        public boolean apply(WebDriver driver){
            return isTextPresent(t);
        }
    };
}

protected boolean isTextPresent(String text){
    return driver.getPageSource().contains(text);
}

Anche se questo sembra molto, si occupa di controllare ripetutamente per te e l'intervallo per la frequenza di controllo può essere impostato insieme al tempo di attesa finale prima del timeout. Inoltre, riutilizzerai tali metodi.

In questo esempio, la classe genitore ha definito e avviato il WebDriver drivere il WebDriverWait driverWait.

Spero che aiuti.


Questo mi aiuta! Grazie per questo eccellente campione. Lo aggiungo nel mio SeleniumHelper; cf. javabox
boly38

4

Il modo migliore per attendere il caricamento della pagina quando si utilizzano i collegamenti Java per WebDriver consiste nell'utilizzare il modello di progettazione Oggetto pagina con PageFactory. Ciò ti consente di utilizzare ciò AjaxElementLocatorFactoryche per dirla agisce semplicemente come un'attesa globale per tutti i tuoi elementi. Presenta limitazioni su elementi come caselle di selezione o transizioni javascript complesse, ma ridurrà drasticamente la quantità di codice necessario e accelererà i tempi di test. Un buon esempio può essere trovato in questo post sul blog. Si presuppone una conoscenza di base di Core Java.

http://startingwithseleniumwebdriver.blogspot.ro/2015/02/wait-in-page-factory.html


4

Soluzione NodeJS:

In Nodejs puoi ottenerlo tramite le promesse ...

Se scrivi questo codice, puoi essere sicuro che la pagina è completamente caricata quando arrivi a ...

driver.get('www.sidanmor.com').then(()=> {
    // here the page is fully loaded!!!
    // do your stuff...
}).catch(console.log.bind(console));

Se scrivi questo codice, navigherai e il selenio attenderà 3 secondi ...

driver.get('www.sidanmor.com');
driver.sleep(3000);
// you can't be sure that the page is fully loaded!!!
// do your stuff... hope it will be OK...

Dalla documentazione del selenio:

this.get (url) → Thenable

Pianifica un comando per passare all'URL specificato.

Restituisce una promessa che verrà risolta al termine del caricamento del documento .

Documentazione sul selenio (Nodejs)


4

Ecco una versione Java 8 della risposta attualmente più votata :

WebDriverWait wait = new WebDriverWait(myDriver, 15);
wait.until(webDriver -> ((JavascriptExecutor) myDriver).executeScript("return document.readyState").toString().equals("complete"));

Dov'è myDriverun WebDriveroggetto (dichiarato in precedenza).

Nota : tenere presente che questo metodo ( document.readyState) controlla solo il DOM.


4

Chiama sotto la funzione nel tuo script, questo attenderà fino a quando la pagina non viene caricata utilizzando JavaScript

public static boolean isloadComplete(WebDriver driver)
{
    return ((JavascriptExecutor) driver).executeScript("return document.readyState").equals("loaded")
            || ((JavascriptExecutor) driver).executeScript("return document.readyState").equals("complete");
}

Ho cambiato il valore booleano per nulla, ma non funziona in Chrome
nosequeweaponer

3
/**
 * Call this method before an event that will change the page.
 */
private void beforePageLoad() {
    JavascriptExecutor js = (JavascriptExecutor) driver;
    js.executeScript("document.mpPageReloaded='notYet';");
}

/**
 * Call this method after an event that will change the page.
 * 
 * @see #beforePageLoad
 * 
 *      Waits for the previous page to disappear.
 */
private void afterPageLoad() throws Exception {
    (new WebDriverWait(driver, 10)).until(new Predicate<WebDriver>() {

        @Override
        public boolean apply(WebDriver driver) {
            JavascriptExecutor js = (JavascriptExecutor) driver;
            Object obj = js.executeScript("return document.mpPageReloaded;");
            if (obj == null) {
                return true;
            }
            String str = (String) obj;
            if (!str.equals("notYet")) {
                return true;
            }
            return false;
        }
    });
}

È possibile passare dal documento a un elemento, nel caso in cui venga modificata solo una parte di un documento.

Questa tecnica è stata ispirata dalla risposta di Sincebasic.


3

SeleniumWaiter :

import com.google.common.base.Function;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.WebDriverWait;

public class SeleniumWaiter {

      private WebDriver driver;

      public SeleniumWaiter(WebDriver driver) {
           this.driver = driver;
      }

      public WebElement waitForMe(By locatorname, int timeout){
           WebDriverWait wait = new WebDriverWait(driver, timeout);
           return wait.until(SeleniumWaiter.presenceOfElementLocated(locatorname));
      }

      public static Function<WebDriver, WebElement> presenceOfElementLocated(final By locator) {
            // TODO Auto-generated method stub
            return new Function<WebDriver, WebElement>() {
                 @Override
                 public WebElement apply(WebDriver driver) {
                      return driver.findElement(locator);
                 }
            };
      }
 }

E a te lo usi :

_waiter = new SeleniumWaiter(_driver);

try {
   _waiter.waitForMe(By.xpath("//..."), 10);
} 
catch (Exception e) {
   // Error
}

3

È possibile utilizzare il metodo esistente di seguito per impostare il tempo per pageeLoadTimeout nell'esempio seguente se il caricamento della pagina richiede più di 20 secondi, quindi genererà un'eccezione per il ricaricamento della pagina

 WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().pageLoadTimeout(20, TimeUnit.SECONDS)

2

Puoi attendere esplicitamente la visualizzazione di un elemento sulla pagina Web prima di poter intraprendere qualsiasi azione (come element.click ())

driver.get("http://somedomain/url_that_delays_loading");
WebElement myDynamicElement = (new WebDriverWait(driver, 10))
  .until(new ExpectedCondition<WebElement>(){
        @Override
        public WebElement apply(WebDriver d) {
        return d.findElement(By.id("myDynamicElement"));
}});

Questo è quello che ho usato per uno scenario simile e funziona benissimo.


penso che driver.get attende la fine della funzione onload prima di restituire il controllo al codice, a meno che la pagina non abbia un sacco di ajax
goh

2

Il mio modo semplice:

long timeOut = 5000;
    long end = System.currentTimeMillis() + timeOut;

        while (System.currentTimeMillis() < end) {

            if (String.valueOf(
                    ((JavascriptExecutor) driver)
                            .executeScript("return document.readyState"))
                    .equals("complete")) {
                break;
            }
        }

2

Il modo migliore che ho visto è utilizzare stalenessOfExpectedCondition, per aspettare che la vecchia pagina diventi obsoleta.

Esempio:

WebDriver driver = new FirefoxDriver();
WebDriverWait wait = new WebDriverWait(driver, 10);

WebElement oldHtml = driver.findElement(By.tagName("html"));
wait.until(ExpectedConditions.stalenessOf(oldHtml));

Aspetterà dieci secondi affinché il vecchio tag HTML diventi obsoleto, quindi genererà un'eccezione se ciò non accade.


1
un WebElement che diventa obsoleto non implica il caricamento di una nuova pagina.
Corey Goldberg,

Certo, ma significa che la vecchia pagina è stata scaricata. Nella mia esperienza, è altrettanto importante sapere quando la vecchia pagina è stata scaricata o se si è fermata per qualche motivo.
forresthopkinsa,

Naturalmente, in genere utilizzo stalenessOf insieme ad altri test per ottenere l'intero processo di scarico / caricamento.
forresthopkinsa,

2

Uso node + selenium-webdriver (la cui versione è 3.5.0 ora). quello che faccio per questo è:

var webdriver = require('selenium-webdriver'),
    driver = new webdriver.Builder().forBrowser('chrome').build();
;
driver.wait(driver.executeScript("return document.readyState").then(state => {
  return state === 'complete';
}))

2

Puoi usare wait. ci sono fondamentalmente 2 tipi di attesa nel selenio

  • Aspetta implicita
  • Attesa esplicita

- Attesa implicita

Questo è molto semplice, vedi la sintassi seguente:

driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);

- Attesa esplicita

Attendere esplicitamente o attendere condizionatamente in questa attesa fino a quando non si verifica una determinata condizione.

WebDriverWait wait = new WebDriverWait(driver, 40);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("someid")));

È possibile utilizzare altri immobili come visblityOf(),visblityOfElement()



2

Nel mio caso, ho usato quanto segue per conoscere lo stato di caricamento della pagina. Nella nostra applicazione sono presenti le gif di caricamento e le ascolto come segue per eliminare i tempi di attesa indesiderati nello script.

public static void processing(){ 
    WebDriverWait wait = new WebDriverWait(driver, 30);
    wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@id='Msgpanel']/div/div/img")));
    wait.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("//div[@id='Msgpanel']/div/div/img")));
}

Dove xpath individua la gif nel DOM HTML. Successivamente, è anche possibile implementare i metodi di azione Fare clic su.

public static void click(WebElement elementToBeClicked){
    WebDriverWait wait = new WebDriverWait(driver, 45);
    wait.until(ExpectedConditions.visibilityOf(element));
    wait.until(ExpectedConditions.elementToBeClickable(element)); 
    wait.ignoring(NoSuchElementException.class).ignoring(StaleElementReferenceException.class); elementToBeClicked.click(); 
 }

2

Man tutte queste risposte richiedono troppo codice. Questa dovrebbe essere una cosa semplice in quanto piuttosto comune.

Perché non solo iniettare qualche semplice javascript con il webdriver e controllare. Questo è il metodo che uso nella mia classe webscraper. Il javascript è piuttosto semplice anche se non conosci js.

    def js_get_page_state(self):        
    """
    Javascript for getting document.readyState
    :return: Pages state.

    More Info: https://developer.mozilla.org/en-US/docs/Web/API/Document/readyState
    """
    ready_state = self.driver.execute_script('return document.readyState')
    if ready_state == 'loading':
        self.logger.info("Loading Page...")
    elif ready_state == 'interactive':
        self.logger.info("Page is interactive")
    elif ready_state == 'complete':
        self.logger.info("The page is fully loaded!")
    return ready_state

1

Come fare in modo che Selenium attenda il caricamento della pagina dopo un clic fornisce il seguente approccio interessante:

  1. Memorizza un riferimento a WebElementdalla vecchia pagina.
  2. Clicca il link.
  3. Continuare a invocare le operazioni WebElementfino alStaleElementReferenceException viene generata.

Codice di esempio:

WebElement link = ...;
link.click();
new WebDriverWait(webDriver, timeout).until((org.openqa.selenium.WebDriver input) ->
{
    try
    {
        link.isDisplayed();
        return false;
    }
    catch (StaleElementReferenceException unused)
    {
        return true;
    }
});

Buona idea! Non ho mai pensato di affrontare questa situazione verificando il contrario di un caricamento di pagina riuscito, uno scarico di pagina riuscito (per mancanza di un termine migliore). Tuttavia, se questa è l'opzione migliore si basa sul fatto che StaleElementReferenceException richieda meno tempo, ecc. Che attendere un caricamento corretto. Tuttavia, un altro buon modo per farlo.
Joseph Orlando,

4
Questo non ti dirà se la pagina corrente è caricata, ti dirà se l'ultima pagina (in particolare un elemento) è stata scaricata . Dovrai comunque attendere il caricamento della pagina corrente. A proposito, puoi sostituire il codice sopra con new WebDriverWait(driver, 10).until(ExpectedConditions.stalenessOf(element)).
JeffC
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.