Testing with Selenium

What’s this?

The method of testing using software library Selenium WebDriver, it allows to perform all manual work with browser automatically. 

How does it work?

1. Connect the libraries:

from selenium import webdriver
driver = webdriver.Firefox()

2. Connect to the browser and webpage:

driver.get("www.geo2tag.org")

3. Further you can perform different actions with the page:

# Search an element by 'id'
login_form = driver.find_element_by_id('loginForm')
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
try:
    # Wait 10 seconds until the method will be executed
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "myDynamicElement"))
    )
finally:
    driver.quit()
# Select the elements
menu = driver.find_element_by_css_selector(".nav")
hidden_submenu = driver.find_element_by_css_selector(".nav #submenu1")
# Execute hover with 'menu'
# and press on 'submenu'
actions = ActionChains(driver)
actions.move_to_element(menu)
actions.click(hidden_submenu)
actions.perform()
# Create the cookies
cookie = {‘name’ : ‘foo’, ‘value’ : ‘bar’}
driver.add_cookie(cookie)
# Output all cookies
driver.get_cookies()
# Execute the script of searching for class 'comment-user' and click on the first found element 
driver.execute_script("document.getElementsByClassName('comment-user')[0].click()")

How is it implemented in our project 

1. Create the test in directory geomongo/src/tst_selenium/

2. Import the basic class from directory geomongo/src/tst_selenium/ from file basic_selenium_test.py.

3. Create a class for testing any functional and make inheriting from the basic class. Import created test class to the file main.py and add into the function main the next string:

suite.addTest(BasicSeleniumTest.parametrize(TEST_CLASS_NAME, param=host))

where TEST_CLASS_NAME – our imported class.

4. Further the checkers will be work like in unit testing. Since the basic class is inherited from TestCase, then our class also will be have all attributes and methods for unit testing.

 Running tests

1. If there is GUI

cd geomongo/src/tst_selenium/
python main.py HOST

or

cd geomongo && ./scripts/run_selenium_tests.sh

2. If there is only console

cd geomongo/src/tst_selenium/
xvfb-run -a python main.py HOST

Examples

https://bitbucket.org/osll/geomongo/src/84f3b62be58c2bd2e431fdf529aa0fb24d602d26/src/selenium_tests/test_GT_1340_login_resurce.py?at=master&fileviewer=file-view-default

Useful links

  1. https://selenium-python.readthedocs.org
  2. http://habrahabr.ru/post/248559/
  3. http://www.seleniumhq.org/docs/
ShareShare on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInShare on VKEmail this to someone

Примеры осуществления запросов через CURL

LOGIN

Запрос: curl -c 'cookiefile.cookie' -X GET 'http://geomongo/instance/login/debug?_id=debug_user1'

Описание: залогиниться и получить cookie в файл: cookiefile.cookie

Результат: в директории, в которой находится пользователь, появится файл с cookie: cookiefile.cookie

Все последующие команды будут использовать полученный cookie файл.


ЛОГ

Запрос: curl -b 'cookiefile.cookie' -X GET 'http://geomongo/instance/service/testservice/log?number=10&offset=0&date_from=1983-01-22T08:00:00&date_to=2016-01-22T08:00:00'

Описание: команда возвращает список из number записей из testservice[log] со сдвигом offset и указанным временным промежутком.

Результат: 100 или меньше записей из базы, указанной после ‘service/’, коллекции ‘log’

Пример:

[{“date”: {“$date”: 1432821291832}, “message”: “test”, “_id”: {“$oid”: “55671e2b13293c504d515a35”}, “user_id”: “stub”, “service”: “testservice”}, …]


КАНАЛЫ (следующие команды следует выполнять последовательно)
Далее CHANNEL_ID – это идентификатор канала, полученный при выполнении первой комманды этого раздела

Запрос: curl -b 'cookiefile.cookie' -H "Content-Type: application/json" -X POST -d '{"name":"test_name","json":"{1: 2, 2: 4}"}' 'http://geomongo/instance/service/testservice/channel'

Описание: команда для создания канала с указанными параметрами name и json (параметры обязательны).

Результат: идентификатор созданного канала ObjectId или null – если канал с таким идентификатором уже существует

Пример:

{“$oid”: “CHANNEL_ID”}

Запрос: curl -b ‘cookiefile.cookie’ -X GET ‘http://geomongo/instance/service/testservice/channel?number=10&offset=0

Описание: поиск number каналов со сдвигом offset, в имени которых содержится substring (все параметры не являются обязательными).

Результат: список каналов базы, указанной после ‘service/’, коллекции ‘channels’ либо пустой список []

Пример:

[{“owner_group”: “STUB”, “name”: “test_name”, “acl”: 777, “json”: “{1: 2, 2: 4}”, “_id”: {“$oid”: “55d159027efcd636178b9f21”}, “owner_id”: “STUB”}, …]

Запрос: curl -b 'cookiefile.cookie' -X PUT -d 'name=new_test_channel' 'http://geomongo/instance/service/testservice/channel/CHANNEL_ID'

Описание: команда изменяет запись в базе, либо оповещает, что нет такого канала.

Результат: пустые кавычки {} или ‘Channel does not exist’

Запрос: curl -b ‘cookiefile.cookie’ -X GET http://geomongo/instance/service/testservice/channel/CHANNEL_ID

Описание: поиск канала по его id.

Результат: запись из базы, указанной после ‘service/’, с идентификатором CHANNEL_ID коллекции ‘channels’ либо оповещение что нет такого канала.

Пример:

{“owner_group”: “STUB”, “name”: “test_name”, “acl”: 777, “json”: “{1: 2, 2: 4}”, “_id”: {“$oid”: “55d159027efcd636178b9f21”}, “owner_id”: “STUB”} 

или

‘Channel does not exist’

Запрос: curl -b 'cookiefile.cookie' -X DELETE 'http://geomongo/instance/service/testservice/channel/CHANNE_ID'
Описание: удаление канала из базы, указанной после ‘service/’, с идентификатором CHANNEL_ID коллекции ‘channels’, либо оповещение, что нет такого канала.

Результат: пустые кавычки {} или ‘Channel does not exist’


 

ТОЧКИ (следующие команды следует выполнять последовательно)
Далее POINT_ID – это идентификатор точки, полученный при выполнении первой комманды этого раздела

Запрос: curl -b 'cookiefile.cookie' -H "Content-Type: application/json" -X POST -d '[{"lat":1.1,"lon":1.1,"alt":1.1,"json":{"a":"b"},"channel_id":"CHANNEL_ID"}]' 'http://geomongo/instance/service/testservice/point'

Описание: создание точки с указанными параметрами lon, lat, alt, json, channel_id, которые передаются в отдельном json’e и являются обязательными.

Результат: идентификатор созданной записи в базе, указанной после ‘service/’, коллекции ‘points’

Пример:

[“POINT_ID”]

Запрос: curl -b 'cookiefile.cookie' -X GET 'http://geomongo/instance/service/testservice/point?number=10&channel_ids=CHANNEL_ID'
Описание: возвращает список точек, соответствующих поисковому запросу

Запрос: curl -b 'cookiefile.cookie' -X PUT -d 'alt=5' 'http://geomongo/instance/service/testservice/point/POINT_ID'

Описание: изменение информации о точке c указанным id.

Результат: команда изменит запись в базе и вернет {} или Point does not exist

Запрос: curl -b 'cookiefile.cookie' -X GET 'http://geomongo/instance/service/testservice/point/POINT_ID'

Описание: поиск точки по указанному id.

Результат: запись базы(сервиса), указанного после ‘service/’, либо оповещение что нет такой точки.

Пример:

{“channel_id”: null, “json”: null, “location”: {“type”: “Point”, “coordinates”: [1.1, 1.1]}, “date”: {“$date”: 1439825024437}, “alt”: 5.0, “_id”: {“$oid”: “55d1d2507efcd65a7de01205”}} 

или

‘Point does not exist’

 

Запрос: curl -b 'cookiefile.cookie' -X DELETE 'http://geomongo/instance/service/testservice/point/POINT_ID'

Описание: удаление точки по указанному id.

Результат: команда удалит из базы точку и вернет {} или Point does not exist.


 

СЕРВИСЫ (следующие команды следует выполнять последовательно)
Далее SERVICE_NAME – название сервиса выбранного при исполнении первой команды данного раздела

Запрос: curl -b 'cookiefile.cookie' -X POST -d 'name=SERVICE_NAME&ownerId=new_test_ownerId&logSize=10'http://geomongo/instance/service

Описание: создание сервиса с параметрами name (обязательный), logSize и ownerId (необязательные).

Результат: идентификатор созданного сервиса ObjectId или Service already exist

Запрос: curl -b 'cookiefile.cookie' -X GET 'http://geomongo/instance/service?number=0&offset=0'

Описание: получение number сервисов c offset сдвигом.

Результат: список сервисов.

Пример:

[{“_id”: {“$oid”: “55671ae113293c504d515a33”}, “config”: {“log_size”: 1048576, “logSize”: 10}, “name”: “testservice”, “owner_id”: “”}, …]

Запрос: curl -b 'cookiefile.cookie' -X PUT -d 'logSize=15' 'http://geomongo/instance/service/SERVICE_NAME'

Описание: изменение параметров сервиса с указанным именем.

Результат:

{“SERVICE_NAME”: “Service updated”}

Запрос: curl -b 'cookiefile.cookie' -X GET 'http://geomongo/instance/service/SERVICE_NAME'

Описание: поиск сервиса по указанному имени.

Результат: запись из базы ‘geomongo’ коллекции ‘services’.

Пример:

{“_id”: {“$oid”: “55d1d7507efcd65a7de01214”}, “config”: {“log_size”: 10, “logSize”: 15}, “name”: “new_test_service”, “owner_id”: “new_test_ownerId”}

Запрос: curl -b 'cookiefile.cookie' -X DELETE 'http://geomongo/instance/service/SERVICE_NAME'

Описание: удаление сервиса по указанному имени сервиса.

Результат:

{“SERVICE_NAME”: “Service removed”}


ПЛАГИНЫ
Далее PLUGIN_NAME – это имя плагина, имена можно получить первой командой данного раздела

Запрос: curl -b 'cookiefile.cookie' -X GET 'http://geomongo/instance/plugin'

Описание: получение списка плагинов.

Результат: JSON – список всех плагинов

Пример:

{“test_plugin_for_fail”: false, “test_plugin_for_load_fail_gt_1435”: false, “test_plugin”: true, “ok_import”: true, “testPlugin1”: false, “testPlugin2”: true}

Запрос: curl -b 'cookiefile.cookie' -X GET 'http://geomongo/instance/manage_plugins?PLUGIN_NAME=True'

Описание: управление статусом плагина по указанному имени плагина.

Результат: команда изменяет статус плагина и возвращает null

 


LOGOUT

Запрос: curl -b 'cookiefile.cookie' -X GET 'http://geomongo/instance/logout'

Описание: команда для разлогирования пользователя.

Результат: команда удалит пользователя из сессии.

ShareShare on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInShare on VKEmail this to someone

Examples of executing queries with CURL

LOGIN

Query:

curl -c 'cookiefile.cookie' -X GET 'http://geomongo/instance/login/debug?_id=debug_user1'

Description: to login and get cookie to the file cookiefile.cookie.

Result: in the current user’s directory file with cookie (cookiefile.cookie) should appear.

All following commands will use obtained cookie file.


LOG

Query :

curl -b 'cookiefile.cookie' -X GET 'http://geomongo/instance/service/testservice/log?number=10&offset=0&date_from=1983-01-22T08:00:00&date_to=2016-01-22T08:00:00'

 

Description: this command returns list of number of records from testservice[log] with shift offset and specified time span.

Result: 100 or less records from database specified after ‘service/’, collection ‘log’.

Example:

[{"date": {"$date": 1432821291832}, "message": "test", "_id": {"$oid": "55671e2b13293c504d515a35"}, "user_id": "stub", "service": "testservice"}, ...]

 


CHANNELS

The next commands should be executed sequentially.

Futher CHANNEL_ID is an identifier of channel obtained after execution the first command in this section.

Query:

curl -b 'cookiefile.cookie' -H "Content-Type: application/json" -X POST -d '{"name":"test_name","json":"{1: 2, 2: 4}"}' 'http://geomongo/instance/service/testservice/channel'

 

Description: a command for creation channel with specified parameters name and json (parameters are obligatory).

Result: identifier of created channel ObjectId or null – if the channel with the same identifier already exists

Example:

{"$oid": "CHANNEL_ID"}

Query:

curl -b 'cookiefile.cookie' -X GET 'http://geomongo/instance/service/testservice/channel?number=10&offset=0'

Description: search number of channels with shift offset, name of which contains substring (all parameters are optional).

Result: list of channel of base specified after ‘service/’, collection ‘channels’ or en empty list []

Example:

[{"owner_group": "STUB", "name": "test_name", "acl": 777, "json": "{1: 2, 2: 4}", "_id": {"$oid": "55d159027efcd636178b9f21"}, "owner_id": "STUB"}, ...]

Query:

curl -b 'cookiefile.cookie' -X PUT -d 'name=new_test_channel' 'http://geomongo/instance/service/testservice/channel/CHANNEL_ID'

Description: the command edits a record in the base or notifies that there isn’t such channel.

Result: the empty quotes {} or ‘Channel does not exist’.

Query:

 curl -b 'cookiefile.cookie' -X GET 'http://geomongo/instance/service/testservice/channel/CHANNEL_ID'

 

Description: search channel by its id.

Result: a record of base specified after ‘service/’ with identifier CHANNEL_ID , collection ‘channels’ or notification that there isn’t such channel.

Example:

{"owner_group": "STUB", "name": "test_name", "acl": 777, "json": "{1: 2, 2: 4}", "_id": {"$oid": "55d159027efcd636178b9f21"}, "owner_id": "STUB"}

or

‘Channel does not exist’

Query:

 curl -b 'cookiefile.cookie' -X DELETE 'http://geomongo/instance/service/testservice/channel/CHANNE_ID'

Description: deleting channel from base specified after ‘service/’ with identifier CHANNEL_ID , collection ‘channels’ or notification that there isn’t such channel.

Result: the empty quotes {} or ‘Channel does not exist’.


 POINTS

The next commands should be executed sequentially.

Further POINT_ID is a point identifier obtained after execution the first command of this section.

Query:

curl -b 'cookiefile.cookie' -H "Content-Type: application/json" -X POST -d '[{"lat":1.1,"lon":1.1,"alt":1.1,"json":{"a":"b"},"channel_id":"CHANNEL_ID"}]' 'http://geomongo/instance/service/testservice/point'

Description: creation a point with specified parameters lon, lat, alt, json, channel_id which sent in separate json and are mandatory.

Result: identifier of created record in database specified after ‘service/’, collection ‘points‘.

Example:

[”POINT_I”]

Query:

curl -b 'cookiefile.cookie' -X GET 'http://geomongo/instance/service/testservice/point?number=10&channel_ids=CHANNEL_ID'

Description: returns list of points corresponding the search query

Query:

curl -b 'cookiefile.cookie' -X PUT -d 'alt=5' 'http://geomongo/instance/service/testservice/point/POINT_ID'

Description: editing information about a point with specified id.

Result: the command edits a record of database and return {} or Point does not exist

Query:

curl -b 'cookiefile.cookie' -X GET 'http://geomongo/instance/service/testservice/point/POINT_ID'

Description: search point by specified id.

Result: record of database (service) specified after ‘service/’ or notification that there isn’t such point.

Example:

{"channel_id": null, "json": null, "location": {"type": "Point", "coordinates": [1.1, 1.1]}, "date": {"$date": 1439825024437}, "alt": 5.0, "_id": {"$oid": "55d1d2507efcd65a7de01205"}}

or

‘Point does not exist’

Query:

curl -b 'cookiefile.cookie' -X DELETE 'http://geomongo/instance/service/testservice/point/POINT_ID'

Description: deleting point by specified id.

Result: command  deletes a point from database and returns {} or Point does not exist.


 SERVICES

The next commands should be executed sequentially.

Further SERVICE_NAME is a name of service which chosen in execution the first command of this section.

Query:

curl -b 'cookiefile.cookie' -X POST -d 'name=SERVICE_NAME&ownerId=new_test_ownerId&logSize=10'http://geomongo/instance/service

Description: creation service with parameters name (mandatory), logSize and ownerId (optional).

Result: identifier of created service ObjectId or Service already exist

Query:

curl -b 'cookiefile.cookie' -X GET 'http://geomongo/instance/service?number=0&offset=0'

Description: gets number of services with shift offset.

Result: list of services.

Example:

[{"_id": {"$oid": "55671ae113293c504d515a33"}, "config": {"log_size": 1048576, "logSize": 10}, "name": "testservice", "owner_id": ""}, ...]

Query:

curl -b 'cookiefile.cookie' -X PUT -d 'logSize=15' 'http://geomongo/instance/service/SERVICE_NAME'

Description: editing parameters of service with specified name.

Result: {“SERVICE_NAME”: “Service updated”}

Query:

curl -b 'cookiefile.cookie' -X GET 'http://geomongo/instance/service/SERVICE_NAME'

Description: search service by specified name.

Result: record from database ‘geomongo’ collection ‘services’.

Example:

{"_id": {"$oid": "55d1d7507efcd65a7de01214"}, "config": {"log_size": 10, "logSize": 15}, "name": "new_test_service", "owner_id": "new_test_ownerId"}

 

Query:

curl -b 'cookiefile.cookie' -X DELETE 'http://geomongo/instance/service/SERVICE_NAME'

 

Description: deleting service by specified service’s name.

Result: {“SERVICE_NAME”: “Service removed”}


PLUGINS

Further PLUGIN_NAME is a name of plugin, names can be obtained by first command of this section.

Query:

curl -b 'cookiefile.cookie' -X GET 'http://geomongo/instance/plugin'

Description: getting list of plugins.

Result: JSON – list of all plugins.

Example:

{"test_plugin_for_fail": false, "test_plugin_for_load_fail_gt_1435": false, "test_plugin": true, "ok_import": true, "testPlugin1": false, "testPlugin2": true}

Query:

curl -b 'cookiefile.cookie' -X GET 'http://geomongo/instance/manage_plugins?PLUGIN_NAME=True'

Description:  manage status of plugin by specified name of plugin.

Result: command edits status of plugin and returns null.


LOGOUT

Query:

curl -b 'cookiefile.cookie' -X GET 'http://geomongo/instance/logout'

Description: a command for user logout.

Results: command deletes user from session.

ShareShare on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInShare on VKEmail this to someone