Python + pytest

Topic created · 6 Posts · 76 Visualizações
  • Pessoal, eu preciso de uma estrutura simples, PO para python, alguem tem algum exemplo?

    Estava imaginando algo assim:
    Action > action_login (Aqui ficaria todas as ações das paginas ex: logar , preencher senha)
    Pages > login_page (Aqui eu iria mapear todos os elementos das paginas)
    Test > test_login (Aqui eu chamaria todos os metodos para executar os testes)

    Estou com dificuldade na hora de separar os elementos das paginas:

    from selenium import webdriver

    class LoginPage():

    def form_username(self):
        browser = webdriver.Chrome
        txtusername = browser.find_element_by_id("UserName")
        return txtusername
    

    class LoginAction(LoginPage):

    def login(self, username):
        self.form_username().clear()
        self.form_username().send_keys(username)
    

    Ele da erro no metodo browser, pq tenho que ficar chamando ele toda hora que for localizar um elemento, eu precisaria de uma classe page_base mas não sei como fazer…

  • Pq nao faz um singleton pro Browser? Tbm botei uma property ali pra ajudar a evitar uns parenteses.

    Plus, ja que vc ta aberto a sugestoes, eu acredito que heranca e desnecessaria aqui. E te ajuda a ser mais flexivel (varias actions podem usar login page). Portanto, ja alterei abaixo com essa sugestao.

    class Browser:
        BROWSER = None
        @staticmethod
        def singleton():
            if not Browser.BROWSER:
                Browser.BROWSER = webdriver.Chrome
            return Browser.BROWSER
    

    class LoginPage():

    @property
    def form_username(self):
        txtusername = Browser.singleton().find_element_by_id("UserName")
        return txtusername
    

    class LoginAction:

    def login(self, username):
        self.login_page.form_username.clear()
        self.login_page.form_username.send_keys(username)
    
  • @Gabriel-Oliveira disse em Python + pytest:

    mais flexivel (varias actions podem usar login page). Portanto, ja alterei abaixo com essa sugestao.

    Muito obrigado, ajudou muito 🙂

  • Me tira uma duvida, ao executar exatamente como está ai, esta dando erro na linha:

    txtusername = Browser.singleton().find_element_by_id(“UserName”)

    Erro: TypeError: find_element_by_id() missing 1 required positional argument: ‘id_’

    Estranho pq se eu tirar o singleton e colocar direto na classe de teste funciona o find element.

  • Este post está deletado!
  • Ahrg, claro… em minha defesa, teu post inicial me induziu ao erro 🙂

    A forma ( A ) abaixo te faz por na variavel driver a classe Chrome. Nao instanciar o objeto - essa seria a forma ( B ). Tambem botei abaixo o que acontece me Runtime e deixei o exemplo acima errado de proposito, pra o pessoal nao se confundir ao ler a thread no futuro.

    Isso resolve o problema @Maicon-William ?

    ( A ) driver = webdriver.Chrome
    ( B ) driver = webdriver.Chrome()
    

    Runtime:

    >>> from selenium import webdriver
    >>> from webdriver_manager.chrome import ChromeDriverManager
    >>> 
    >>> driver = webdriver.Chrome
    >>> driver
    <class 'selenium.webdriver.chrome.webdriver.WebDriver'>
    >>> type(driver)
    <class 'type'>
    >>>  driver = webdriver.Chrome(ChromeDriverManager().install())
    >>> driver.get
    <bound method WebDriver.get of <selenium.webdriver.chrome.webdriver.WebDriver (session="051de189e876a1728961003e980d4f49")>>
    >>> driver
    <selenium.webdriver.chrome.webdriver.WebDriver (session="051de189e876a1728961003e980d4f49")>
    >>> type(driver)
    <class 'selenium.webdriver.chrome.webdriver.WebDriver'>
    >>>