totvs / tir

This module is used to create and execute test suites and test cases for web interfaces.
MIT License
82 stars 49 forks source link

Inclusão da Função get_driver na Classe WebappInternal #1461

Closed JoyFreire closed 2 weeks ago

JoyFreire commented 1 month ago

Descrição Atualmente, a classe WebappInternal, nem as demais, não possui um método claro e direto para acessar o driver Selenium utilizado nas operações de automação. Para garantir que possamos acessar e utilizar o driver de maneira consistente, é necessária a inclusão do método get_driver. Este método será essencial para encontrar elementos na página, especialmente em aplicações desenvolvidas com o framework POUI, já que a biblioteca poui ainda não está completamente pronta para lidar com todos os cenários de automação.

Justificativa A inclusão do método get_driver na classe WebappInternal é crucial pelos seguintes motivos:

Acesso Consistente ao Driver:

O método get_driver fornece um ponto único para acessar o driver Selenium. Isso é especialmente importante em cenários onde um método do TIR não está funcionando, como por exemplo o po-number e po-checkbox cujos componentes ainda não foram desenvolvidos. Mas não só para eles, com o acesso ao driver conseguimos uma integração maior com o Selenium.

Screenshot_4

Integração com Selenium:

Para automatizar testes , é fundamental ter acesso ao driver que controla o navegador. Sem esse acesso, não é possível utilizar o Selenium para encontrar elementos na página, o que é uma funcionalidade chave durante a automação de testes.

Compatibilidade com POUI:

A biblioteca poui ainda está em desenvolvimento e pode não oferecer suporte completo para todas as operações de automação necessárias. Ter acesso direto ao driver permite contornar essas limitações temporárias, garantindo que os testes possam ser executados de maneira eficaz.

Exemplo de Implementação Aqui está um exemplo de como a função get_driver pode ser implementada na classe WebappInternal:

class WebappInternal(Base):

def get_driver(self):
    logger.debug("Tentando obter o driver.")
    if self.driver:
        logger.debug("Driver encontrado com sucesso.")
    else:
        logger.debug("Driver não encontrado.")
    return self.driver

Uso do self.driver já em aplicação:

class MATA038(unittest.TestCase):

@classmethod

def setUpClass(cls):
    cls.oHelper_Poui = Poui(autostart=False)
    cls.oHelper_Webapp = Webapp(autostart=False)
    cls.oHelper_Webapp_internal = WebappInternal(autostart=True)

    # Usando o driver
    try:
        cls.driver = cls.oHelper_Webapp_internal.driver
        print([cls.driver])
    except AttributeError:
        raise AttributeError("A instância de WebappInternal não possui o atributo 'driver'. Verifique a classe WebappInternal.")
    cls.oHelper_Webapp.Setup("SIGAEST", DateSystem, "01", "01")
    cls.oHelper_Webapp.Program('MATA038')

def test_MATA038_001(self):
    # Após abrir a tela do POUI, iniciamos o uso dos métodos do POUI que interagem com os componentes do POUI
    # Efetua o click no menu do componente do POUI
    self.oHelper_Poui.ClickMenu("Fechamentos")
    self.oHelper_Poui.ClickButton("Configurar parâmetros")

    #Onde o driver será necessário
try:
        element = self.driver.find_element(By.XPATH, "//input[@placeholder='00']")
        print([element])

        # Imprimir os elemento encontrados
        print(f"Elemento encontrados: {element}")

        # Imprimir detalhes do elemento
        print(f"Tag Name: {element.tag_name}")
        print(f"ID: {element.get_attribute('id')}")
        print(f"Value: {element.get_attribute('value')}")

        # Limpar o campo de input e inserir o número 2
        element.clear()
        print("Limpou o conteúdo")
        element.send_keys("20")
        print("Inseriu o valor")
        print("Número 20 inserido no campo de input!")

    except TimeoutException:
        logger.error(f"Timeout: O elemento com XPath '{path}' não foi encontrado na página.")
        import traceback
        traceback.print_exc()
    except Exception as e:
        logger.error(f"Ocorreu um erro: {e}")
        import traceback
        traceback.print_exc()

@classmethod
def tearDownClass(cls):
    cls.oHelper_Poui.TearDown()

if name == 'main': unittest.main()

Cleytonalbu commented 1 month ago

Método super necessário, também tenho enfrentado dificuldades para lidar com a interface POUI, e acredito que está solução irá ajudar!

andrevictor0 commented 1 month ago

Muito necessário, as vezes precisamos usar o Selenium de forma mais pura e não conseguimos devido este bloqueio. Dessa forma ficaria muito mais fácil para manipular o Selenium.

smurlocky commented 3 weeks ago

Método necessário para garantir mais versatilidade para o usuário da biblioteca, principalmente para funções que a biblioteca ainda não suporta, como o já mencionado PO-UI

renanllisboa commented 2 weeks ago

Boa tarde,

Entendemos a necessidade de todos quanto a acesso aos métodos internos do TIR para determinados componentes ainda não implementados.

A necessidade de manter interno esses métodos é para garantir menor desvio no script e que podem ocorrer quebras caso mude algum seletor na tela.

A ideia do TIR é garantir que o script se mantenha integro independente da tecnologia criada ou modificada.

A nossa sugestão no momento é abrir uma issue solicitando a implementação desejada ou até mesmo a colaboração com o projeto através de um Pull Request.

Atenciosamente