Ошибка при написании автотестов: java: несовместимые типы: int нельзя преобразовать в java.time.Duration
Изучаю автотесты Java, selenium, maven, junit.
Проблема: несовместимые типы: int нельзя преобразовать в java.time.Duration (java: incompatible types: int cannot be converted to java.time.Duration)
Код
public PageBase(WebDriver driver) { /* 4. конструктор создан */
this.driver = driver;
wait = new WebDriverWait(driver, 30,0); /* 5. добавим драйвер wait */
}
Так же у меня прописано ожидание появления элемента на странице
driver.manage().timeouts().implicitlyWait(30,0, TimeUnit.SECONDS);
Этот код вынесен в аннотацию @BeforeEach.
и здесь тоже ошибка:
java: no suitable method found for implicitlyWait(int,int,java.util.concurrent.TimeUnit)
method org.openqa.selenium.WebDriver.Timeouts.implicitlyWait(long,java.util.concurrent.TimeUnit) is not applicable (actual and formal argument lists differ in length)
method org.openqa.selenium.WebDriver.Timeouts.implicitlyWait(java.time.Duration) is not applicable (actual and formal argument lists differ in length)
Помогите, пожалуйста, разобраться в чем причина?
Ответы (2 шт):
У класса WebDriverWait есть конструктор (и ещё 2) WebDriverWait(WebDriver driver, java.time.Duration timeout, java.time.Duration sleep), принимает три параметра. Вы передаёте три аргумента, но несоответствующих типов. java видет, что тип аргумента 30 (int) не соответсвует требуемому (Duration) и пытается выполнить преобразование (по своим внутренним правилам), но терпет неудачу - получаете соответствующее сообщение.
У WebDriver.Timeouts есть два перегруженных метода implicitlyWait:
implicitlyWait(long time, java.util.concurrent.TimeUnit unit)implicitlyWait(java.time.Duration duration)
Вы передаёте три параметра в метод, из-за того, что не совпадает количество аргументов и выдаётся сообщение, что нет подходящего метода.
Пример как работать с ожиданиями можно посмотреть в документации на странице Waits.
При выборе метода, например implicitlyWait обратите внимание на то, что первый implicitlyWait(long, TimeUnit) помечен как Deprecated, т.е он не рекомендован к использоваеию. Вместо него в документации советуют использовать implicitlyWait(Duration).
Проблема решена следующими правками:
Код
driver.manage().timeouts().implicitlyWait(30,0, TimeUnit.SECONDS);
изменен на
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(30));
Код
public PageBase(WebDriver driver) { /* 4. конструктор создан */
this.driver = driver;
wait = new WebDriverWait(driver, 30,0); /* 5. добавим драйвер wait */
}
изменен на
public PageBase(WebDriver driver) { /* 4. конструктор создан */
this.driver = driver;
wait = new WebDriverWait(driver, Duration.ofSeconds(30)); /* 5. добавим драйвер wait */
}
После этого открылся браузер, переход на сайт и клик по нужному элементу.
А целом тест провалился - нужно искать причину.