The type FluentWait is not generic; it cannot be parameterized with arguments <WebDriver> error for FluentWait Class through Selenium and Java
Asked Answered
H

6

1

I am working with Selenium Standalone Server 3.0.1. I am trying to add an Explicit Wait to my code to detect an element through xpath when the element becomes visible. In order to get some Java help I looked out for the source code for Selenium Standalone Server 3.0.1 but was unable to find it. I found the source code in selenium-java-2.53.1 release. I downloaded it and found selenium-java-2.53.1-srcs and added to my Eclipse IDE. From the help of FluentWait, I simply copy pasted the code in my Eclipse IDE and changed the variable names.

The sample code in documentation is like:

   // Waiting 30 seconds for an element to be present on the page, checking
   // for its presence once every 5 seconds.
    Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
       .withTimeout(30, SECONDS)
       .pollingEvery(5, SECONDS)
       .ignoring(NoSuchElementException.class);

    WebElement foo = wait.until(new Function<WebDriver, WebElement>() {
     public WebElement apply(WebDriver driver) {
       return driver.findElement(By.id("foo"));
      }
    });

But when I implement this code, simply copy pasting it:

       Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
           .withTimeout(30, TimeUnit.SECONDS)
           .pollingEvery(5, TimeUnit.SECONDS)
           .ignoring(NoSuchElementException.class);

       WebElement element = wait.until(new Function<WebDriver, WebElement>()        {
         public WebElement apply(WebDriver driver) {
           return driver.findElement(By.xpath("//p[text()='WebDriver']"));
         }
       });

I am getting an error on FluentWait Class as The type FluentWait is not generic; it cannot be parameterized with arguments <WebDriver>

Here is the list of my imports:

    import java.util.concurrent.TimeUnit;
    import org.apache.log4j.Logger;
    import org.apache.log4j.PropertyConfigurator;
    import org.openqa.selenium.By;
    import org.openqa.selenium.NoSuchElementException;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.chrome.ChromeDriver;
    import org.openqa.selenium.support.ui.Wait;
    import com.google.common.base.Function;

Can anyone help me out please?


Update

Added an answer with respect to the modified constructor of FluentWait in Selenium v3.11.0

Higginbotham answered 16/2, 2017 at 13:42 Comment(2)
Did you try the example out of the docs? seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/…Malachi
@Malachi Thanks. I can see some difference between the documentation provided by selenium-java-2.53.1 src code and the documentation provided in the URL you shared. While in selenium-java-2.53.1 src code the creating an object is <<-- Wait<WebDriver> wait = new FluentWait<WebDriver>(driver) -->> but the link documentation says it as <<-- Wait wait = new FluentWait(driver) -->>Higginbotham
F
1

You need to specify expected condition inside the wait below is the modified code that could solve your problem.

Code:

import java.util.concurrent.TimeUnit;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.FluentWait;
import org.openqa.selenium.support.ui.Wait;

public class DummyClass
{
    WebDriver driver;
    @Test
    public void test()
    {
        Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
            .withTimeout(30, TimeUnit.SECONDS)
            .pollingEvery(5, TimeUnit.SECONDS)
            .ignoring(NoSuchElementException.class);

        until(new Function<WebElement, Boolean>() 
        {
            public Boolean apply(WebElement element)
            {
                return element.getText().endsWith("04");
            }

            private void until(Function<WebElement, Boolean> function)
            {
                driver.findElement(By.linkText("Sample Post2"));
            }
        }
    }
}
Fiore answered 16/2, 2017 at 16:33 Comment(6)
I have edited the code or check below code if it could help? FluentWait<WebDriver> wait = new FluentWait<WebDriver>(driver) .withTimeout(100, TimeUnit.SECONDS) .pollingEvery(50, TimeUnit.MILLISECONDS); // start waiting for given element wait.until(new ElementWaitCondition(browser, query));Fiore
Thanks, if I provide, << FluentWait<WebDriver> wait = new FluentWait<WebDriver>(driver)>> Eclipse IDE is still showing me error as The type FluentWait is not generic; it cannot be parameterized with arguments <WebDriver>Higginbotham
I am able to implement without any error, i am using Selenium-java 3.0.1 and server 3.0.1Fiore
Thanks Sir. To update you, as of now I have added the following import import org.openqa.selenium.support.ui.Wait; if I try to import import org.openqa.selenium.support.ui.FluentWait; Eclipse IDE shows me an error as "The import org.openqa.selenium.support.ui.FluentWait conflicts with a type defined in the same file". Any other suggestions please?Higginbotham
I did two changes, First I deleted my class file "FluentWait.class" which I suspect was referring to the interface. Created a new class file "FluentWaitExample" and I have added both the imports import org.openqa.selenium.support.ui.FluentWait; and import org.openqa.selenium.support.ui.Wait; Still I get an error at << new FluentWait<WebDriver>(driver) >> The error says FluentWait cannot be resolved to a typeHigginbotham
Well, just cleaned up the environment & tried to build with the error & the error is gone. It have executed successfully. Thank you so much for your time & effort Sir.Higginbotham
H
3

With the availability of Selenium v3.11.0 the constructor of FluentWait have changed. Now the argument type for withTimeout and pollingEvery is Duration. Here is the modified implementation :

import java.time.Duration;

import org.openqa.selenium.By;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.FluentWait;
import org.openqa.selenium.support.ui.Wait;

import com.google.common.base.Function;

public class Fluent_Wait {

    public static void main(String[] args) {


        System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe");
        WebDriver driver = new FirefoxDriver();
            driver.get("https://www.google.com");
            // Waiting 30 seconds for an element to be present on the page, checking
            // for its presence once every 500 milliseconds.
            Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
            .withTimeout(Duration.ofSeconds(30))
            .pollingEvery(Duration.ofMillis(500))
            .ignoring(NoSuchElementException.class);

            WebElement foo = wait.until(new Function<WebDriver, WebElement>() {
            public WebElement apply(WebDriver driver) {
                return driver.findElement(By.name("q"));
            }
        });

    }

}
Higginbotham answered 6/4, 2018 at 10:27 Comment(1)
Thanks DebanjanB, it eliminated message: " Warning:() java: withTimeout(long,java.util.concurrent.TimeUnit) in org.openqa.selenium.support.ui.FluentWait has been deprecated"Zavras
I
2

I was also facing the same error, later I noticed that I was using the class name as fluentwait. After changing the class name it was working fine.

Imalda answered 9/5, 2021 at 15:3 Comment(2)
What did you change the class name to, sorry I am new to this area?Sassanid
@Sassanid Change it to any another name other than 'FluentWait', For Example u can use Fluent_WaitImalda
F
1

You need to specify expected condition inside the wait below is the modified code that could solve your problem.

Code:

import java.util.concurrent.TimeUnit;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.FluentWait;
import org.openqa.selenium.support.ui.Wait;

public class DummyClass
{
    WebDriver driver;
    @Test
    public void test()
    {
        Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
            .withTimeout(30, TimeUnit.SECONDS)
            .pollingEvery(5, TimeUnit.SECONDS)
            .ignoring(NoSuchElementException.class);

        until(new Function<WebElement, Boolean>() 
        {
            public Boolean apply(WebElement element)
            {
                return element.getText().endsWith("04");
            }

            private void until(Function<WebElement, Boolean> function)
            {
                driver.findElement(By.linkText("Sample Post2"));
            }
        }
    }
}
Fiore answered 16/2, 2017 at 16:33 Comment(6)
I have edited the code or check below code if it could help? FluentWait<WebDriver> wait = new FluentWait<WebDriver>(driver) .withTimeout(100, TimeUnit.SECONDS) .pollingEvery(50, TimeUnit.MILLISECONDS); // start waiting for given element wait.until(new ElementWaitCondition(browser, query));Fiore
Thanks, if I provide, << FluentWait<WebDriver> wait = new FluentWait<WebDriver>(driver)>> Eclipse IDE is still showing me error as The type FluentWait is not generic; it cannot be parameterized with arguments <WebDriver>Higginbotham
I am able to implement without any error, i am using Selenium-java 3.0.1 and server 3.0.1Fiore
Thanks Sir. To update you, as of now I have added the following import import org.openqa.selenium.support.ui.Wait; if I try to import import org.openqa.selenium.support.ui.FluentWait; Eclipse IDE shows me an error as "The import org.openqa.selenium.support.ui.FluentWait conflicts with a type defined in the same file". Any other suggestions please?Higginbotham
I did two changes, First I deleted my class file "FluentWait.class" which I suspect was referring to the interface. Created a new class file "FluentWaitExample" and I have added both the imports import org.openqa.selenium.support.ui.FluentWait; and import org.openqa.selenium.support.ui.Wait; Still I get an error at << new FluentWait<WebDriver>(driver) >> The error says FluentWait cannot be resolved to a typeHigginbotham
Well, just cleaned up the environment & tried to build with the error & the error is gone. It have executed successfully. Thank you so much for your time & effort Sir.Higginbotham
A
0

The simplest solution is to use the other method implementation:

withTimeout(Duration.ofSeconds(10))
            .pollingEvery(Duration.ofSeconds(2))

The form withTimeout(Duration timeOut) is still used and non-deprecated one

Argyll answered 24/11, 2018 at 12:28 Comment(0)
T
0

I was also facing same error that The type FluentWait is not generic; it cannot be parameterized with arguments <WebDriver> but i noticed a silly mistake that my main class was also named as FuentWait and it was not generic. I changed its name and error went away.

Toots answered 2/1, 2022 at 16:44 Comment(0)
P
0

I got the same error since I named the class 'FluentWait' that I created in eclipse to implement fluent wait. Try renaming the class to a different name.

Preamble answered 7/1, 2023 at 10:24 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.