Показаны сообщения с ярлыком java. Показать все сообщения
Показаны сообщения с ярлыком java. Показать все сообщения

воскресенье, 7 июля 2019 г.

Getting started with Selenide

Today we are talking about how to create a simple application based on selenide framework.

Show me the code!©

First of all, the selenide framework is a wrapper of selenium framework with a more convenient API. Very often it is used to test UI. However, there is another way of using selenide. Recently, I have faced that our partner did not provide any API except UI panel. It was very sad news for me because I have to scope with that strict.

Within bounds of this task, I had to make a process of getting some reports automatic. The first thing which came to my mind is using selenium or something like that. Unfortunately, selenium framework has quite rigid and cumbersome API and I had a look at selenide. Otherwise, work with it seems to be more enjoyable. It has fluent API and simple and clear work mechanics.

The first step is adding selenide to our dependency manager.

Next step is to implement some business logic. In this example, we create a program, which would enter LinkedIn.com and accept all friend requests. As you can see, it was pretty trivial and not rocket science.

The code below does what we want to do.

First of all, we need to login to the site. Method login does it.

Then we need to go to a page "My network" and find all requests there and accept them. According to name, the method acceptRequests does what we expect:

In addition, we have to create a web driver. A web driver provides some API for working with a web browser. Almost every popular browser has own web driver implementation. However, we use a remote web driver. I will explain why we do it later.

How it works?

For sure, we do not run our app outside of a docker container. In order to do it, we need a docker image. I have chosen the official selenium docker image, you can choose what you wish. This docker image contains a chrome browser and a web driver for working with this browser.

I feel I have to give more details about how it works. Have a look at the picture below.

This diagram shows how we work with a chrome browser. There are several elements of an interaction chain. On the client-side (our program) we use remote driver API. Apparently, a remote driver connects to a chrome driver. A chrome driver is provided by browser maintainers so it knows exactly how to deal with a chrome browser.

You can ask me: "Why it's so difficult?". I agree with you. On the face of it, this architecture is quite overwhelmed, but there are several points of it. We use a remote browser because it lets us connect to a browser running on a docker container. Moreover, this approach has some pros. For instance, we want to use a browser which does not have a version for our target platform. (A target platform is Linux or Mac OS, but we want to use Microsoft Edge Browser located on a remote host)

Run app and enjoy

The last step is to run our application and see a result of its work. In order to do it, we should to run the docker image:

I hope this topic was useful to you 😉. Here is code hosted on Github.

пятница, 10 августа 2018 г.

Заставляем дружить CDATA и JAXB

Всем добрый день, сегодня будем говорить о JAXB. Данная технология преобразования объектов в xml файл в java существует достаточно давно и не представляет особой сложности, но как и везде, существует ряд нюансов. Они появляются когда вы хотите сделать, что «нестандартное». В моем случае, требовалось заключить некоторые поля в блок CDATA, а содержимое оставить без изменений.

воскресенье, 29 апреля 2018 г.

Кидаем исключения типа Object

Всем известно, что кидать исключения можно только, если объект наследуется от класса java.lang.Throwable. Для этого предназначена инструкция байткода ATHROW. Мне стало интересно, осуществляется ли проверка типа после компиляции.
Напишем небольшой метод, генерирующий нужный класс, с помощью библиотеки bcel.

суббота, 28 апреля 2018 г.

Видео с семинара по Spring

Обзор базовых компонентов фреймворка Spring:

  • Spring Boot
  • Spring Data JPA
  • Spring MVC в связке с Thymeleaf
  • Spring Security
на примере создания вебсайта

пятница, 22 декабря 2017 г.

CPU оптимизации

Сегодня, в этой небольшой статье, я хотел бы поделиться своими знаниями об оптимизациях центрального процессора. А именно:

  1. branch prediction
  2. cache levels
  3. false sharing
  4. prefetching
  5. loop unrolling

Начнем в первой. В детали вдаваться не буду, а начну сразу с примера. Допустим у нас есть следующий метод:

Выглядит вполне симпатично и на первый взгляд не представляет никаких угроз, но это только на первый взгляд. Если мы померим время выполнения данного метода для произвольного массива и для него же, но только отсортированного, результат будет сильно отличаться.

суббота, 21 октября 2017 г.

О строителях

Сегодня речь пойдет о шаблоне проектирования Builder, или же по русски, строитель.
Начнем с определения и выясним для чего он нужен.

Строитель относится к порождающим шаблонам, а значит, с его помощью создаются объекты. Он позволяет конструировать объект по частям. Приведу пример, как выглядит типичный Builder.
Допустим у нас есть класс Person

суббота, 15 июля 2017 г.

Генерирование классов во время выполнения

dynamic

Иногда требуется создать класс с определенным поведением во время работы программы. К сожалению, Java не обладает динамизмом, присущем таким языками как Python, Javascript, Groovy. Но все же, возможность такая существует, и есть несколько способов это сделать. Например, сгенерировать напрямую байткод. Но такой способ, довольно сложен. Мы же, в данной статье, напишем исходный код и затем скомпилируем его.

вторник, 21 марта 2017 г.

Задача о корректности расстановки скобок

Хочется рассказать о такой задаче, как определение корректности расстановки скобок. Она так же известна, как balanced parenthesis problem. Суть ее в следующем: дана строка, содержащая открывающиеся и закрывающиеся скобки, и какие то другие символы. Нужно узнать правильно ли расставлены скобки. Т.е. для каждой открывающейся скобки должна быть закрывающаяся. Например, строки вида (()) или (()()) содержат корректную расстановку, а (()() и )()( уже нет.

воскресенье, 20 марта 2016 г.

JVM параметры для тонкой настройки сборщика мусора

Совсем недавно столкнулся с необходимостью уменьшения паузы "stop world" во время сборки мусора. Во время копания в данном вопросе, открыл для себя множество интересных параметров jvm. Чтобы знания не потерялись, решил зафиксировать их в табличку.

пятница, 26 февраля 2016 г.

Rest сервис на Netty

netty framework logo
Недавно познакомился с фреймворком Netty. В традиционной модели на каждое соединение создается один поток, который его обрабатывает. Это приводит к росту нагрузки на CPU и объема потребляемой памяти. Netty использует другой подход, позволяющий обрабатывать одновременно количество соединений большее, чем количество запущенных потоков. Реализован он с использованием библиотеки java.nio. В данной статье, я опишу как Netty работает и расскажу как реализовать с его помощью простой REST сервис.

среда, 10 февраля 2016 г.

Хроника будней java EE разработчика

Однажды при деплои на тестовый стенд обнаружилась такая ошибка NoSuchMethodException. Просмотр логов дал следующую информацию:


Довольно странное исключение, если учесть, что локально, все работало прекрасно. Наиболее вероятной причиной возникновения данной ошибки - разные версии библиотек. Судя по всему, в проекте оказалось несколько версий одного и того же класса. Как это решается?

понедельник, 25 января 2016 г.

Collect своими руками

После выхода java 8 появилась возможность писать в pipeline стиле. Т.е. создавать последовательность операций которые будут обрабатывать элементы из некоторого источника, будь то коллекция, бесконечная и конечная генерирующая функция, строки из файла и пр. Это тема достаточно обширная и она не будет освещена в данном топике. Расскажу про collector'ы. Это такие объекты с помощью которых, можно привести результат обработки элементов к определенному виду. Существует несколько встроенных, в классе java.util.stream.Collectors. Например, там есть toList, он создает список из элементов потока. Есть и более сложные, например, groupingBy, группирующий элементы по определенному критерию. Мы же напишем свой, который будет группировать строки по начальным буквам.

среда, 9 декабря 2015 г.

Кэширование в hibernate

На днях столкнулся с задачей кэширования запросов к БД. Приложение использовало, как это не странно, hibernate. В этой статье я расскажу, о том какие бывают кэши в hibernate, каким образом их использовать и как настраивать.

вторник, 8 декабря 2015 г.

Кое-что о ссылках в java

Сегодня поговорим о том, какие бывают ссылки в языке java.
Их всего четыре вида: Strong, Weak, Phantom и Soft.
Чтобы воспользоваться ими, за исключением первой, нужно использовать соответствующие классы из пакета java.lang.refs
Чем же они различаются и какими суперспособностями обладает каждая из них? Различия в основном связаны с поведением сборщика мусора, в тот момент когда он их обрабатывает.

суббота, 21 ноября 2015 г.

Порядок создание объектов в Java

Никогда не задумывались, как происходит инициализация объекта класса, который в свою очередь наследуется от другого класса?
Порядок довольно прост. Допустим у нас есть класс Parent и класс Child. Child является потомком Parent.
В обоих классах есть и статические и простые блоки инициализации, так присутствуют и поля.
При попытке создать объект класса Child, происходит следующее:

  1. В порядке объявления, будут проинициализированы статические блоки и статические переменные в родительском классе.
  2. То же самое произойдет в классе потомке
  3. Инициализация в порядке объявления не статических переменных и не статических блоков инициализации в классе Parent
  4. Вызов конструктора Parent
  5. Инициализация нестатических полей и блоков инициализации в классе Child в порядке объявления
  6. Вызов конструктора Child

воскресенье, 4 октября 2015 г.

Коротко о PESC

Данный прием используется для обеспечения гибкости при проектировании api с использовании generic'ов. Для дальнейшего понимания, стоит напомнить, что такое wildcard в java.
Wildcard - это ограничение для типов, которые мы определяем с помощью generic'ов. Оно может быть как сверху, так и снизу.
Ограничение снизу, определяется следующим образом Ему удовлетворяют все классы, у которых потомком является класс T.
Обозначает ограничение сверху, под него подпадают все классы наследованые от класса T.
Итак, вернемся теперь к PECS. Он гласит: producer - extends, consumer - super.
Если метод является producer, то используем ограничение сверху, если consumer, то снизу. Осталось определить, когда метод является consumer, а когда producer.
Лучше показать на примерах.

пятница, 10 июля 2015 г.

Идеальный singleton

Не буду рассказывать, что такое singleton и для чего он нужен. Расскажу про то, как его писать. Всегда склонялся к варианту double check, но после статьи про текущую модель памяти в java, мир для меня перестал быть прежним. Оказывается, volatile довольно затратная операция и немного лучше synchronized. Наилучшим же вариантом с ленивой инициализацией будет следующий код:
   public class Singleton{
      private Singleton(){};
      
      public Singleton getInstance(){
          return SingletonCreator.instance;
      }
      private static class SingletonCreator{
          public static final Singleton instance = new Singleton();
      }      
   }

воскресенье, 28 июня 2015 г.

Контракты для equals

Как известно, метод equals() определен в классе Object. Его реализация в данном классе, это простое сравнение ссылок, и если ссылки разные, то метод возвращает false. Если Вы хотите переопределить данный метод, не стоит забывать о контракте с методом hashCode(). Он гласит - если equals() возвращает true, то значение hashCode() для этих объектов будет одинаковое, но выполнение обратного необязательно.
Есть еще один контракт, о котором стоит помнить при написании своего собственного метода equals(). Все ниже перечисленные переменные не null.
  • Он должен быть рефлексивный, т.е. для любых значений x, x.equals(x) должен возвращать всегда true
  • Метод должен быть симметричен: для любых значений x и y, если x.equals(y) == true должно выполняться y.equals(x) == true
  • Должно выполняться условие транзитивности: если x.equals(y) == true и y.equals(z) == true, то x.equals(z) == true
  • Консистентность - это значит, что метод будет возвращать одно и тоже значение, независимо от того, сколько раз его вызвали, до тех пор, пока состояние объектов, для которых он вызывается, не изменено.
  • И последнее, для всех null значений метод должен возвращать false - x.equals(null) = false

Ссылка на оригинал
Пейте кофе, пишите на java ;)