Ajuda com Selenium + Specflow

28 views
Skip to first unread message

Karina Campanharo

unread,
Sep 27, 2024, 11:37:29 AM9/27/24
to Selenium Brasil
Ola, pessoal

Estou iniciando automação com Selenium com C# e Specflow. 

Preciso executar meus cenários de testes, separados em arquivos .features
sem abrir diversos navegadores. Para executar preciso esta logada na página. 

E quando vou executar abrem diversos navegadores ao mesmo tempo. 

alguém sabe como me ajudar?

Obrigada

Karina

Patrick Bressan Bremm

unread,
Sep 27, 2024, 12:56:55 PM9/27/24
to Selenium Brasil
Precisamos visualizar como você está fazendo o "new Driver()"... Se puder trazer exemplo do seu código... Tem varias maneiras de executar em paralelo ou apenas com 1 instancia X para todos os testes.

Atenciosamente,
Patrick Bremm

Karina Campanharo

unread,
Sep 27, 2024, 3:10:41 PM9/27/24
to Patrick Bressan Bremm, Selenium Brasil
Oi Patrick, obrigada pela resposta e pela atenção:

Abaixo mandei como criei dois arquivos: o primeiro BasePage, que eu mapeio os elementos e o segundo que executo os steps da .feature,

se eu criar outra feature com um cenário já logado, vai abrir várias vezes o chrome. serão vários arquivos .feature com cenários diferente, porém, em comum o login. 

Eu criei esse arquivo para mapear os elementos:

using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Support.UI;
using System;

namespace MeuProjeto.PageObjects
{
    public class BaseLogin
    {
        private IWebDriver Driver;
        private WebDriverWait Wait;


        private IWebElement userName => Driver.FindElement(By.XPath("//input[@id='username']"));

        private IWebElement facaLogin => Driver.FindElement(By.XPath("//a[contains(text(),'Sign in')]"));

        private IWebElement clickNext => Driver.FindElement(By.XPath("//input[@id='continue']"));
        private IWebElement enterPassword => Driver.FindElement(By.XPath("//input[@id='password']"));
        private IWebElement clickbutton => Driver.FindElement(By.XPath("//button[@type='submit']"));
       // private IWebElement clickOk => Driver.FindElement(By.XPath(""));

        public const int DefaultWaitInSeconds = 10;



        public BaseLogin()
        {
            Driver = new ChromeDriver();
            Driver.Manage().Window.Maximize();
            Driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(12);
        }

        public void NavigateTo()
        {
            Driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(5);
            Driver.Navigate().GoToUrl("https://www.linkedin.com");
        }


        public void ClicarLogin()
        {
            Driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(5);
            facaLogin.Click();
        }

        public void EnterUser(String username)
        {
            Driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(5);
            userName.SendKeys(username);
        }

        public void ClickNext()
        {
            Driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(5);
            clickNext.Click();
        }

        public void Password(String password)
        {
            Driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
            enterPassword.SendKeys(password);
        }


        public void ClickButton()
        {
            Driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
            clickbutton.Click();    
        }

      /*  public void ClickOk()
        {
            Driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(5);
            clickOk.Click();
        }
      */
  
    }
}


E este daqui é o step do login:

using System;
using MeuProjeto.PageObjects;
using OpenQA.Selenium;
using OpenQA.Selenium.Support.UI;

namespace MeuProjeto.StepDefinitions
{
    [Binding]
    public class LoginPageStepDefinitions :BaseLogin {

     BaseLogin baseLogin = new BaseLogin();

        [Given(@"Eu estou Logado na Página do App360")]
        public void GivenEuAcesseiAPaginaDeLogin()
        {

            baseLogin.NavigateTo();

        }

        [When(@"Cliquei em Faca Login")]
        public void WhenCliqueiEmFacaLogin()
        {
            baseLogin.ClicarLogin();
        }

        [When(@"Inserir o usuário")]
        public void WhenInserirOUsuario()
        {
            baseLogin.EnterUser("sanch...@Hotmail.com");

        }

       /* [When(@"Cliquei em Continuar")]
        public void WhenCliqueiEmNext()
        {
            baseLogin.ClickNext();
        }

        */
        [When("Preenchi a Senha")]
        public void WhenPreenchiASenha()
        {
            baseLogin.Password("ksc12345**@");

        }

        [When(@"Cliquei em Button Next")]
        public void WhenCliqueiEmButtonNext()
        {
            baseLogin.ClickButton();
        }

        /*
                [When(@"Cliquei em OK")]
                public void WhenCliqueiEmOK()
                {
                    baseLogin.ClickOk();
                }


                [Then(@"então serei logado")]
                public void ThenEntaoSereiLogado()
                {
                    throw new PendingStepException();
                }*/
 
        }


    }
}

--
Visite em https://groups.google.com/d/forum/selenium-brasil
---
You received this message because you are subscribed to the Google Groups "Selenium Brasil" group.
To unsubscribe from this group and stop receiving emails from it, send an email to selenium-bras...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/selenium-brasil/02bc08c3-5c16-43a2-87d0-7712daed0dfan%40googlegroups.com.

Patrick Bressan Bremm

unread,
Sep 27, 2024, 4:24:04 PM9/27/24
to Selenium Brasil
Vamos lá,

O código que cria vários navegadores é esse:

Driver = new ChromeDriver();

Como o Runner acaba lendo ele toda vez ele vai abrir quantas vezes tiver esse código, uma solução é você fazer o teste validar se Existe um navegador aberto? Se sim, utilizar a variável driver existente, se não fazer NEW na  variável driver:

Exemplo bem enxuto:
//Precisa deixar a variavel Driver static, exemplo:
private static IWebDriver Driver; 
if (Driver == null) { 
 Driver = new ChromeDriver(); Driver.Manage().Window.Maximize(); 
 }  
// Esse código no construtor da classe: public BaseLogin()

Para facilitar minha explicação eu usei o ChatGpt ele demonstra uma solução, que é separar o BaseLogin da criação do Driver que é o navegador:


Capitulo 2 ele demonstra o exemplo ideal de como fazer.

Reforçando: Cada vez que você executa new ChromeDriver() ele vai criar um navegador, por isso da importância da validação se ele já existe.

Espero ter ajudado

Atenciosamente,
Patrick Bremm
Reply all
Reply to author
Forward
0 new messages