18 сентября 2012

Полезняшка: Сброс кэша в IE для Selenium тестов

Даже не спрашивайте меня зачем мне это понадобилось.
Понадобилось и все.

Достаточно аккуратная возможность сбросить кэши есть в Firefox.

public WebDriver createFf() {
    final DesiredCapabilities firefox = DesiredCapabilities.firefox();
    final FirefoxProfile firefoxProfile = new FirefoxProfile();
    disableCacheFF(firefoxProfile);
 
    final WebDriver firefoxDriver = new FirefoxDriver(firefoxProfile);
    return firefoxDriver;
}
 
public void disableCacheFF(final FirefoxProfile firefoxProfile) {
    firefoxProfile.setPreference("browser.cache.disk.enable", false);
    firefoxProfile.setPreference("browser.cache.memory.enable", false);
    firefoxProfile.setPreference("browser.cache.offline.enable", false);
    firefoxProfile.setPreference("network.http.use-cache", false);
}

В случае с Google Chrome я нашел такое решение

    final DesiredCapabilities chrome = DesiredCapabilities.chrome();
    chrome.setCapability("chrome.switches",
        Arrays.asList("--start-maximized","--disk-cache-size=1","--media-cache-size=1"));

Способ сброса кэша в Opera  я пока исследую.
В остатке - Internet Explorer.
С ним как обычно беда, и беде этой не первый год.
Но windows/.NET/MS - разработчики  - тоже люди тоже упирались в эту проблему.
В итоге было решено сделать "крайне элегантный в своей простоте" (с) workaround - вызов нативной DLL-ки.
Делается это так

RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 8

Последняя циферка является маской действия, вот тут расписано какая маска что значит.
Осталось это только выполнить на конкретной машине где запускается Internet Explorer.
Сделать это можно  опять же двумя способами:

  1. Создать прокси класс для работы с RemoteWebDriver -почти готовое решение есть вот здесь.
  2. Написать маленький Jetty-based сервис и положить на ноду. Это решение я сделал в качестве примера и выложил на GitHub





05 сентября 2012

Selenium: Определение IP адреса ноды на которой выполняется тест


Терминология 


  1. грид - Selenium Grid - состоит из хаба и нод.
  2. хаб (Selenium Grid Hub) - экземпляр selenium-server-standalone запущенный с ключом "-role hub"
  3. нода (Selenium Grid node) - экземпляр selenium-server-standalone запущенный с ключом "-role node -hub http://<адрес хаба>:4444/grid\register"


Не буду вдаваться в предысторию вопроса, но суть проблемы была сведена к следющему - при запуске Selenium-тестов на гриде нужно знать на какой конкретно ноде был запущен тест.
Стандартное API Selenium не предоставляет такой возможности,хотя к чести разработчиков Selenium-а надо сказать что они в последнее время начали смотреть в эту сторону.

Дальнейшее рассмотрение проблемы привело меня к следующbv вариантам решения:

  1. дописать свой собственный сервлет к кодобазe Selenium
  2. написать нечто внешнее что позволило бы определять IP адерса нод и отдаавать их.


Первый варинат решения является наиболее элегантным и рассово-правильным, если не принимать в вонимание то, что за 1(!) год работы над Selenium 2 было выпущено только 25(!!!) релизов.
Если вам нужно постоянно зхапускать тесты на последней версии браузера, то с выходом каждой новой версии вам придется сливать код из mainline Selenium-а, мерджить его со своей версией проекта, пересобирать, и раскатывать по своему гриду.
Ну и как бесплатный бонус  - шанс что-то сломать и потом долго это искать.

Второй вариант не предполагает внесения правок в исходники Selenium, но писать придется все с нуля.
Суть заключатеся в создании вэб-приложения единственной функцией которого было бы информирование о том с какого IP пришле ему запрос.
Так как это вэб-приложение то работать с ним можно с помощью того же самого браузера на той же самой ноде.

Ну и пример приложения.
Точка входа

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
 
public class Runner {
 
 public static void main(String[] args) throws Exception {
  Server server = new Server(9090);
  final ServletContextHandler servletContextHandler = new ServletContextHandler();
  servletContextHandler.addServlet(new ServletHolder(new IpDetectorServlet()), "/getIp");
  server.setHandler(servletContextHandler);
  server.start();
  server.join();
 }
}
 

Ну и начинка которая непосредственно занимается определением и возвратом IP

import java.io.IOException;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
 
public class IpDetectorServlet extends HttpServlet {
 
 /**
  * 
  */
 private static final long serialVersionUID = 5661514303101772232L;
 
 @Override
 protected void service(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  final String remoteAddr = request.getRemoteAddr();
  response.setContentType("text/plain");
  response.setContentLength(remoteAddr.length());
  response.getWriter().write(remoteAddr);
 }
 
 
}


Дальше упаковываем все это в стандартный jar и можем запускать на любоей платформе.
Чтобы получить адрес ноды на которой выполняется тест теперь нужно в коде теста просто иметь вот такую строчку

driver.get("http:10.10.10.12:9090/getIp");
String ip = driver.findElement(By.tagName("body")).getText(); // так конечно делать не хорошо :)
System.out.println(ip);


Исходники на GitHub 

PS очень надеюсь, что в ближайшее время разработчики Selenium сделают HUB API и потребность в подобного рода "велосипедах" отпадет.

Книга: Сет Годин "Прекратите воровать мечты !"


Слава Панкратов и Саша Орлов перевели книгу Сета Година "Stop Stealing Dreams!" о чем и сообщили мне в почту в расслыке Стратоплана.

Бесплатную книжку, да еще и компетентно переведенную, стыдно было не прочитать.
Перевод кстати очень качественный.

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

(Я немного переставлю фрагменты местами чтобы был понятен ход моей мылсли)

1.
Во время поездки в Пруссию Манн ознакомился с тамошней полувоенной системой образования и внедрил ее здесь: сначала расписал ее, а затем ввел ее на Северо-востоке США, откуда она распространилась со временем по всей стране.

2.
Развитие личности учащегося было так же важно, как и чтение, письмо, арифметика. Внедрение ценностей вроде послушания власти, пунктуальность, посещаемость, организация времени относительно сигналов звонка помогали подготовить учеников к будущему трудоустройству.

Так описывает Сет Годин истоки американской общеобразовательной школы.
Чем она отличается от нашей ? В сущности ничем.
Только тем что наша школа не заимствована опосредовано у американцев, а напрямую у пруссаков (это исключительно мое мнение).
Эта мысль мне кажется ключевой - отсюда все пошло, в том числе все то, что мы расхлебываем сейчас.

Теперь тезисно остальныые мысли из книги.


  1. Школьная система образования была сформирована под воздействием промышленности и обслуживает ее нужды - поставка "хороших" рабочих - покладитсые, покорные, несамостоятельные.
  2. Текущая экономическая ситуация с этим плохо клеится - растущая автоматизация производства и аутсорсинг, как следствие растущая безработица.
  3. Школа и общество не воспитывают увлеченность и лидерство в детях. 
  4. Детей не учат работать совместно - все обучение направлено на промышленнй контроль качества каждого выпускаемого школьника, а не "партии в целом", уж тем более не конкурентноспособности.
  5. Людей в массе стало больше, но стало существенно меньше тех, кто двигал бы прогресс - школа воспитывает на предпринимателей и ученых, а клерков и секретарш.
  6. Стоимость получения информации  - низка как никогда до текущего момента, но даже в этой ситуации ее никто не потребляет, потому что нет силы воли.

  7. И процитирую напрямую 
"Тупые раньше были побочным продуктом недостаточного доступа к знаниям, плохих учителей или родителей. Сегодня быть тупым - это выбор. Выбор, которые делают личности, не желающие учиться."



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


Теперь от себя:

1. Коллективная работа
Вы когда-нибудь пробовали организовать групу студентов 3-4 курса ВУЗа хотя бы даже для того чтобы выполнить работу которую им дали на всю группу ?
Я пробовал, дважды, даже SCRUM на них практиковал :).
Нет, они не были тупыми или кончеными упырями - все нормальные люди, с головой как минимум на среднем уровне, работами и стремлениями в жизни.
Но работать коллективно их никто не учил.
В школе не учили, в институте попробовали.
Получилось далеко не у всех.
А потом эти люди приходят к вам в коллектив, и Вам придется объяснять им что в существующую, налаженную экосистему нужно вписываться, а не переписывать ее под себя.
И что от результата их работы иногда (или даже часто) зависит работа других людей.

2. Лидерство.
Даже не спрашивайте меня что такое лидерство - я и сам не знаю точно.
Но знаю, что без увлеченности делом и принятия отвественности за себя(других/общее дело - нужное подчеркнуть) к этому понятию даже не приблизиться.
Этому в наших школах тоже не учат - в основном учат "сидеть на жопе ровно", круговой поруке, а увлеченность поощеряют тогда и только тогда, когда сама школа (как институт) имеет с этого выхлоп.

3. Нетворкинг
Я очень не люблю это слово, но тем не менее.
Вы знаете чем занимаются ваши одноклассники-однокурсники?
А чем они могут вам помочь в вашей текущей деятельности ? ( вопросы фалометрии "кто кем стал после школы?", "у кого джЫп круче?" оставим для дискуссии о человеческой природе en masse).
А сколько человек из класса открыли бизнес вместе или хотя бы работают на одном и том же предприятии? Из моего - никто.
Мы очень мало знаем даже о возможностях/способностях/навыках друг-друга, которые нам же могут пригодится.
Школа этому тоже не учит.
Даже в минимальной степени.


Я читал эту книжку очень долго, несмотря на то что в ней всего 80(!) страниц.
Временами мысль автора уходит очень глубоко, временами - прямо на поверхности.
Заставляет задуматься чему ты будешь учить своего ребенка.
И чему его должна научить школа.
В этой книжке нет ни одного ответа на поставленные автором вопросы, но даже несмотря на это у меня не поднимается рука поставить ей меньше чем 7 баллок по 10 балльной шкале.

Ребятам из команды Стратоплана еще раз большое спасибо за их труд и качественный перевод.