Selenium Webdriver 3.0.1: Selenium показывает ошибку для класса FluentWait [Включен ответ на Selenium Java Client v3.11.0]

Я работаю с Selenium Standalone Server 3.0.1, Я пытаюсь добавить Explicit Wait в мой код, чтобы обнаружить элемент через xpath, когда элемент становится видимым. Чтобы получить помощь по Java, я искал исходный код для Selenium Standalone Server 3.0.1 но не смог его найти. Я нашел исходный код в selenium-java-2.53.1 релиз. Я скачал его и нашел selenium-java-2.53.1-srcs и добавил в мой Eclipse IDE, С помощью FluentWaitЯ просто скопировал вставил код в мой Eclipse IDE и изменил имена переменных.

Пример кода в документации выглядит так:

   // 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"));
      }
    });

Но когда я реализую этот код, просто скопируйте его:

       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']"));
         }
       });

Я получаю сообщение об ошибке FluentWait Класс как The type FluentWait is not generic; it cannot be parameterized with arguments <WebDriver>

Вот список моих импортов:

    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;

Кто-нибудь может мне помочь, пожалуйста?


Обновить

Добавлен ответ относительно модифицированного конструктора FluentWait в Selenium v3.11.0

6 ответов

Решение

Вы должны указать ожидаемое условие в ожидании ниже, это модифицированный код, который может решить вашу проблему.

Код:

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"));
            }
        }
    }
}

С выходом Selenium v3.11.0 конструктор FluentWait изменился. Теперь тип аргумента для withTimeout и pollingEvery равен Duration. Вот модифицированная реализация:

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"));
            }
        });

    }

}

Я также столкнулся с той же ошибкой, позже я заметил, что использовал имя класса как fluentwait, после изменения имени класса он работал нормально.

Самое простое решение - использовать реализацию другого метода:

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

Форма withTimeout(Duration timeOut)все еще используется и не является устаревшим

Я получил ту же ошибку, так как я назвал класс «FluentWait», который я создал в eclipse для реализации плавного ожидания. Попробуйте переименовать класс в другое имя.

Я также столкнулся с той же ошибкой, что но я заметил глупую ошибку, что мой основной класс также назывался FuentWait и не был универсальным. Я изменил его имя, и ошибка исчезла.

Другие вопросы по тегам