Перейти к содержимому

Тестирование веб-приложений
онлайн, начало 31 марта
Управление требованиями
онлайн, начало 3 апреля
Техники и инструменты поиска и оформления дефектов
онлайн, начало 3 апреля
Программирование на С# для тестировщиков
онлайн, начало 31 марта
Фотография

Selenium 3.3.1 Java, перестал работать предикат. Кто победил? :-)


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 8

#1 Murinov_Dmitry

Murinov_Dmitry

    Новый участник

  • Members
  • Pip
  • 12 сообщений
  • ФИО:Murinov Dmitry


Отправлено 15 Март 2017 - 10:08

В селениуме 2.50 + и 3.0.1 отлично работал такой код:

 

new WebElementWait(someWebElement, 120).until(fixed());

 

Где сам предикат выглядит вот так:

//

public static final Predicate<WebElement> fixed() {
return new Predicate<WebElement>() {
private Point prevLocation = null;
private Dimension prevSize = null;
@Override
public boolean apply(WebElement element) {
if (element.getLocation().equals(prevLocation) && element.getSize().equals(prevSize)) {
return true;
} else {
prevLocation = element.getLocation();
prevSize = element.getSize();
return false;
}
}
};
}

//

 

После миграции на 3.3.1 в этой строке:

new WebElementWait(someWebElement, 120).until(fixed());

Часть fixed() выделяется красным и IntellijIdea ругается на:

until   (java.util.function.Function<? super org.openqa.selenium.WebElement,V> in FluentWait cannot be aplied

to (com.google.common.base.Predicate<org.openqa.selenium.WebElement>)

 

reason: no instance(s) of type variable(s) V exist so that Predicate<WebElement> conforms to Function<? super WebElement, V>

 

Что нужно сделать, чтобы всё заработало? :-)


  • 0

#2 user12

user12

    Специалист

  • Members
  • PipPipPipPipPip
  • 635 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 15 Март 2017 - 10:45

Ты что-то с импортами напутал. Удали их все и сделай заново.

Предикат лежит в java.util.function

 

В общем скорее всего, ты что-то не то импортнул


  • 0

#3 Murinov_Dmitry

Murinov_Dmitry

    Новый участник

  • Members
  • Pip
  • 12 сообщений
  • ФИО:Murinov Dmitry


Отправлено 15 Март 2017 - 12:26

Дело не в импортах, к сожалению.

 

Методом кода-ковыряния и сравнения выяснил, что в Selenium 3.0.1 есть, а в 3.3.1 нет вот этого:

 

public void until(final Predicate<T> isTrue) {
until(new Function<T, Boolean>() {
public Boolean apply(T input) {
return isTrue.apply(input);
}

public String toString() {
return isTrue.toString();
}
});
}


  • 0

#4 user12

user12

    Специалист

  • Members
  • PipPipPipPipPip
  • 635 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 15 Март 2017 - 13:05

м.б., просто я не совсем понимаю, что это за класс WebElementWait


  • 0

#5 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 781 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 15 Март 2017 - 13:43

Кратко: обновите зависимость от Guava до версии 21

 

Подробно: http://selenium2.ru/...icit-waits.html


  • 2

Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium


#6 Murinov_Dmitry

Murinov_Dmitry

    Новый участник

  • Members
  • Pip
  • 12 сообщений
  • ФИО:Murinov Dmitry


Отправлено 15 Март 2017 - 14:58

Виктор, возможно.

 

Вот класс:

import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.Clock;
import org.openqa.selenium.support.ui.FluentWait;
import org.openqa.selenium.support.ui.Sleeper;
import org.openqa.selenium.support.ui.SystemClock;

import java.util.concurrent.TimeUnit;

public class WebElementWait extends FluentWait<WebElement> {

public final static long DEFAULT_SLEEP_TIMEOUT = 500;

public WebElementWait(WebElement element, long timeOutInSeconds) {
this(element, new SystemClock(), Sleeper.SYSTEM_SLEEPER, timeOutInSeconds, DEFAULT_SLEEP_TIMEOUT);
}

public WebElementWait(WebElement element, long timeOutInSeconds, long sleepInMillis) {
this(element, new SystemClock(), Sleeper.SYSTEM_SLEEPER, timeOutInSeconds, sleepInMillis);
}

protected WebElementWait(WebElement element, Clock clock, Sleeper sleeper, long timeOutInSeconds,
long sleepTimeOut) {
super(element, clock, sleeper);
withTimeout(timeOutInSeconds, TimeUnit.SECONDS);
pollingEvery(sleepTimeOut, TimeUnit.MILLISECONDS);
}

}

 

 

Алексей, к сожалению не помогло.

 

Список импортов:

apply plugin: 'java'
compileJava.options.encoding = 'UTF-8'

repositories {
mavenCentral()
}

dependencies{
compile 'org.testng:testng:6.10'
compile 'com.google.guava:guava:21.0'
compile 'org.seleniumhq.selenium:selenium-java:3.3.1'
compile 'org.hamcrest:java-hamcrest:2.0.0.0'
compile 'com.google.code.gson:gson:2.6.2'
}

test {
useTestNG()
}

 

*кстати, до этого импорта guava не было вообще.

**после импорта обновление проекта gradle делал.

 

p.s. экспериментально выяснил, что версия 3.2.0 тоже не работает без рефакторинга. 3.1.0 работает.


  • 0

#7 Prettser

Prettser

    Новый участник

  • Members
  • Pip
  • 52 сообщений


Отправлено 17 Март 2017 - 05:24

Кратко: обновите зависимость от Guava до версии 21

 

Подробно: http://selenium2.ru/...icit-waits.html

21 версия в 3.3.1 не включена разве?


  • 0

#8 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 781 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 17 Март 2017 - 15:28

Оу! Это я не отследил, когда этот метод успели убрать... Вроде бы он был просто deprecated, но сейчас проверил -- точно, убрали.

 

Ну, что ни делается -- всё к лучшему :)

Значит надо просто переписать код на Java 8. Пришло время обновлять ожидания.

import java.util.function.Function;
....

    public static Function<WebElement, Boolean> fixed() {
        return new Function<WebElement, Boolean>() {
            private Point prevLocation = null;
            private Dimension prevSize = null;
            @Override
            public Boolean apply(WebElement element) {
                if (element.getLocation().equals(prevLocation) && element.getSize().equals(prevSize)) {
                    return true;
                } else {
                    prevLocation = element.getLocation();
                    prevSize = element.getSize();
                    return false;
                }
            }
        };
    }

  • 0

Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium


#9 Murinov_Dmitry

Murinov_Dmitry

    Новый участник

  • Members
  • Pip
  • 12 сообщений
  • ФИО:Murinov Dmitry


Отправлено 23 Март 2017 - 09:48

Спасибо! :-)


  • 0


Selenium 2.0: стартовый уровень
онлайн, начало 21 апреля
Программирование на Java для тестировщиков
онлайн, начало 7 апреля
Автоматизация функционального тестирования
онлайн, начало 14 апреля
Selenium WebDriver: полное руководство
онлайн, начало 14 апреля



Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных

Яндекс.Метрика
Реклама на портале