1
resposta

Valor do Lance Atual com o campo Input dando erro!

Já revisei o meu código todo com o do vídeo e não consigo achar nenhum erro/diferença. Meu codigo:

TESTE:

public class AoOfertarLance
{
    private IWebDriver driver;

    public AoOfertarLance(TestFixture fixture)
    {
        driver = fixture.Driver;
    }

    [Fact]
    public void DadoLoginInteressadaDeveAtualizarLanceAual()
    {
        //arrange
        var loginPO = new LoginPO(driver);
        loginPO.Visitar();
        loginPO.PreencheFormulario("fulano@example.org", "123");
        loginPO.SubmeteFormulario();

        var detalhePO = new DetalheLeilaoPO(driver);
        detalhePO.Visitar(1); //em andamento

        //act
        detalhePO.OfertarLance(300);

        //assert

            //Thread.Sleep(4000);
            //Assert.Equal(300, detalhePO.LanceAtual);

        var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(8));
        bool iguais = wait.Until( drv => detalhePO.LanceAtual == 300 );
        Assert.True(iguais);
    }
}

PO:

public class DetalheLeilaoPO
{
    private IWebDriver driver;
    private By byInputValor;
    private By byBotaoOfertar;
    private By byLanceAtual;

    public DetalheLeilaoPO(IWebDriver driver)
    {
        this.driver = driver;
        byInputValor = By.Id("Valor");
        byBotaoOfertar = By.Id("btnDarLance");
        byLanceAtual = By.Id("lanceAtual");
    }

    public double LanceAtual
    {
        get
        {
            var valorTexto = driver.FindElement(byLanceAtual).Text;
            var valor = double.Parse(valorTexto, System.Globalization.NumberStyles.Currency);
            return valor;
        }
    }

    public void Visitar(int idLeilao)
    {
        driver.Navigate().GoToUrl($"http://localhost:5000/Home/Detalhes/{idLeilao}");
    }

    public void OfertarLance(double valor)
    {
        driver.FindElement(byInputValor).SendKeys(valor.ToString());
        driver.FindElement(byBotaoOfertar).Click();
    }
}

Imagem do erro:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade Insira aqui a descrição dessa imagem para ajudar na acessibilidade

1 resposta

Olá!

Esse erro ocorre quando o Selenium WebDriver não consegue encontrar o elemento desejado dentro do tempo limite especificado. No seu código, você está usando uma espera explícita (WebDriverWait) para verificar se o valor do lance atual foi atualizado após fazer uma oferta de lance. O erro ocorre porque o WebDriver não conseguiu encontrar o elemento byLanceAtual dentro do tempo limite de 8 segundos.

  1. Verifique o seletor (locator) do elemento: Certifique-se de que o seletor byLanceAtual está correto e que o elemento com esse ID está presente na página. Você pode usar a ferramenta de desenvolvedor do navegador para verificar se o ID está correto e se o elemento está disponível.

  2. Aumente o tempo limite: Se o elemento levar mais tempo para ser atualizado, você pode aumentar o tempo limite na espera explícita. Por exemplo, em vez de TimeSpan.FromSeconds(8), você pode usar TimeSpan.FromSeconds(15) para esperar 15 segundos.

  3. Verifique se a página foi carregada completamente: Às vezes, a espera explícita pode não funcionar se a página não tiver sido totalmente carregada. Você pode adicionar uma verificação adicional para garantir que a página tenha sido carregada completamente antes de tentar encontrar o elemento.

  4. Use uma espera implícita: Em vez de uma espera explícita, você pode usar uma espera implícita que instrui o WebDriver a esperar por um determinado período antes de tentar encontrar um elemento. Isso pode ser feito assim:

driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(15);

O uso de esperas explícitas é uma prática recomendada para aguardar elementos específicos em uma página, mas você deve garantir que os seletores estejam corretos e que a página tenha sido totalmente carregada antes de tentar encontrar o elemento. Se necessário, ajuste o tempo limite de espera de acordo com as necessidades do seu aplicativo.