Atualizando a página da Web pelo WebDriver ao aguardar uma condição específica


154

Estou procurando uma maneira mais elegante de atualizar a página da web durante os testes (eu uso o Selenium2). Acabei de enviar a tecla F5, mas gostaria de saber se o driver possui um método para atualizar a página inteira. Aqui está o meu código

    while(driver.findElements(By.xpath("//*[text() = 'READY']")).size() == 0 )
        driver.findElement(By.xpath("//body")).sendKeys(Keys.F5);
        //element appear after text READY is presented      
    driver.findElement(By.cssSelector("div.column a")).click();    

Talvez seja uma solução melhor para encontrar elemento na página atualizada manualmente

Respostas:


294

Em Java ou JavaScript:

driver.navigate().refresh();

Isso deve atualizar a página.


Feliz! isso te ajudou. Como alternativa, se você estiver usando puramente selênio RC ou um WebDriverBackedSelenium, também poderá usar: selenium.refresh ();
precisa

47
Não é exatamente equivalente a pressionar F5. driver.navigate().refresh()no cabeçalho da solicitação, diz "sem cache" e, como resultado, recarrega incondicionalmente todo o conteúdo. Enquanto pressionar F5 pode resultar em uma solicitação "If-Modified-Since", isso pode obter uma resposta "304 Not Modified". Você deve ter essa diferença em mente, se fizer o teste de carga.
Vsevolod Golovanov

@Manpreet Obrigado pela solução. É digno de voto positivo.
RNS 4/17

75

Em Python há um método para fazer isso: driver.refresh(). Pode não ser o mesmo em Java.

Como alternativa, você poderia driver.get("http://foo.bar");, embora eu ache que o método de atualização funcione bem.


1
Se você estiver usando driver.get("http://foo.bar")pode muito bem usardriver.get(driver.current_url)
Matt M.

54

Em python

Usando o método incorporado

driver.refresh()

ou, executando JavaScript

driver.execute_script("location.reload()")

Como podemos atualizar páginas modais?
hamed baziyad

21

5 maneiras diferentes de atualizar uma página da Web usando o Selenium Webdriver

Não há codificação extra especial. Acabei de usar as funções existentes de maneiras diferentes para fazê-lo funcionar. Aqui estão eles :

  1. Usando o método sendKeys.Keys

    driver.get("https://accounts.google.com/SignUp");
    driver.findElement(By.id("firstname-placeholder")).sendKeys(Keys.F5);
    
  2. Usando o método navigate.refresh ()

    driver.get("https://accounts.google.com/SignUp");  
    driver.navigate().refresh();
    
  3. Usando o método navigate.to ()

    driver.get("https://accounts.google.com/SignUp");  
    driver.navigate().to(driver.getCurrentUrl());
    
  4. Usando o método get ()

    driver.get("https://accounts.google.com/SignUp");  
    driver.get(driver.getCurrentUrl());
    
  5. Usando o método sendKeys ()

    driver.get("https://accounts.google.com/SignUp"); 
    driver.findElement(By.id("firstname-placeholder")).sendKeys("\uE035");
    

16

Foram encontradas várias abordagens para atualizar o aplicativo no selênio: -

1.driver.navigate().refresh();
2.driver.get(driver.getCurrentUrl());
3.driver.navigate().to(driver.getCurrentUrl());
4.driver.findElement(By.id("Contact-us")).sendKeys(Keys.F5); 
5.driver.executeScript("history.go(0)");

Para código ativo, consulte o link http://www.ufthelp.com/2014/11/Methods-Browser-Refresh-Selenium.html


1
Agradável! maneira múltipla de fazê-lo. findElement (By.id ("Fale conosco")) não é uma boa maneira. o elemento sempre presente mais confiável é bom, por exemplo: '/ html / body'. Isso funciona para atualizações duras? e se a página tiver dados de postagem, o firefox é conhecido por mostrar o diálogo de dados de postagem.
precisa saber é o seguinte

11

Aqui está a versão C # ligeiramente diferente:

driver.Navigate().Refresh();

5

Alternativa para atualização de página (F5)

driver.navigate().refresh();

(ou)

Actions actions = new Actions(driver);
actions.keyDown(Keys.CONTROL).sendKeys(Keys.F5).perform();

4

Uma coisa importante a ser observada é que a chamada driver.navigate (). Refresh () às vezes parece assíncrona, o que significa que ela não espera a atualização terminar, apenas "inicia a atualização" e não impede a execução adicional enquanto o navegador estiver recarregando a página.

Embora isso pareça acontecer apenas em uma minoria de casos, concluímos que é melhor garantir que isso funcione 100% adicionando uma verificação manual se a página realmente começou a ser recarregada.

Aqui está o código que escrevi para isso em nossa classe de objeto de página base:

public void reload() {
    // remember reference to current html root element
    final WebElement htmlRoot = getDriver().findElement(By.tagName("html"));

    // the refresh seems to sometimes be asynchronous, so this sometimes just kicks off the refresh,
    // but doesn't actually wait for the fresh to finish
    getDriver().navigate().refresh();

    // verify page started reloading by checking that the html root is not present anymore
    final long startTime = System.currentTimeMillis();
    final long maxLoadTime = TimeUnit.SECONDS.toMillis(getMaximumLoadTime());
    boolean startedReloading = false;
    do {
        try {
            startedReloading = !htmlRoot.isDisplayed();
        } catch (ElementNotVisibleException | StaleElementReferenceException ex) {
            startedReloading = true;
        }
    } while (!startedReloading && (System.currentTimeMillis() - startTime < maxLoadTime));

    if (!startedReloading) {
        throw new IllegalStateException("Page " + getName() + " did not start reloading in " + maxLoadTime + "ms");
    }

    // verify page finished reloading
    verify();
}

Algumas notas:

  • Como você está recarregando a página, não é possível apenas verificar a existência de um determinado elemento, porque o elemento estará lá antes do recarregamento começar e depois que ele terminar. Às vezes, você pode se tornar realidade, mas a página ainda nem começou a carregar.
  • Quando a página é recarregada, a verificação de WebElement.isDisplayed () gera uma StaleElementReferenceException. O resto é apenas para cobrir todas as bases
  • getName (): método interno que obtém o nome da página
  • getMaximumLoadTime (): método interno que retorna por quanto tempo a página deve carregar em segundos
  • Verifique (): o método interno garante que a página esteja realmente carregada

Novamente, na grande maioria dos casos, o loop do / while é executado uma única vez, porque o código além de navigate (). Refresh () não é executado até que o navegador realmente recarregue a página completamente, mas vimos casos em que na verdade, leva alguns segundos para atravessar esse loop, porque o navegador (). refresh () não foi bloqueado até o navegador terminar de carregar.


A resposta com verdadeiro valor ... Obrigado.
Ogmios


2

Também existe um caso em que você deseja atualizar apenas iframe específico na página e não a página inteira.

Você faz é o seguinte:

public void refreshIFrameByJavaScriptExecutor(String iFrameId){
        String script= "document.getElementById('" + iFrameId+ "').src = " + "document.getElementById('" + iFrameId+ "').src";
       ((IJavaScriptExecutor)WebDriver).ExecuteScript(script);
}


1

Outra maneira de atualizar a página atual usando selênio em Java.

//first: get the current URL in a String variable
String currentURL = driver.getCurrentUrl(); 
//second: call the current URL
driver.get(currentURL); 

Usar isso atualizará a página atual, como clicar na barra de endereços do navegador e pressionar Enter.


1

Em R, você pode usar o método de atualização, mas, para começar, navegamos para um URL usando o método de navegação:

remDr$navigate("https://...")
remDr$refresh()
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.