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 для реализации плавного ожидания. Попробуйте переименовать класс в другое имя.
Я также столкнулся с той же ошибкой, что