Как обеспечить совместимость adf-richclient-automatic-11.jar с последней версией selenium-java 3.x - PullRequest
0 голосов
/ 27 августа 2018

Я разрабатываю тесты Selenium для приложения Oracle ADF.

Я использую для этого:

  1. Установка JDeveloper fmw_12.2.1.3.0_bpmqs
  2. Очень полезная библиотека SelniumTools

И я столкнулся с проблемой:

SelniumTools на основе adf-richclient-Automation-11.jar , который распространяется с JDeveloper (использовать можно найти в * Oracle_Home \ oracle_common \ modules \ oracle.adf. view * folder) и описывается в документации как Oracle Customized Selenium.

И все отлично работает с библиотекой selenium-java до 2.53.1 версии.

Но когда я обновляю библиотеку selenium-java до 3.3.1 версии, мой тестовый проект падает с исключением:

org.openqa.selenium.WebDriverException: java.lang.NoSuchMethodError: org.openqa.selenium.support.ui.**WebDriverWait.until(Lcom/google/common/base/Function;)Ljava/lang/Object;** Build info: version: 'unknown', revision: '5234b32', time: '2017-03-10 09:00:17 -0800' System info: host: 'EE-LATITUDE-749', ip: '10.10.207.64', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '1.8.0_172' Driver info: driver.version: unknown
  com.redheap.selenium.junit.PageProvider.createPage(PageProvider.java:49)
  com.redheap.selenium.junit.PageProvider.goHome(PageProvider.java:36)
  ru.russvet.selenium.tests.P6_ProcessPageTest.(P6_ProcessPageTest.java:38)
  java.lang.reflect.Constructor.newInstance(Constructor.java:423)
Caused by: java.lang.NoSuchMethodError: org.openqa.selenium.support.ui.WebDriverWait.until(Lcom/google/common/base/Function;)Ljava/lang/Object;
  oracle.adf.view.rich.automation.selenium.RichWebDrivers.waitForServer(RichWebDrivers.java:112)
  oracle.adf.view.rich.automation.selenium.RichWebDrivers.waitForRichPageToLoad(RichWebDrivers.java:175)
  oracle.adf.view.rich.automation.selenium.RichWebDrivers.waitForRichPageToLoad(RichWebDrivers.java:158)
  com.redheap.selenium.page.Page.(Page.java:53)
  com.redheap.selenium.page.Page.(Page.java:45)
  ru.russvet.selenium.pages.BPMWorkspaceLoginPage.(BPMWorkspaceLoginPage.java:19)
  com.redheap.selenium.junit.PageProvider.createPage(PageProvider.java:47)

Расследования следуют причине:

1) в библиотеке селена-java начиная с 3.3.1 интерфейс для до функция была изменена и принимает Функция, Предикат или Поставщик классы из библиотека Java 8 вместо библиотека Guava https://github.com/SeleniumHQ/selenium/commit/b2aa9fd534f7afbcba319231bb4bce85f825ef09:

-import com.google.common.base.Function;   
-import com.google.common.base.Predicate;   
-import com.google.common.base.Supplier;  
+import java.util.function.Function;  
+import java.util.function.Predicate;  
+import java.util.function.Supplier; 

2) что, вероятно, можно обойти с недавним выпуском гуавы (версия 21+), где версии Google и Function, и Predicate расширяют эквиваленты Java 8

Итак, похоже, что adf-richclient-Automation-11.jar построен с библиотекой selenium-java 2.x , и это вызывает исключение во время выполнения тесты.

Мы подняли его через службу поддержки Oracle, но от них пока нет информации о новой версии этой библиотеки.

Итак, мои вопросы: 1) Каков возможный способ перестроить adf-richclient-Automation-11.jar , чтобы сделать его совместимым с последней версией selenium-java 3.x?

2) Кто-нибудь нашел более новую версию adf-richclient-Automation-11.jar в каком-то конкретном дистрибутиве JDeveloper?

Ответы [ 2 ]

0 голосов
/ 22 мая 2019

Ну, ответь сам. Единственный способ сделать это сейчас - декомпилировать adf-richclient-automation-11.jar, очистить и упаковать его в WebDriver 3.x.

Соответствующий проект Eclipse находится здесь https://github.com/EgorBEremeev/adf-richclient-automation-selenium-3-rebuild

Этот проект не содержит тестовые классы как оригинальную библиотеку. Я не запускал никаких тестов из исходной библиотеки, потому что понятия не имею, для чего нужна тестовая среда. Итак, я протестировал переупакованную библиотеку прямо в моем основном проекте.

Тем не менее, полные шаги по получению исходных кодов, очистке, исправлению ошибок и переупаковке библиотеки вы можете найти в readme.md в репозитории git, а также ниже:

Полные шаги по ручному восстановлению adf-richclient-Automation-11.jar:

Окружающая среда

  1. Установить Eclipse
  2. Установить декомпилятор с подключением
    Help -> Marketplace -> Enhanced Class Decompiler
    Windows -> Preferences -> Java -> Decompiler -> Default Class Decompiler: CFR -> Applay and Close   
  1. Установка пользовательских библиотек
    Windows -> Preferences -> Java -> Build Path -> User Libraries
         New->
            Name -> selenium-java-3.3.1
            Add External JARs... ->
                path\to\selenium-java-3.3.1\
                    client-combined-3.3.1-nodeps.jar
                    lib\*.jar
         ->Finish

         New->
            Name -> adf-richclient-automation-11.jar
            Add External JARs... ->
                path\to\Oracle_Home\oracle_common\modules\oracle.adf.view\
                    adf-richclient-automation-11.jar
         ->Finish
     -> Applay and Close

Steps

  1. Создание Java-проекта
Eclipse -> New -> Java Project
    Name -> project_name
    JDK -> 1.8
    Build Path -> Libraries -> Add Library -> User Library -> Next
        User Libraries ...
            selenium-java-3.3.1
            adf-richclient-automation-11.jar
  1. Декомпилировать adf-richclient-Automation-11.jar
Project Explorer -> adf-richclient-automation-11.jar -> Context Menu -> Export Sources
    path\to\project_name\src\
        adf-richclient-automation-11-src.zip
    Project Explorer -> Refresh
        src -> adf-richclient-automation-11-src.zip
  1. Извлечение декомпилированных источников в путь \ to \ имя_проекта \ src \
  2. Проверьте источник
Project Explorer -> Refresh
        src -> adf-richclient-automation-11-src.zip
                * oracle.adf.view.rich.automation.selenium
                * oracle.adf.view.rich.automation.test
                   oracle.adf.view.rich.automation.test.browserfactory
                * oracle.adf.view.rich.automation.test.component
                * oracle.adf.view.rich.automation.test.selenium
                   org.openqa.selenium
                   org.openqa.selenium.firefox

5.1 Удалить классы, используемые для и с Selenium RC:

        path/to/project_name/src/
        oracle/adf/view/rich/automation/selenium/RichSelenium.java -> Delete

5.2 Удаление пакетов oracle.adf.view.rich.automation.test. * -> Удалить

            oracle.adf.view.rich.automation.test
            oracle.adf.view.rich.automation.test.browserfactory
            oracle.adf.view.rich.automation.test.component
            oracle.adf.view.rich.automation.test.selenium
  1. Исправить ошибки:
    • путь / к / имя_проекту / SRC / оракул / ADF / просмотр / богатые / автоматизация / селен / RichWebDrivers.java
      • [] 241 Несоответствие типов: невозможно преобразовать тип элемента Object в строку ->
    fix 239 -> List<String> logs = (List) jsExecutor.executeScript(_GET_AND_CLEAR_LOG_MESSAGES_JS,
     = 
     List<String> logs = (List) jsExecutor.executeScript(_GET_AND_CLEAR_LOG_MESSAGES_JS,
             new Object[]{logLevel.toString().toUpperCase()});
     for (String s : logs) {
         sbf.append(s).append(_NEW_LINE);
     }
    
    • [] 321 Несоответствие типов: невозможно преобразовать тип элемента Object в строку ->
    fix 320 -> Set<String> handles = webDriver.getWindowHandles();
     =
     public String apply(WebDriver webDriver) {
         Set<String> handles = webDriver.getWindowHandles();
         for (String handle : handles) {
             if (openWindowHandles.contains(handle))
                 continue;
             return handle;
         }
         return null;
     }
    
  2. Сборка и экспорт в банку
 remove -> path\to\project_name\src\adf-richclient-automation-11-src.zip
 Project Explorer -> Export -> Java -> JAR file -> Next
     select src folder only
     check Export generated classes and resources
     uncheck .classpath, .project
         -> Finish -> Ok in warning dialog  
  1. Необязательное исправление ошибки в классах из пакетов oracle.adf.view.rich.automation.test. *.
    • путь / к / project_name / SRC / оракул / ADF / вид / богатый / автоматизация / тест / селен / WebDriverManager.java
      • [] 87 Несоответствие типов: невозможно преобразовать тип элемента Object в строку ->
     fix 85 Set<String> windowHandles = webDriver.getWindowHandles();
     =
     try {
         Set<String> windowHandles = webDriver.getWindowHandles();
         _LOG.fine("try to close all windows... ");
         for (String handle : windowHandles) {   
    
    • путь / к / project_name / SRC / оракул / ADF / вид / богатый / автоматизация / тест / селен / RichWebDriverTest.java
      • [] 953 Синтаксическая ошибка на токене «наконец», удалите этот токен ->
    fix -> delete  956,952,949, 941
     =
     protected void refresh() {
         _LOG.fine("Executing refresh()");
         this.getWebDriver().navigate().refresh();
         try {
             Alert alert = this.getWebDriver().switchTo().alert();
             if (alert != null) {
                 alert.accept();
             };
         }
         catch (WebDriverException alert) {}
         finally {
             this.waitForPage();
         }
     }
    
    • [] 1026 Недоступный блок перехвата для исключения. Он уже обработан блоком catch для Throwable ->
     fix -> replace whole method by variant of Jad Decompiler-> 
         -> Windows -> Preferences -> Java -> Decompiler -> Default Class Decompiler: Jad -> Applay and Close
         -> fix 1020, 1028 Duplicate local variable cachingEnabled ->
             fix-> delete
                 -> 1019 String msg;
                 -> 1018 boolean cachingEnabled;
     =
     protected void onShutdownBrowser() {
         _LOG.finest("Shutting down browser");
         try {
             _logSeleniumBrowserLogAndResetLoggerLevel();
         } catch (Exception e) {
             boolean cachingEnabled;
             String msg;
                 _LOG.warning("The page did not generate any logs.");
         } finally {
             boolean cachingEnabled = isBrowserCachingEnabled();
             try {
                 if (cachingEnabled) {
                     getWebDriverManager().releaseInstance();
                 } else {
                     getWebDriverManager().destroyInstance();
                 }
             } catch (Throwable t) {
                 String msg = cachingEnabled
                         ? "Failed to release the browser. Error message: %s"
                         : "Failed to shutdown the browser. Error message: %s";
                 _LOG.severe(String.format(msg, new Object[]{t.getMessage()}));
             }
         }
     }
    
    • [] 1047 Несоответствие типов: невозможно преобразовать тип элемента Object в WebElement ->
     fix 1046 List<WebElement> allOptions = element.findElements(By.xpath((String) builder.toString()));
     =
     List<WebElement> allOptions = element.findElements(By.xpath((String) builder.toString()));
     for (WebElement option : allOptions) {
    
    • путь / к / project_name / SRC / оракул / ADF / вид / богатый / автоматизация / тест / UrlFactories.java
      • [] 34 Несоответствие типов: невозможно преобразовать из UrlFactory в UrlFactories.UrlFactoryImpl ->
     fix Add cast to 'UrlFactoryImpl'
     =
     factory = (UrlFactoryImpl) urlFactoryIterator.next();
    
    • [] 52 Несоответствие типов: невозможно преобразовать UrlFactory в UrlFactories.UrlFactoryImpl
     fix Add cast to 'UrlFactoryImpl'
     =
     UrlFactoryImpl urlFactoryImpl = (UrlFactoryImpl) (_INSTANCE = factory != null ? factory : new UrlFactoryImpl());
    
0 голосов
/ 29 августа 2018

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

Проблема здесь заключается в совместимости API, и если библиотека автоматизации ADF не будет переупакована в WebDriver 3.x и перераспределена Oracle OTN, у вас не будет выбора, кроме как придерживаться использования библиотек Selenium 2.x. WebDriver 3.x предназначен для Java 8, что стало бы еще одной причиной, по которой Oracle захотела бы вскоре перейти на 3.x. Вы высказали свои опасения через форумы OTN или поддержку Oracle?

...