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

Эффективное использование TestNG и JUnit
онлайн, начало 20 апреля
Логи как инструмент тестировщика
онлайн, начало 23 апреля
Тестирование производительности (HP Load Runner)
онлайн, начало 20 апреля
Управление требованиями
онлайн, начало 20 апреля
Фотография

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


Отправлено 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
  • 738 сообщений
  • ФИО:Виктор
  • Город:Минск


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

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


  • 0

#5 barancev

barancev

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

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


Отправлено 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
  • 52 сообщений


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

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

 

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

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


  • 0

#8 barancev

barancev

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

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


Отправлено 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
  • 251 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 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
  • PipPipPipPipPip
  • 819 сообщений
  • ФИО:Роман

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

 

 

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

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

 

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

 

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

 

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

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

 

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


  • 0

#12 TatyanaV

TatyanaV

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

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


Отправлено 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
  • PipPipPipPipPip
  • 819 сообщений
  • ФИО:Роман

Отправлено 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
  • 251 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 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
  • PipPipPipPipPip
  • 819 сообщений
  • ФИО:Роман

Отправлено 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
  • 251 сообщений
  • ФИО:Воробьева Татьяна


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

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

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


  • 0

#17 Spock

Spock

    Специалист

  • Members
  • PipPipPipPipPip
  • 819 сообщений
  • ФИО:Роман

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

 

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

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

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

 

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

8 - версия Явы

 

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


  • 0

#18 TatyanaV

TatyanaV

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

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


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

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


  • 0

#19 Spock

Spock

    Специалист

  • Members
  • PipPipPipPipPip
  • 819 сообщений
  • ФИО:Роман

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

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

http://stackoverflow...546102#42546102


  • 0

#20 TatyanaV

TatyanaV

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

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


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

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

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

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

 

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

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


  • 0


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



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

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

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