воскресенье, 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.

среда, 12 сентября 2018 г.

Неочевидные оптимизации JIT

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

Есть следующий код:

В методе проиcходит сериализация массива байт. Используется тот факт, что размер char в java - 16 бит, а размер byte (Внезапно 😱) - 8 бит. Но суть не в этом. Интересный момент здесь заключается в том, что метод работает гораздо медленее на массивах нечетной длины.

четверг, 6 сентября 2018 г.

Why should you try android development?

I know, I had to write this article several years ago, but not it could be too late 😀

It is for you if you write java for backend and have never tried to do something. If you are already a mobile developer, I am not sure you will find something useful in the article so you can surely skip it.

I try to describe why you should try to develop apps for Android. Currently, I am a backend java developer so very often will compare mobile development with backend development. The reason for it is an absence of any experience except working in the backend.

Ok, let's go.

среда, 15 августа 2018 г.

Ускоряем сборку проекта с использованием maven и git

Всем привет, хочу предложить небольшой Proof of Concept, который должен ускорить сборку сложного, многомодульного мавен проекта.

Как мы обычно собираем проект? В любимом терминале вводим: mvn clean install
После этого maven компилирует весь проект и копирует созданные артифакты в локальный репозиторий. Все тривиально, но здесь есть ряд проблем. Это долго. Даже если убрать clean, запустятся тесты, после них произойдет упаковка в jar или какой другой тип артифакта, и наконец копирование полученного артифакта в $HOME/.m2/repository

Давайте подумаем над тем, как мы можем ускорить этот процесс. Может есть возможность выкинуть ненужные действия.
Как правило, изменения присутствуют не во всех модулях. Разумеется, можно собрать отдельно только те модули, которые нам нужны. Но это довольно утомительно. Нужно будет явно следить в каких модулях производились изменения и затем переключаться в требуемую директорию подмодуля либо прописывать явно названия этих подмодулей после флага -pl

Есть другое решение. Все мы, надеюсь, используем git, либо какую то другую scv. Так вот, почему бы при добавлении в репозиторий не добавлять информацию о номере последнего коммита. Это позволит отслежить версию артифакта в рамках одной и той же версии. Если ревизия совпадает. очевидно, нет смысла собирать еще раз подмодуль, т.к. в локальном репозитории присутствует уже актуальная версия.

Как же это реализовать? Для этого потребуется подключить несколько maven плагинов и немного попрограммировать на xml 😃

пятница, 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
на примере создания вебсайта