O que usar no lugar de browser.sleep ?



  • Bom dia, o que posso usar no lugar de sleep? Por exemplo, tenho um teste que clica em um determinado botão quando está clicável (usando o protractor-helper do @Walmyr ), mas só funciona se usar um sleep antes. Estou usando como no exemplo:

    browser.sleep(6000);
    protractorHelper.clickWhenClickable(botaoEditar, ‘Botão editar não está clicável’, 10000);

    Se retirar o sleep, o teste quebra, porque não consegue clicar no botão. Alguma sugestão? E qual a diferença entre presenceOf e visibilityOf ?



  • @michael-martins, no protractor-helper tem 2 funções que você pode usar para substituir o sleep, que são o waitForElementPresence e o waitForElementVisibility.

    O erro está ocorrendo porque você quer que clique quanto esteja clicável, mas na hora que chama essa função, o elemento não está presente ou não está visível.

    Primeiro espere que ele esteja presente ou visível, depois clique quando estiver clicável.

    Faça da seguinte forma:

    protractorHelper.waitForElementVisibility(botaoEditar);
    protractorHelper.clickWhenClickable(botaoEditar);
    

    ou

    protractorHelper.waitForElementPresence(botaoEditar);
    protractorHelper.clickWhenClickable(botaoEditar);
    

    Notei que você passa a mensagem de erro e o timeout como parâmetros na função clickWhenClickable, eu sugiro não passar eles e passar apenas o elemento que deseja realizar a ação. As funções da biblioteca do @Walmyr já possuem valores default para mensagem de erro e timeout, que é de 5 segundos.

    Se você não tivesse passado a mensagem no parâmetro, teria recebido como sugestão de causa do erro a seguinte mensagem: Possibly it's not present or visible.
    Essa mensagem é uma sugestão para utilizar o waitForElementPresence ou o waitForElementVisibility.

    Veja qual satisfaz sua necessidade.



  • Tento com waitForElementVisibility e waitForElementPresence e não dá certo. Tem um botão editar que abre um formulário. Mas não está encontrando esse botão, mesmo ele já estando na tela e aumentando o tempo pra 10 segundos. Só funciona se usar sleep.



  • Deu certo aqui. É que estava dentro de outra classe. Valeu :D



  • Tive que esperar um elemento que estava na frente carregar, pra poder clicar no elemento atrás. Mas o estranho é que no firefox isso funciona e no chrome não. Após isso, o chrome encontra o id de um elemento e o firefox não. Ou uso o waitForElementVisibility e o firefox funciona, mas não encontra o id, ou uso sleep pra funcionar no chrome, já que ele consegue encontrar o id, mas não funciona com waitForElementVisibility



  • @paulo-gonçalves said in O que usar no lugar de browser.sleep ?:

    a da seguinte for

    Só para explicar, o clickWhenClickable já verifica que o elemento, além de estar num estado clicável, também está visivel.
    Para tal função uso a Expected Condition elementToBeClickable do Protractor. Segue a documentação oficial para referêcia: http://www.protractortest.org/#/api?view=ProtractorExpectedConditions.prototype.elementToBeClickable
    Vejam que a descrição da função é: “An Expectation for checking an element is visible and enabled such that you can click it.”



  • visibilityOf significa que o elemento não só está no DOM, como está visível, ou seja, tem largura e altura maior que zero, já presenceOf significa que o elemento está presente no DOM, mas ele pode não estar visível (imagine um elemento que está no DOM mas tem a propriedade display: none;
    Espero ter ajudado!



  • Obrigado @Walmyr .
    Aproveitando, gostaria de tirar uma dúvida. Estou usando waitForElementVisibility em alguns elementos e estou conseguindo evitar o uso do sleep, mas estou com algumas dificuldades. Tenho um elemento que usa o mat-select do angular material, e ele tem um delay pra aparecer e sair. Quando dou um clique em um mat-option, ele diz que outro elemento deveria receber o click, que no caso é o cdk-overlay-backdrop do mat-select. O que eu poderia usar nesse caso?



  • @michael-martins
    Testa utilizando o método waitForElementNotToBePresent passando como parâmetro o elemento cdk-overlay-backdrop.
    Depois disso você manda clicar no mat-option.



  • @paulo-gonçalves isso que acabei de fazer e deu certo. Usei waitForElementNotToBeVisible e deu certo. Valeu pela ajuda galera o/