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

Фотография

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


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

#1 Murinov_Dmitry

Murinov_Dmitry

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

  • Members
  • Pip
  • 13 сообщений
  • ФИО: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
  • 894 сообщений
  • ФИО:Виктор
  • Город:Минск


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

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

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

 

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


  • 0

#3 Murinov_Dmitry

Murinov_Dmitry

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

  • Members
  • Pip
  • 13 сообщений
  • ФИО: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
  • 894 сообщений
  • ФИО:Виктор
  • Город:Минск


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

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


  • 0

#5 barancev

barancev

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

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


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

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

 

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


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

#6 Murinov_Dmitry

Murinov_Dmitry

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

  • Members
  • Pip
  • 13 сообщений
  • ФИО: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
  • 53 сообщений


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

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

 

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

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


  • 0

#8 barancev

barancev

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

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


Отправлено 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
  • 13 сообщений
  • ФИО:Murinov Dmitry


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

Спасибо! :-)


  • 0

#10 TatyanaV

TatyanaV

    Опытный участник

  • Members
  • PipPipPipPip
  • 388 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 31 марта 2017 - 10:56

У меня решилось возвратом обратно к стабильно работающей версии 3.0.1... :(

"Просто переписать код" - не всегда возможно. В т.ч. потому что у меня в until'ах не самописные функции, а ExpectedConditions, которые также перестали работать (java.lang.NoSuchMethodError: org.openqa.selenium.support.ui.WebDriverWait.until(Ljava/util/function/Function;)Ljava/lang/Object;).

Переписывать ExpectedConditions? Нет, спасибо.

 

Обычно, если я обновляю что-то до более свежей версии, я ожидаю, что, как минимум, не сломается то, что уже есть...


  • 0

#11 Spock

Spock

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 772 сообщений
  • ФИО:Роман

Отправлено 31 марта 2017 - 14:54

 

 

Обычно, если я обновляю что-то до более свежей версии, я ожидаю, что, как минимум, не сломается то, что уже есть...

так никто и не ломал. уже видимо давно объявили что меняют их, и поменяли в конце концов

 

конечно многие были удивлены

 

но разработка продукта ведь идёт, новые функции пишутся вместо старых, и старые постепенно убирают

 

вот документация по ExpectedConditions

https://seleniumhq.g...Conditions.html

 

всё работает на свежей версии


  • 0

#12 TatyanaV

TatyanaV

    Опытный участник

  • Members
  • PipPipPipPip
  • 388 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 03 апреля 2017 - 06:52

У меня until(ExpectedConditions) выдает java.lang.NoSuchMethodError: org.openqa.selenium.support.ui.WebDriverWait.until(Ljava/util/function/Function;)Ljava/lang/Object;


  • 0

#13 Spock

Spock

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 772 сообщений
  • ФИО:Роман

Отправлено 03 апреля 2017 - 08:35

    protected WebElement waitForElementVisible(WebElement element) throws Exception {

        return getWebDriverWait().until(ExpectedConditions.visibilityOf(element));
    }


    private Wait<WebDriver> getWebDriverWait() throws Exception {

        return (Wait<WebDriver>) new FluentWait<>(getDriver())
                .withTimeout(15, SECONDS)
                .pollingEvery(250, MILLISECONDS)
                .ignoring(NoSuchElementException.class)
                .ignoring(StaleElementReferenceException.class);

    }

пример кода для ожидания видимости элемента


  • 0

#14 TatyanaV

TatyanaV

    Опытный участник

  • Members
  • PipPipPipPip
  • 388 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 03 апреля 2017 - 11:22

Скопировала 1 в 1.

Подключила 3.3.1 + guava 21.

 

java.lang.NoSuchMethodError: org.openqa.selenium.support.ui.Wait.until(Ljava/util/function/Function;)Ljava/lang/Object;
 
У меня это начинает работать (без каких либо доп.изменений в коде), только при подключении selenium-support-3.0.1, а это все же не Selenium 3.3.1 в чистом виде.

  • 0

#15 Spock

Spock

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 772 сообщений
  • ФИО:Роман

Отправлено 03 апреля 2017 - 11:34

 

Скопировала 1 в 1.

Подключила 3.3.1 + guava 21.

 

java.lang.NoSuchMethodError: org.openqa.selenium.support.ui.Wait.until(Ljava/util/function/Function;)Ljava/lang/Object;
 
У меня это начинает работать (без каких либо доп.изменений в коде), только при подключении selenium-support-3.0.1, а это все же не Selenium 3.3.1 в чистом виде.

в свойствах проекта проверьте версию Джавы, должна быть восьмая (ну и установлена она конечно тоже должна быть на машину)

 

ну и класс на всякий случай привожу, из самого селениума

 

org/openqa/selenium/support/ui/Wait.class

package org.openqa.selenium.support.ui;

import java.util.function.Function;

public interface Wait<F> {
    <T> T until(Function<? super F, T> var1);
}

  • 0

#16 TatyanaV

TatyanaV

    Опытный участник

  • Members
  • PipPipPipPip
  • 388 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 03 апреля 2017 - 12:21

Версия, разумеется, 1.8. И на компьютере она установлена.

1.8 я начала использовать ещё до 3.3.1.


  • 0

#17 Spock

Spock

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 772 сообщений
  • ФИО:Роман

Отправлено 03 апреля 2017 - 12:37

 

Версия, разумеется, 1.8. И на компьютере она установлена.

1.8 я начала использовать ещё до 3.3.1.

версия языка Джава и версия девелопмент кита - это разные вещи

 

1.8 - это версия девелопмент кита

8 - версия Явы

 

надо именно проверить 7я или 8я ява выставлена в настройках проекта. Так как новые конструкции языка Ява 8 не поддерживаются в старой 7й версии


  • 0

#18 TatyanaV

TatyanaV

    Опытный участник

  • Members
  • PipPipPipPip
  • 388 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 03 апреля 2017 - 13:55

Я использовала джава 8 ещё до перевода проекта на Selenium 3.3.1. Вряд ли это было бы возможно без выбора соответствующей версии Project SDK (1.8) и Project language level (8).


  • 0

#19 Spock

Spock

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 772 сообщений
  • ФИО:Роман

Отправлено 03 апреля 2017 - 14:16

а так в ПОМ-файле пробовали? вручную подлкючать и эксклюд делать?

http://stackoverflow...546102#42546102


  • 0

#20 TatyanaV

TatyanaV

    Опытный участник

  • Members
  • PipPipPipPip
  • 388 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 03 апреля 2017 - 15:20

Maven не использую. Во-первых, когда-то давно пробовала - не сложилось. Уж слишком много не нужного скачивал, слишком многое приходилось догружать вручную с mvnrepository. Правда давно это было, может уже и нет таких проблем.

А во-вторых, из-за особенностей доступа.

Поэтому - подключаю вручную.

 

У меня это начинает работать (без каких либо доп.изменений в коде), только при подключении selenium-support-3.0.1, а это все же не Selenium 3.3.1 в чистом виде.

Кстати, по ссылке сказано, что FluentWait, который у Вас в примере - deprecated.


  • 0


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

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