среда, 7 апреля 2010 г.

Selenium + JAVA: Полезные JAVA-методы


Selenium это конечно хорошо, и запишет, и сравнит, и воспроизведет. А хочется ведь логику «поинтереснее» в тесты добавить, и вот тут весьма слабое знание JAVA мешает (ведь «держала» я её в руках последний раз в университете), но есть поисковики, да и просто хорошие, добрые и профессиональные люди :). Ниже представлены «джава-полезности», которые мне понадобились и пригодились во время доведения до ума скрипта, записанного с помощью Selenium IDE. Конечно же, это только начало «пути» и много нового, непознанного впереди. Возможно, и вам пригодиться, а может что-нибудь еще полезного мне посоветуете.


1. Кодировка.

В идеальном случае все элементы страницы живут с уникальными ID. Но тогда бы все было проще и не так интересно. Случилось у меня следующее: записала скрипт, экспорт сделала, а там… А там вместо русскоязычного словосочетания, «кракозябистость», которая компилируется, но не выполняется как надо. Эх, кодировка при компиляции определяется неправильно. Но мир не без добрых людей и вот компилятор начинает понимать, что мне от него надо:

javac -encoding utf-8

2. Запросы к БД.

Считать то, что на странице это хорошо. А вот сравнить это добро с начинкой приложения, это уже интереснее. То, с чем я работаю в данный момент, обладает вполне обычной MySql-ной начинкой. Стало мне интересно, как бы добраться из скрипта в БД. Совсем не с первого раза, но все получилось следующее:

import java.sql.*;

public class Query{

public static void main(String[] args){

Connection con = null;

Statement stmt;

try{

//загружаем класс драйвера

Class.forName("com.mysql.jdbc.Driver");

//создаем соединение с БД

con = DriverManager.getConnection("[url Базы данных]", "[логин]","[пароль]");

stmt = con.createStatement();

//запрос к БД

ResultSet rs = stmt.executeQuery("[запрос к БД]");

// а уже из rs данные и получаем

stmt.close();

con.close();

}

//Отлавливаем исключения

catch(java.lang.ClassNotFoundException e){

System.err.print("ClassNotFoundException: ");

System.err.println(e.getMessage());

}

catch(SQLException ex){

System.err.println("SqlException: " + ex.getMessage());

}

}

}

Подробнее описание пакета, классов и методов смотрим тут: http://java.sun.com/javase/6/docs/api/java/sql/package-summary.html.


3. Работа с датами.

Даты разные нужны, даты всякие важны, а текущая - самая дорогущая. Был в JAVA класс Date, а стал Calendar. Ниже то, что пригодилось мне:

import java.util.Calendar;

// Получаем текущую дату

Calendar rightNow = Calendar.getInstance();

// Записываем в переменную типа String

StartDate = String.valueOf(rightNow.get(Calendar.DATE)) + "." + String.valueOf(rightNow.get(Calendar.MONTH)+1) + "." + String.valueOf(rightNow.get(Calendar.YEAR));

// Добавляем к дате 10 дней

rightNow.add(Calendar.DATE,10);

Остальные «календарные» возможности и способности смотрим тут: http://java.sun.com/j2se/1.4.2/docs/api/java/util/Calendar.html


Продолжение следует...

6 комментариев:

А.Б. комментирует...

Позволю себе предложить импрувмент к кусочку кода с запросом к базе:
-- я бы добавил к try catch блок finally, в котором перепроверил бы закрытие коннекшина к базе, и если он есть, то насильно закрыл бы его... (поверьте мне - это полезно :)

А.Б. комментирует...

Галина, объяснить почему необходимо проверять закрыт ли коннект к базе в блоке finally или это итак ясно???

Настаиваю потому что кто-то может начать использовать Ваш пример, и наткнется на подводные камни, таящиеся в нем...

Галина Романова комментирует...

Алексей, объясняйте-объясняйте :) У меня просто пока руки не дошли. Я Вам верю, и собиралась попробовать, но время, время, время...

Галина Романова комментирует...

Вот нашла такое: http://www.skipy.ru/technics/exceptions.html

А.Б. комментирует...

Галина, не буду вдаваться в подробности обработки исключений в джава, лишь скажу, что может плохого сделать Ваш код:
В случае, если исключение (Exception) случиться в одной из следующих строк кода:
stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("[запрос к БД]");
stmt.close();

строка con.close(); не выполнится, а следовательно соединение с базой не будет закрыто. Таким образом вы можете случайно открыть слишком много соединений и тем самым повалить, скажем базу :). Поэтому, рекомендуется закрывать коннект в блоке finally, который вызывается всегда.

Вот.

Галина Романова комментирует...

Алексей, спасибо! Внесу исправления в пост, как только будет доступ нормальный к инету :)