Tuesday 10 April 2018

Waitforexist


waitForExist não funciona como esperado # 1420.


Monolithed comentou 29 de junho de 2018.


Deve ser um resultado booleano, tanto quanto eu sei.


Meu caso de usuário padrão:


Christian-bromann comentou 29 de junho de 2018.


@monolithed, você deve usar waitForExist como este:


Você não precisa do afirmativo porque o comando irá jogar se não conseguir encontrar o elemento dentro do tempo limite.


Monolithed comentou Jun 29, 2018 & # 8226;


Eu acho, não é a melhor mensagem.


Monolithed comentou 30 de junho de 2018.


@ christian-bromann, você poderia testá-lo? Parece esperar * comandos não jogar erro se ele não conseguir encontrar o elemento dentro do tempo limite.


Christian-bromann comentou 30 de junho de 2018.


Nós temos um teste para isso aqui.


Monolithed comentou Jun 30, 2018 & # 8226;


É saída não informativa.


Eu não quero usar a instrução try / catch em todo lugar.


Monolithed comentou 30 de junho de 2018.


Por sinal, existe maneira de reduzir o tempo limite global de 10000ms?


Christian-bromann comentou 30 de junho de 2018.


Sim, definindo o tempo limite em seus mochaOpts.


Monolithed comentou Jun 30, 2018 & # 8226;


Não estamos passando a nossa função para afirmar. cancos (). Mas encontrei uma maneira de resolver meu problema localmente:


Christian-bromann comentou 30 de junho de 2018.


Que diferença isso faz?


Monolithed comentou 30 de junho de 2018.


Kurtharriger comentou 30 de junho de 2018.


Acho que a diferença está na mensagem de erro. O "garantir feito () é.


ser chamado neste teste "é confuso para novos usuários e os envia.


desviado. Nós temos uma história em nosso backlog para melhorar o envio de mensagens de erro.


Infelizmente, estamos usando o jasmim para migrar nosso.


Conjunto de teste anterior mais fácil.


Em Qui, 30 de junho de 2018 às 10:46 AM Alexander Abashkin & lt;


Você está recebendo isso porque você está inscrito neste tópico.


Responda diretamente a este e-mail, visualize-o no GitHub.


ou mude o fio.


Christian-bromann comentou 30 de junho de 2018.


O "garantir que o feito () está sendo chamado neste teste" é confuso para novos usuários e os desvia.


Isso só aparece quando um tempo limite Mocha foi atingido. Posso corrigir esse erro no wdio-sync.


&cópia de; 2018 GitHub, Inc. Termos Privacidade Segurança Status Ajuda.


Você não pode executar essa ação neste momento.


Você fez login com outra guia ou janela. Recarregue para atualizar sua sessão. Você se separou em outra guia ou janela. Recarregue para atualizar sua sessão.


element. waitForExist (seletor) retorna verdadeiro mesmo se o seletor não existir no elemento # 1869.


macrozone comentou 11 de fevereiro de 2017.


Eu tenho essa situação:


Dado que #mainNav existe e não contém um link / de / profile, espero que o WebDriver seja logado.


mas, em vez disso, registra.


Então eu suponho que element. waitForExist ignora o seletor fornecido.


Christian-bromann comentou 12 de fevereiro de 2017.


@macrozone obrigado por enviar o problema. Eu reparei o bug e o lançarei com a próxima versão.


&cópia de; 2018 GitHub, Inc. Termos Privacidade Segurança Status Ajuda.


Você não pode executar essa ação neste momento.


Você fez login com outra guia ou janela. Recarregue para atualizar sua sessão. Você se separou em outra guia ou janela. Recarregue para atualizar sua sessão.


browser. waitForExist () com reverse = true falha ao detectar elemento não existente e lança a exceção # 2082.


Kirksl comentou 17 de maio de 2017 e # 8226;


O problema.


A situação específica que estou codificando é um elemento pop-up que anteriormente não existia no DOM que existe depois de eu inserir credenciais inválidas, aguardo X segundos e depois desaparece e sai do DOM.


browser. waitForExist () com reverse = false parece funcionar perfeito. ele retorna imediatamente verdadeiro assim que um elemento existe no DOM.


browser. waitForExist () com reverse = true falha. Ele rola com chamadas de POST / elementos enquanto o elemento existe no DOM e, assim que o elemento não existe mais, é feita uma chamada final de POST / elementos que aguarda toda a duração do waitForTimeout definido, a resposta da chamada POST retorna " valor ": [] e uma exceção é lançada Erro: elemento (" span = nome de usuário / senha errados. Por favor, tente novamente. ") ainda visível após 30000ms.


Meio Ambiente.


Versão do WebdriverIO: 4.8.0 Versão do nó. js: v6.10.3 Modo autônomo ou testemunho do wdio: wdio testrunner se wdio testrunner, executando testes síncronos ou assíncronos: sincronização: true Pacotes adicionais de Wdio usados ​​(se aplicável): "selênio-autônomo": "^ 6.4.1", "wdio-mocha-framework": "^ 0.5.10"


Link para logs do Selenium / WebdriverIO.


O último POST / elementos após o elemento agora deixou o DOM que aguarda tempo limite inteiro antes que uma exceção seja lançada.


"valor": "// span [normalize-space () =" Nome de usuário / senha incorreto. Por favor, tente novamente."]"


Código para reproduzir o problema [bom ter]


// localizador de destino que será retirado do DOM antes do timeout_here.


retornar driver. waitForExist (your_locator_here, timeout_here, true);


Christian-bromann comentou 17 de maio de 2017.


@kirksl você tem tempo limite implícito definido?


Kirksl comentou 17 de maio de 2017.


@ christian-bromann eu faço. primeiro comando no meu mocha - & gt; before (). browser. timeouts ('implícito', 30000);


Christian-bromann comentou 17 de maio de 2017.


esse é o problema ... a última espera é devido ao seu tempo limite implícito.


Kirksl comentou 18 de maio de 2017.


@ christian-bromann qualquer informação casual como essa pode encontrar o caminho para a exceção de lances de WDI ou na documentação do webdriver. io api em tempo limite? a informação é "garantir que você não tenha configurado uma espera implícita" ao usar métodos de espera ***.


Christian-bromann comentou 18 de maio de 2017.


Bem, se você definir explicitamente o tempo limite implícito para 30s, por que você esperaria um aviso então? Você não deve usar espera implícita em geral. Não consigo adicionar avisos para casos de borda em cada exceção.


Kirksl comentou 18 de maio de 2017.


@ christian-bromann eu acho que é razoável com base na documentação do wdio para ver como alguém poderia se confundir. quando eu goto api - & gt; Timeouts diz-me que é o tempo limite de quando abortar elementos de localização. quando eu goto api - & gt; waitforexist diz-me que o spec'd 'ms' ou 500ms (padrão) é o tempo limite de quando abortar elementos de localização. Tudo parece complementar e quase como se alguém anulasse o outro. Provavelmente, espero *** superando o tempo limite implícito global.


Acoplando isso com sua afirmação de que ninguém deve usar espera implícita em geral, parece merecer pelo menos atualizar a documentação. Para mim, pessoalmente, seria ótimo se o wdio resolva coisas como esta para evitar que exista um conflito. Por exemplo, se eu definir implícito, ótimo. se eu então for um comando de espera *** play legal e simplesmente ignore o implícito e execute com a estratégia de tempo limite de espera.


Adicione documentação sobre expectativas explícitas e implícitas # 2083.


Christian-bromann comentou 18 de maio de 2017.


Vejo o seu ponto de vista. No entanto, se você definiu um tempo limite implícito, por que você usa espera explícita, então? Eu poderia alterar o tempo limite implícito para que waitForExist funcione, mas isso exigiria sempre verificar o tempo limite de espera implícito. Eu acho que podemos começar com a adição de uma nota ao comando waitForExist mencionando o problema de espera implícita e explícita. O que você acha?


Kirksl comentou 18 de maio de 2017 e # 8226;


Logicamente, minha idéia era essa. conjunto implícito para me dar um método de empregar cobertura de espera global. recrute os métodos de espera *** conforme necessário para situações que implícitas não cobrem. Por exemplo, um popup desaparece (elemento dom criado), o popup desaparece (elemento dom destruído). Eu preciso de um método para aguardar que o popup desapareça e assegure-se de que o fez. Por exemplo, algumas páginas ou elementos podem precisar de uma espera única devido a fatores externos (rede, disco, etc.), mas eu quero manter meus tempos de espera mais curtos caso contrário, usando implícito. por exemplo, cobertura para outras coisas não relacionadas ao elemento, usando waitUntil () para aguardar a alteração de url.


Eu acho que definitivamente devemos notar o problema das expectativas implícitas / explícitas. seria ótimo se o wdio pudesse, além disso, absolver esse problema todos juntos no código. É uma ótima ferramenta que abstrai muitas cerimônias e coisas que causam dores de cabeça. Isso parece ser uma ótima coisa para abstrair.


Christian-bromann comentou 18 de maio de 2017.


seria ótimo se o wdio pudesse, além disso, absolver esse problema todos juntos no código.


Eu duvido que isso seja possível. Como você gostaria de abstrair isso? Os tempos limite implícitos são gerenciados no lado de Selenium. Você poderia criar um novo método de elemento que use waitForExist para simular espera implícita por meio de espera explícita.


Kirksl comentou 18 de maio de 2017.


não parece possível atravessar entre implícito / explícito se a configuração de um tempo limite implícito no wdio equivale a este https: // w3 / TR / webdriver / # dfn-session-implicit-wait-timeout em que é estático para a vida do sessão de webdriver. A única opção que eu posso ver para que o wdio abstraia isso é simular em seu código o que o esperma implícito do selênio nativo tenta alcançar em que você poderia percorrer as duas estratégias. Estou apenas pensando em voz alta, não tenho certeza do que isso implica, se é possível e a dor de cabeça traz para implementar. pode ser um exagero e boa documentação deve governar o dia?


Comandos não sendo substituídos # 1539.


&cópia de; 2018 GitHub, Inc. Termos Privacidade Segurança Status Ajuda.


Você não pode executar essa ação neste momento.


Você fez login com outra guia ou janela. Recarregue para atualizar sua sessão. Você se separou em outra guia ou janela. Recarregue para atualizar sua sessão.


Qual a diferença entre waitFor e waitForExist? # 426.


notnarb comentou 12 de fevereiro de 2018.


Aguarde um elemento (selecionado pelo seletor css) para que a quantidade fornecida de milissegundos seja existente dentro do DOM. Se vários elementos forem consultados por determinado seletor, ele retornará verdadeiro (ou falso se a bandeira inversa estiver configurada) se pelo menos um elemento estiver visível.


Aguarde um objeto no DOM (selecionado por determinado seletor) para a quantidade fornecida de milissegundos. O retorno de chamada é chamado com falso se o objeto não for encontrado.


O 'se pelo menos um elemento estiver visível' parece ser uma cópia / colar de waitForVisible, então eu presumo que eles estão destinados a fazer o mesmo. Curiosamente, a implementação para os dois parece completamente diferente.


Eles são comandos redundantes ou a documentação talvez seja um pouco mais clara sobre quais papéis específicos eles devem preencher?


Christian-bromann comentou 12 de fevereiro de 2018.


waitFor é o comando native Selenium waitFor e todos os outros waitFors são um pouco mais sofisticados, pois eles usam executeAsync e outros comandos para aguardar os elementos. Mas você está certo, isso deve ser mencionado nos documentos.


notnarb comentou 12 de fevereiro de 2018.


Voltei a ver a fonte e parece que o comando waitFor usa o comando 'elemento' e 'waitForExist' usa o comando elements. O comando waitFor resolve com null e waitForExist resolve com true.


Ele também parece que o comando waitFor usa o comando webdriver. io 'implicitWait' depreciado que aplica o comando timeoutsImplicitWait que chama o comando selenium implicit_wait.


Melhorar a documentação para a versão v3 # 524.


8 de 8 tarefas completas.


Christian-bromann comentou 8 de junho de 2018.


Será abordado pelo # 524.


Christian-bromann comentou 24 de junho de 2018.


Ok, apenas olhei para o código e, aparentemente, waitFor é apenas uma versão simples do waitForExists. Por isso, eu removo o comando waitFor.


&cópia de; 2018 GitHub, Inc. Termos Privacidade Segurança Status Ajuda.


Você não pode executar essa ação neste momento.


Você fez login com outra guia ou janela. Recarregue para atualizar sua sessão. Você se separou em outra guia ou janela. Recarregue para atualizar sua sessão.


Os objetos de página não podem usar `isExisting ()` ou `waitForExist ()` # 1715.


Scottrippey comentou 17 de novembro de 2018 e # 8226;


O problema.


Em meus testes, estou usando objetos de página exclusivamente. No entanto, eu encontrei um problema sério com o método isExisting () e sua derivada waitForExist ().


Para um elemento que não existe, isso funcionará:


No entanto, usando o padrão de objeto da página (simplificado aqui), isso não funcionará:


O mesmo erro é lançado sempre que eu uso waitForExist (). faz uma pausa para o tempo limite, aguardando a existência do elemento, então lança o mesmo erro "Um elemento não pode ser localizado".


christian-bromann comentou 17 de novembro de 2018 e # 8226;


Não é possível reproduzir isso com a versão mais recente:


Scottrippey comentou 17 de novembro de 2018 e # 8226;


Uau, obrigado pela resposta rápida!


Eu atualizei meu teste para combinar com você, mas fiquei surpreso ao descobrir que ainda falhou. Estou na versão 4.4.0, que é mais recente.


A única coisa que pode ser diferente é que não estou usando "modo síncrono", estou realmente usando Promises. Não tenho certeza se isso faz a diferença, mas simplifiquei meu exemplo para procurar sincronizar, mesmo que fosse assíncrono.


Veja como estou realmente reproduzindo o problema:


Mesmo erro como antes: Erro: um elemento não poderia estar localizado na página usando os parâmetros de pesquisa fornecidos ("aaa").


Scottrippey comentou 17 de novembro de 2018 e # 8226;


Após a depuração por um tempo, aqui está o que encontrei.


isExisting basicamente faz this. elements (selector).length & gt; 0.


Então, se eu tentar elementos do browser. element ('aaa'). (), Eu recebo o mesmo erro (em vez de uma matriz vazia). Eu acho que elementos () está procurando descendentes de elemento ('aaa'), então ele falha em https: //github/webdriverio/webdriverio/blob/master/lib/protocol/elements. js#L59.


Christian-bromann comentou 17 de novembro de 2018.


@scottrippey nós concentramos nossos esforços recentes no teste do navegador de sincronização, então algumas das características podem não ser compatíveis no modo assíncrono ainda. Por que você quer executá-lo de forma assíncrona?


Scottrippey comentou 17 de novembro de 2018.


Meus testes estão sendo executados no Spectron (para um aplicativo Electron) e, na medida em que eu posso determinar, ele só suporta o modo assíncrono.


Bharadwaj108 comentou 21 de novembro de 2018 e # 8226;


Eu tenho o mesmo problema que eu tenho que usar o spectron para testar meu aplicativo de eletrônicos e eu recebo o mesmo problema que não consigo acessar nenhum dos elementos no aplicativo de elétrons. Este é o meu código:


E esta é a saída.


Este é o elemento no quadro.


& lt; input class = "form-control ng-untouched ng-pristine ng-invalid" id = "inputUsername3" placeholder = "Nome de usuário" type = "text" ng-reflect-form = "[object Object]" & gt;


Você pode fornecer uma solução para este problema, pois não posso acessar todos os objetos da página.


Scottrippey comentou 22 de novembro de 2018.


@ Bharadwaj108 Desculpe, parece que seu problema não está relacionado. Você não está usando. element (seletor).isExisting (), e desde que seu teste está registrando Element existe: false, significa que o método isExisting está retornando falso. No meu exemplo, elemento (seletor).isExisting () está jogando um erro (rejeição).


Christian-bromann comentou 2 de dezembro de 2018.


Ok depois de revisar esta questão novamente, tenho medo de não poder fazer nada aqui. De acordo com o protocolo, a Webdriver lançará um erro se um elemento não puder ser encontrado. Não quero mudar isso. Se você quiser verificar se existe um elemento, faça isso em vez disso:


&cópia de; 2018 GitHub, Inc. Termos Privacidade Segurança Status Ajuda.


Você não pode executar essa ação neste momento.


Você fez login com outra guia ou janela. Recarregue para atualizar sua sessão. Você se separou em outra guia ou janela. Recarregue para atualizar sua sessão.

No comments:

Post a Comment