NOTA: vamos chamar 'clique' é clique do usuário final. 'js click' é clique via JS
Por que clicar em "via JavaScript" funciona quando um clique normal no WebDriver não funciona?
Existem 2 casos para que isso aconteça:
I. Se você estiver usando o PhamtomJS
Então este é o comportamento conhecido mais comum de PhantomJS
. Alguns elementos às vezes não são clicáveis, por exemplo <div>
. Isso ocorre porque o PhantomJS
original foi criado para simular o mecanismo dos navegadores (como HTML + CSS inicial -> computação CSS -> renderização). Mas isso não significa que você interaja com o usuário final (visualizando, clicando, arrastando). Portanto, PhamtomJS
é apenas parcialmente suportado pela interação dos usuários finais.
POR QUE JS CLICA TRABALHO? Quanto aos cliques, todos são cliques médios. É como uma arma com 1 cano e 2 gatilhos . Um da viewport, um da JS. Como PhamtomJS
ótimo na simulação do mecanismo do navegador, um clique em JS deve funcionar perfeitamente.
II O manipulador de eventos de "click" foi vinculado no período incorreto.
Por exemplo, temos um <div>
-> Fazemos alguns cálculos
-> então ligamos o evento click ao <div>
.
-> Além disso, com alguma codificação incorreta do angular (por exemplo, não manipulando o ciclo do osciloscópio corretamente)
Podemos acabar com o mesmo resultado. O clique não funcionará, porque o WebdriverJS está tentando clicar no elemento quando ele não possui um manipulador de eventos de clique.
POR QUE JS CLICA TRABALHO? O clique em Js é como injetar js diretamente no navegador. Possível de 2 maneiras,
O punho é através do console do devtools (sim, o WebdriverJS se comunica com o console do devtools).
O segundo é injetar uma <script>
tag diretamente no HTML.
Para cada navegador, o comportamento será diferente. Mas, independentemente disso, esses métodos são mais complicados do que clicar no botão. O Click está usando o que já existe (clique do usuário final), o js click está passando pelo backdoor.
E para js, o clique parecerá uma tarefa assíncrona. Isso está relacionado a um tópico meio complexo de ' tarefa assíncrona do navegador e agendamento de tarefas da CPU ' (leia-a há algum tempo, não é possível encontrar o artigo novamente). Em resumo, isso resultará principalmente porque o js click precisará aguardar um ciclo de agendamento de tarefas da CPU e será executado um pouco mais devagar após a ligação do evento click.
(Você pode conhecer esse caso quando encontrar o elemento algumas vezes clicável, outras vezes não.)
Quando exatamente isso está acontecendo e qual é a desvantagem dessa solução alternativa (se houver)?
=> Como mencionado acima, ambos significam um propósito, mas sobre o uso de qual entrada:
- Clique: está usando o que fornece por padrão do navegador.
- JS click: está passando por backdoor.
=> Para desempenho, é difícil dizer porque se baseia em navegadores. Mas geralmente:
- Clique: não significa mais rápido, mas apenas assinou uma posição superior na lista de agendamento da tarefa de execução da CPU.
- Clique em JS: não significa mais lento, mas apenas entrou na última posição da lista de agendamento da tarefa da CPU.
=> Desvantagens:
- Clique: não parece ter nenhuma desvantagem, exceto que você está usando o PhamtomJS.
- JS click: muito ruim para a saúde. Você pode clicar acidentalmente em algo que não existe na exibição. Ao usar isso, verifique se o elemento está lá e disponível para visualizar e clicar como o ponto de vista do usuário final.
PS se você estiver procurando por uma solução.
- Usando o PhantomJS? Vou sugerir o uso do Chrome sem cabeça. Sim, você pode configurar o Chrome sem cabeça no Ubuntu. A coisa funciona exatamente como o Chrome, mas apenas não tem uma visualização e menos bugs como o PhantomJS.
- Não está usando o PhamtomJS, mas ainda está tendo problemas? Vou sugerir o uso de ExpectedCondition of Transferidor com
browser.wait()
( verifique isso para obter mais informações )
(Quero abreviar, mas acabou mal. Qualquer coisa relacionada à teoria é complicada de explicar ...)