Agile Testers TechTalks | Test War Stories - Andreia Gaita @ Tech Lead do GitHub. Saiba mais aqui

div "Carregando" e click após a mesma



  • Galera, mais uma duvida ae.

    Tenho um sistema que apresenta uma lista de funcionários e uma lixeirinha do lado de cada um para exclui-lo. Ao lado dessa lista é apresentado o numero total desses funcionários.

    Assim que clico na lixeira é apresentada uma div de carregando que logo após desaparece, exibindo a lista e o total atualizado.

    Estou fazendo um script que limpa essa lista, ou seja, clica em uma lixeira, verifica se o numero de funcionários indicados é igual a zero e refaz o processo até zerar esse valor.

    O negócio é que ele está tentando clicar nessa div de “carregando”.

    O erro apresentado abaixo

    org.openqa.selenium.WebDriverException: Element is not clickable at point (819.8333129882812, 252). Other element would  receive the click: <div class="loader is-loading" ng-class="{'is-loading' : vm.isLoading()}"></div>
    Command duration or timeout: 215 milliseconds
    Build info: version: '2.53.0', revision: '35ae25b', time: '2016-03-15 17:00:58'
    

    meu código :

    
    wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(FRAME));
    		
    int totalFuncionarios = Integer.parseInt(wait.until(ExpectedConditions.visibilityOfElementLocated(TOTAL_FUNCIONARIOS)).getText());
    		
    while (totalFuncionarios > 0) {
    
    	wait.until(ExpectedConditions.elementToBeClickable(By.xpath("xpath da parada"))).click();
    			
    	totalFuncionarios = Integer.parseInt(wait.until(ExpectedConditions.visibilityOfElementLocated(TOTAL_FUNCIONARIOS)).getText());
    }
    

    Ele consegue clicar a primeira vez, apartir da segunda é que não funciona



  • As ações no WebDriver são fiéis ao que o usuário está fazendo, portanto vc não pode clicar em algo que está sendo coberto por outro componente, não pode interagir com elementos disabled, etc.

    Vc tem que esperar essa div “carregando” desaparecer, porque pelo visto ela está na frente do que vc quer clicar. Pega o locator dela (que já tá aparecendo na mensagem de erro) e faz um wait.until(ExpectedConditions.invisibilityOf(elemento)).



  • eu inclusive espero a visibilidade dela e depois a invisibilidade, mas não dá certo



  • coloquei só invisibilidade e deu certo, mas ele espera uns 6 segundos entre a retirada de um e de outro

    meu codigo ficou assim:

    wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(FRAME_GESTAO_FILAS));
    		
    int totalFuncionarios = Integer.parseInt(wait.until(ExpectedConditions.visibilityOfElementLocated(TOTAL_FUNCIONARIOS)).getText());
    		
    while (totalFuncionarios > 0) {
    
    	wait.until(ExpectedConditions.elementToBeClickable(By.xpath(".//*[@id='gestao-filas-app-page']//tbody/tr[1]/td[2]/a[3]/span"))).click();
    			
    	//esperar o carregando da pagina e volta para o frame que esta sendo utilizado
    	driver.switchTo().defaultContent();
    	wait.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath(".//plt-carregando/div[contains(@class,'loader is-loading')]/div/span")));
    	wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(FRAME_GESTAO_FILAS));
    			
    	totalFuncionarios = Integer.parseInt(wait.until(ExpectedConditions.visibilityOfElementLocated(TOTAL_FUNCIONARIOS)).getText());
    }
    
    driver.switchTo().defaultContent();
    


  • Alguem sabe como poderia resolver o problema?



  • Qual é o problema agora? Não tinha dito que deu certo?



  • Se o seu problema é aguardar esse tempo, lembre que aguardar invisibilidade vai esperar o tempo do seu timeout implícito, não tem muito pra onde fugir… vejo duas alternativas, mas uma pode não funcionar e a outra vc pode achar complexa demais:

    1 - tente usar o not() nas ExpectedConditions, tipo ExpectedConditions.not(ExpectedConditions.visibilityOf(elemento)), não sei se vai funcionar melhor, pesquise e tente usar
    2 - crie seu próprio wait pra esperar que esse elemento não esteja aparecendo mais, pesquise sobre FluentWait, num post eu dei um exemplo de FluentWait, dá uma olhada: http://stefanteixeira.com.br/2014/04/29/entendendo-os-tipos-de-esperas-no-selenium-webdriver/



  • vlw… vou tentar