Você acabou de escrever um teste usando a estrutura do WebDriver e está confiante de que ele está completo. Você vai testá-lo e....falha com o temido erro de referência de elemento obsoleto. Qual é a sua jogada?
De acordo com MDN, o site oficial da Mozilla para documentação de desenvolvimento de padrões da Web, O erro ocorre porque você está tentando executar uma ação em um elemento da Web que faz referência a um elemento que não está mais anexado ao DOM.
Diversos cenários podem acionar esse comportamento na página da Web. Não se espera que ele esteja na página, portanto, é uma prática recomendada evitar tentar executar uma ação com esse elemento da Web. No entanto, há eventos que podem acionar a substituição de um elemento, fazendo com que o elemento da Web que o representa se torne obsoleto. Esse último é o cenário que discutiremos.
Se você for como eu, ao se deparar com um erro, recorrerá à Internet para obter ajuda. Uma pesquisa rápida lhe dirá para resolver esse problema tentando novamente em um loop. Não é uma ótima solução, mas os engenheiros de controle de qualidade ainda a usarão porque, bem, ela funciona. No entanto, eu o aconselho a estar ciente das possíveis armadilhas associadas a essa abordagem. O loop pode ser infinito, dependendo da implementação. Isso pode ser facilmente resolvido estabelecendo-se um limite, mas essa abordagem ainda não é dimensionável. Isso exigiria que você duplicasse uma grande quantidade de código que inclui um loop e um bloco try catch.
Agora, temos um problema que não pode ser resolvido tão facilmente.
Você pode notar as possíveis armadilhas mencionadas acima. Por exemplo, ele pode entrar em loop indefinidamente porque não há controle no caso de o elemento estar sempre desatualizado. Além disso, ainda precisaremos repetir esse código para ações adicionais como .GetAttribute, .IsEnabled, Texto o que criará nosso problema de escalabilidade.
Se você voltar à definição de erro de referência de elemento obsoleto em MDNSe você estiver usando o WebDriver, verá que ele menciona um UUID, que o WebDriver usa para identificar cada elemento que busca. Esse UUID muda sempre que um elemento é alterado. Quando um elemento passa de não obsoleto para obsoleto e volta a não obsoleto novamente, mudança está acontecendo, certo? Entender isso é fundamental para o desenvolvimento de uma solução mais escalável para evitar o erro de referência de elemento obsoleto.
Primeiro, você precisa ter certeza de que tem acesso a esse UUID na estrutura que está usando. No Selenium.NET, ele está disponível por meio da opção ToString() do método IWebElement interface. Em seguida, você deve descobrir qual ação aciona a substituição do elemento com o qual você está tentando interagir. Essa etapa é fundamental porque define um antes e um depois e o ajudará a entender melhor o aplicativo, o que é uma vitória para você como parte da equipe de controle de qualidade. Agora que você identificou o ponto de virada, salve o UUID do elemento antes desse comando.
Por fim, você deve encontrar uma maneira de limitar a avaliação desse UUID. Você pode optar por limitar por quantidade de iterações ou por tempo. Como as alterações do elemento ocorrem ao longo do tempo, talvez o tempo seja o melhor caminho a seguir. No Selenium.NET, a função WebDriverWait ajudará, pois você pode especificar uma classe tempo limite limite.
Isso resolve as duas armadilhas porque tem um limite e uma exceção de tempo limite. Após a implementação dessas linhas, você estará seguro para interagir com o elemento. É perfeito? Talvez não, ainda pode haver alguns problemas de dimensionamento, mas a maioria deles pode ser facilmente resolvida independentemente de sua arquitetura.
Derick Arzu é Engenheiro de software na number8 com ampla experiência em automação de controle de qualidade. Ele tem conhecimento em Selenium WebDriver, WebdriverIO, Protractor.js, NUnit, Mocha.js, Cucumber.js e Chai.js. Você pode acompanhá-lo seguindo seu blog em https://derickarzu.dev/
Forneça suas informações para conversar com um executivo de contas da number8 sobre suas necessidades de desenvolvimento hoje mesmo e sinta como é ser ouvido antes de ser vendida uma solução.
Permita-nos ajudá-lo a agregar profissionais altamente qualificados, desenvolvedores versáteis para a sua equipe.