Міністерство освіти і науки України
Національний Університет “Львівська Політехніка”
Кафедра ЕОМ
Методичні вказівкидо лабораторних робіт
з дисципліни “ТЕСТУВАННЯ ПРОГРАМНИХ ЗАСОБІВ”
для студентів спеціальності "Комп’ютерна інженерія"
Львів-2014
Лабораторна робота №1
Тема: Модульне тестування програмних засобів на базі C# Fremework– NUnit.
Мета: Засвоїти основні принципи тестування програмних засобів на базі NUnit.
Загальні відомості
Основна ідея модульного тестування ПЗ полягає в тому, що ми пишемо набір тестів для нашого модуля (функції чи процедури), при чому лише раз, а саме тестування вважається успішним, якщо усі тести з набору були успішно пройдені. В протилежному випадку тестування вважається проваленим.
NUnit — відкрите середовище модульного тестування додатків для .NET. Вона була перенесена з мови Java (бібліотека JUnit). Перші версії NUnit були написані на J#, але потім весь код був переписаний на C# з використанням таких нововведень .NET, як атрибути. На сьогоднішній день існує декілька framework’ів для Unit тестування. У нашому варіанті ми будемо розглядати C# Framework.
На відміну від інших програм такого типу NUnit може проводити перевірки програм різної складності при великій кількості параметрів та вихідних результатів. Приступимо код до опису його вивчення.
Порядок підключення середовища NUnit до середовища Visual Studio
Завантаження програми
Завантажуємо програму #Nunit з http://nunit.org/?p=download останню версію NUnit, та встановлюємо її на ПК.
Підключення середовища NUnit до проекту
Для цього нажимаємо правою клавішею мишки на імені проекту, та заходимо до підрозділу «Добавить ссылку…».
ПРИМІТКА. NUnit підключається тільки до проекту, а не до Visual Studio. Тому при створенні нового проекту потрібно повторити всі дії по підключенню.
Підключення бібліотеки
У вікні яке відкриється в підменю «Сборки» вибираємо пункт «Разширения» та в списку правіше шукаємо напис «nunit.framework». Відмічаємо його галочкою і нажимаємо на клавішу «ОК».
Підключення простору імен у проекті
Для цього вписуємо у відповідне місце :
using NUnit.Framework;
Компілюємо і запускаємо програму. Вона по замовчуванню інсталюється в каталог «C:\Program Files\NUnit 2.6.3» а сам виконавчий файл знаходиться у каталозі bin\nunit.exe. Переглядаємо як проходять тести – для цього запускаємо NUnit і в ньому вибираємо (File->OpenProject) створений нами *.exe файл. В результаті NUnit має мати вигляд:0020
Завдання
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NUnit.Framework;
namespace Lab1
{
class Program
{
static void Main(string[] args)
{
}
public static int Sum(int value,int value2)
{
return value+value2;
}
[Test]
public void TestFunction()
{
int value=5;
int value2=3;
Assert.IsTrue(Sum(value,value2)>=0);
Assert.IsInstanceOf(typeof(int),Sum(value,value2));
Assert.AreEqual(value+value2,Sum(value,value2));
}
}
}
Опис створеного тесту
На мові програмування C#була написана тестова функція, яка знаходить суму чисел, вона була протестована за допомогою NUnit.
Sum() - функція, що тестується на коректність роботи.
TestFunction() - функція, яка тестує функцію Sum() і в разі виникнення помилки повідомляє про це в NUnit.
Вікно NUnit після вдалого тестування
Тепер змінимо функцію, щоб вона повернула не той результат , який очікувався.
public static int Sum(int value,int value2)
{
return value*value2;
}
Лабораторна робота №2
Тема: Модульне тестування програмних засобів на базі Java jUnit.
Мета: Засвоїти основні принципи тестування програмних засобів на базі jUnit.
Загальні відомості
Основна ідея модульного тестування ПЗ полягає в тому, що ми пишемо набір тестів для нашого модуля (функції чи процедури), при чому лише раз, а саме тестування вважається успішним, якщо усі тести з набору були успішно пройдені. В протилежному випадку тестування вважається проваленим.
JUnit — бібліотека для тестування програмного забезпечення на мові Java
і є представником родини фреймворків xUnit для різних мов програмування. JUnit породив екосистему розширень —JMock, EasyMock, DbUnit, HttpUnit, Selenium тощо.
Для чого використовуються модульні тестит?
Знаходження проблем та помилок на ранніх етапах циклу розробки програми.
Модульні тести – шлях до оптимальності вирішення задачі.
Можуть бути використанні для перевірки чи працює код після його зміни.
Використовуються для документації
Коли слід використовувати модульне тестування?
Якщо модуль вірогідно може містити помилки.
Якщо код є простим і очевидним не слід писати для нього тестів.
Як писати модульні тести?
Сама ідея модульних тестів полягає в тому, що для кожного модуля( в випадку jUnit) класу, створюється окремий тест, який оперує над основним кодом, та результатами його роботи. Тест може рахуватися тільки як пройдений (success) або провалений(fail).
jUnit не гарантує порядку виконання тестів, тому рекомендовано писати тести так, щоб вони не залежали один від одного.
Починаючи з версії 4.11 – ви можете використати анотацію для визначення порядку виконання тестів – по імені. Для цього використовується анотація @FixMethodOrder(MethodSorters.NAME_ASCENDING)
Встановлення jUnit
Eclipse дозволяє використовувати версію JUnit, який інтегрований в Eclipse. Якщо ви використовуєте Eclipse, ніякої додаткової настройки не потрібно. В цьому випадку ви можете пропустити наступний розділ.
Якщо ж ви не використовуєте Eclipse, або вам потрійний jUnit специфічної версії, ви можете завантажити його з сайту:
http://junit.org/
Там ви знайдете необхідну вам версію jUnit, після чого слід розраховувати та додати до вашого проекту та в classpath.
Можливості Eclipse для jUnit
Ви можете створювати ваші тести в ручну, проте Eclipse надає можливість створювати тест за допомогою wizard.
Наприклад для створення тесту для певного класу достатньо вибрати даний клас в Project Explorer та нажати праву клавішу -> New -> jUnit Test.
Альтернативно можна викликати помічник: File → New → Other... → Java → JUnit.
Написання jUnit Тесту
В jUnit є певні правила та рекомендації щодо створення та написання тестів, вони поділяються на декілька кроків.
Крок 1:
Створення класу з назвою типу НазваОсновгоКласуTest, наприклад:
Для класу з назвою MyProgram, тестовий клас має мати назву MyProgramTest.
Імпорт jUnit класів:
Import org.junit.*; import static org.junit.Assert.*;
Оголошення змінних, які будуть часто використовуватися, в тому числі змінну класу, який тестується.
private MyProgram program;
Крок 2:
Якщо є необхідність, можна створити метод, який виконається тільки 1 раз, коли клас загрузиться, наприклад може бути використаний для встановлення початкових даних, тощо.
Для цього створюється метод, з довільною назвою, проте він повинен бути проанотований анотацією @BeforeClass, наприклад:
@BeforeClasspublic static void setUpClass() throws Exception { // one-time initialization code}
Аналогічно, можна створити метод, який буде викланий тільки 1 раз після проходження тестів, що є корисним для звільнення ресурсів, тощо.
Для цього використовується анотація @AfterClass, наприклад:
@AfterClasspublic static void tearDownClass() throws Exception { // one-time cleanup code}
Крок 3:
Можна створити один або декілька методів, які будуть виконуватися перед виконанням кожного з тестів, типово такі методи використовуються для ініціалізації змінних, для того щоб кожний тест починався з чистих – «свіжих» даних.
Для цього використовуються анотація @Before, наприклад:
@Beforepublic void setUp() { program = new MyProgram(); array = new int[] { 1, 2, 3, 4, 5 };}
Аналогічно, можна створити один або декілька методів, яку будуть виконуватися після виконання кожного з тестів, типічно використвуються для звільнення ресурсів які використовуються тільки в 1 тесті, такі як файли, тощо.
Для цього використовується анотація @After.
@Afterpublic void tearDown (){}
Крок 4:
Тестовий метод метод, це метод з анотаціє @Test, він не примає жодних параметрів та нічого не повертає (void). Власне це і метод, в якому проводяться того, чи іншого роду операції для визначення працездатності основного коду.
Доцільно використовувати методи типу assertXXX.
Набір даних методів досить великий:
assertTrue – перевірка чи результатом є істина
assertFalse – перевірка чи результатом є хибність
assertEquals – перевірка чи 2 елемента є тотожні equal
assertArrayEquals – перевірка чи 2 масиви є тотожні equal
assertNotNull – перевірка чи елемент не є null (пусте посилання)
assertNull – перевірка чи елемент є null (пусте посилання)
assertSame – перевірка чи 2 посилання зсилаються на 1 і той самий об'єкт
assertNotSame – перевірка чи 2 посилання не зсилаються на 1 і той самий об'єкт
assertThat – перевірка чи об’єкт відповідає заданому matcher
Всі ці методи є перевантажені для різних типів даних. Для більш детальної інформації перегляньте документацію.
Якщо ж вище згадані методи не підходять, можна написати свою перевірку і як результат роботи тесту використати метод fail – при невдалому виконанні тесту. Якщо не виконається метод fail або жодний з assert не провалиться, тоді тест рахуватиметься, як вдалий.
Наприклад:
@Testpublic void sum() { assertEquals(15, program.sum(array)); assertTrue(program.min(array) > 0);}
Запуск jUnit Test
В середовищі розробки Eclipse IDE є доступний плагін для наглядного виконання тестів.
Для запуску тестів достатньо вибрати необхідний клас з тестами Run-as-> jUnit Test. Це запустить всі тестові методи в класі.
За допомогою Eclipse можна виконувати певні методи в класі, просто навівши курсор на назву класу та нажавши Alt+Shift+X,T.
Можна налаштувати відображення так, що відображалися тільки провалені тести, тощо.
При використанні тестів в якості технології TDD, користою може бути анотація @Ignore, використавши її, тест не буде ні проваленим, ні виконаним, він просто буде пропещний.
Специфічні тести
Якщо вам необхідно протестувати метод на специфічну помилку, тоді ви можете використати опцію для анатоції @Test – expected, в якій вказуєте який конкретно винянок повинен спрацювати, і якщо він відбудеться тоді тест буде зараховано як пройдений, в іншому випадку він буде провалений. Наприклад:
@Test(expected=IllegalArgumentException.class)public void testSomeMethod(){
myObj.someMethod();}
Якщо, код повинен виконатися за певний час, або є можливість того що він буде виконуватися надто довго, тоді можна використати опція для анатоації @Test – timeout. Якщо тест за вказану кількість мілісекунд не буде виконано, тоді він автоматично стає провалений.
@Test(timeout=100)public void testSomeMethod(){
myObj.someMethod();}
Додаткові можливості jUnit
Параметри
jUnit надає можливість використовувати параметри в тестових класах. Такий клас може містити один метод і цей метод буде виконуватися з різним набором параметрів.
Для цього потрібно позначити тестовий клас анотацією
@RunWith(Parameterized.class)
Такий тестовий клас повинен містити статичний метод з анотацією @Parameters який генерує та повертає колекцію масивів, кожен елемент цієї колекції використовується к параметр для тестового метода.
Потрібно створити конструктор куди будуть зберігатися параметри класу. Наприклад:
import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import java.util.Collection;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class)
public class MyParameterizedClassTest {
private int multiplier;
public MyParameterizedClassTest(int testParameter) {
this.multiplier = testParameter;
}
// creates the test data
@Parameters
public static Collection<Object[]> data() {
Object[][] data = new Object[][] { { 1 }, { 5 }, { 121 } };
return Arrays.asList(data);
}
@Test
public void testMultiplyException() {
MyClass tester = new MyClass();
assertEquals("Result", multiplier * multiplier,
tester.multiply(multiplier, multiplier));
}
}
Правила
jUnit вже має певні корисні правила. Наприклад TemoraryFolder клас, який створює файли і папки, які автоматично видаляються після тесту.
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.IOException;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
public class RuleTester {
@Rule
public TemporaryFolder folder = new TemporaryFolder();
@Test
public void testUsingTempFolder() throws IOException {
File createdFolder = folder.newFolder("newfolder");
File createdFile = folder.newFile("myfilefile.txt");
assertTrue(createdFile.exists());
}
}
Для створення власних тестів слід наслідувати інтерфейс TestRule.
Категорії
Починаючи з версії 4.8 є можливість створювати категорії тестів, а після запускати тести за вказаними категоріями. Наприклад:
public interface FastTests { /* category marker */
}
public interface SlowTests { /* category marker */
}
public class A {
@Test
public void a() {
fail();
}
@Category(SlowTests.class)
@Test
public void b() {
}
}
@Category({ SlowTests.class, FastTests.class })
public class B {
@Test
public void c() {
}
}
@RunWith(Categories.class)
@IncludeCategory(SlowTests.class)
@SuiteClasses({ A.class, B.class })
// Note that Categories is a kind of Suite
public class SlowTestSuite {
// Will run A.b and B.c, but not A.a
}
@RunWith(Categories.class)
@IncludeCategory(SlowTests.class)
@ExcludeCategory(FastTests.class)
@SuiteClasses({ A.class, B.class })
// Note that Categories is a kind of Suite
public class SlowTestSuite {
// Will run A.b, but not A.a or B.c
}
Test Suite
Якщо необхідно пройти декілька тестів разом, для цього слід використати Test Suite. Для цього слід клас з довільною назвою, та анотаціями @RunWith(value=Suite.class), та @SuiteClasses.
При чому в другій анотації, як опції вказуються всі класи-тести, які слід виконати. Сам же клас може бути ( і основному є ) пустий. Наприклад:
@RunWith(value=Suite.class)@SuiteClasses(value={MyProgramTest.class, AnotherTest.class})public class AllTests { … }
Вікно NUnit після невдалого тестування
Тест показує, що очікувалося значення 8, а функція повернула 15, тому тест провалений.
Лабораторна робота №3
Тема: Статичний аналіз вихідного коду засобами Cppcheck
Мета: Засвоїти основні поняття та принципи статичного аналізу коду. Виконати статичний аналіз вихідного коду засбоати Cppcheck.
Загальні відомості
Статичний аналіз коду — це процес аналізу та пошуку помилок у вихідному коді програми, який виконується без запуску програми на виконання.
Аналіз коду відбувається за допомогою відповідних програм, а не виконується вручну. Глибина аналізу може сягати від визначення поведінки окремих операторів до аналізу окремих модулів та цілого вихідного коду загалом.
Варто наголосити, що статичний аналіз завжди застосовується в предметній області, яка має важливий вплив на здоров’я людини та середовища. Наприклад, в таких областях:
ПЗ для медичних пристроїв
ПЗ для ядерних станцій і систем захисту реакторів
ПЗ для авіації
Більшість компіляторів виводять на екран “попередження” - це повідомлення, яке говорить, що код є синтаксично коректний, проте може приводити до помилок на етапі виконання. Відповідно до цих повідомлень, можна стверджувати, що компілятор виконує базовий статичний аналіз коду. Проте, для більш детального аналізу використовують спеціальні програми призначені для статичного аналізу коду.
До найбільш поширених помилок, які виявлє статичний аналізатор коду відносяться:
Помилки невизначеної поведінки , які проявляються при використання неініціалізованих змінних, зверненні до NULL-вказівника.
Порушення алгоритму використання бібліотеки. Наприклад, для кожного виклику функції fopen необхідно викликати fclose.
Переповнення буфера.
Помилки витоку пам’яті.
Помилки виходу за межі масиву.
Помилки в операціях вводу/виводу
Існує багато інструментів статичного аналізу коду, найбільш поширені наведені в таблиці нижче
Мова програмування
Назва програми
С/С++
Cppcheck, PVS-Studio, BLAST, Coverity, PC-Lint, lint, Cppcheck, Parasoft C/C++ Test, SourceAnalyzer
Java
FindBugs, Parasoft JTest
.NET
ReSharper
Python
Pychecker, Pylint, Pyflakes
В дані лабораторні роботі ми проведемо статичний аналіз коду використовуючи програму Cppcheck.
Cppcheck —програма призначена для статичного аналізу вихідного коду на мові С/С++.
Дана програма є безкоштовною, кросплатформеною та простою у використанні. Cppcheck надає можливість аналізувати код як через консоль, так і використовуючи графічний інтерфейс програми.
Також, варто наголосити на тому, що дана програма має плагіни , які інтегруються в більшість популярних середовищ розробки коду, що спрощує процес аналізу коду під час його написання.
Перелік доступних плагінів:
• Code::Blocks - Integrated
• Codelite - Integrated
• Eclipse - Plugin
• gedit - Plugin
• Hudson - Plugin
• Jenkins - Plugin
• Mercurial (linux) - pre-commit hook - Check for new errors on commit (requires interactive
terminal)
• SonarQube - C++ plugin (Community Edition)
• Tortoise SVN - Adding a pre-commit hook script
• Visual Studio - cppcheck-vs-addin
• Visual Studio - Poor Man’s Visual Studio Cppcheck Integration
• Visual Studio - Cppcheck interface application for Visual Studio
Аналізатор Сppcheck виконує різні типи перевірок. Найбільш поширені з яких:
Витік пам’яті (memory leaks)
Витік ресурсів (resource leask)
Вихід за межі масивів (bounds checking for array overruns)
Використання неініціалізованих змінних
Використання застарілих бібліотечних функцій
Перевірка операцій вводу/виводу в потік
Розіменування нульового вказівника
Неправильне використання функцій із STL
Перевірка безпечності генерації виключних ситуацій (Exception safety checking)
Дана програма має графічний інтерфейс, який є добре спроектований та інтуїтивно зрозуміли, тому питання якими чином завантажити код на аналіз не повинно викликати труднощів і не розглядається в даній методичці.
Завдання
Реалізувати приклад програми із відповідною помилкою та виявити дану помилку виконавши статичний аналіз коду за допомогою програми Cppcheck використовуючи графічний або консольний інтерфейс на вибір студента.
Тип помилки, яку необхідно реалізувати визначається згідно таблиці за формулою:
N = (номер студента в журналі mod 7) +1
N
Тип помилки
1
Неправильне використання функцій із бібліотеки STL
2
Перевірка операцій вводу та виводу в потік
3
Використання застарілих бібліотечних функцій
4
Витік ресурсів (resource leask)
5
Вихід за межі масивів (bounds checking for array overruns) та витік пам’яті (memory leaks)
6
Розіменування нульового вказівника та використання неініціалізованих змінних
7
Перевірка безпечності генерації виключних ситуацій (Exception safety checking)
Приклад статичного аналізу коду
Нижченаведені приклади використовують консольний інтерфейс програми Cppcheck, яка повертає відповідне повідомлення про помилку.
Приклад №1. Витік пам’яті
Фрагмент коду з помилкою витоку пам’яті:
#include <stdio.h>
const int N = 100;
int main()
{
int *ptr = (int*) malloc(N); // динамічно виділяємо пам’ять під 100 байт
if (N > 100) {
free ( ptr );
return 0;
}
return 1;
}
В даній програмі буде витік пам’яті, якщо значення змінної N<100, оскільки при такій умові не виконуватиметься код з вивільнення пам’яті free ( ptr );
Запустивши цей код на аналіз в Cppcheck отримуємо повідомлення, яке вказує що у вихідному файлі main.c в рядку 4 виявлено місце витоку пам’яті:
main.c: 4: Memory leak: ptr
Приклад №2. Вихід за межі масиву
Фрагмнет коду з помилкою виходу за межі масиву:
#include <stdio.h>
const int ARR_SIZE = 5;
int main()
{
int arr[ARR_SIZE];
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
arr[3] = 5;
arr[4] = 8;
arr[5] = 13; // в даному рядку відбувається вихід за межі масиву
return 1;
}
Запустивши цей код на аналіз в Cppcheck отримуємо повідомлення, яке вказує що у вихідному файлі main.c в рядку 13 виявлено вихід за межі масиву:
main.c: 13: array 'arr[5]' index 5 out of bounds
Приклад №3. Перевірка операцій введення/виведення
Фрагмнет коду з помилкою виведення в потік:
#include <stdio.h>
int main()
{
int age = 7;
int position = 15;
char *name = “Jack”;
printf("My name is %s, I am %d years old", name, age, position);
return 1;
}
Форматуючий рядок функції printf виводить в потік 2 значення, одне рядкове - %s та одне ціле - %d, проте приймає 3 параметри, що є не коректно. Оскільки функція printf — це функція з невизначеною к-стю параметрів, то це код скомпілюється проте таке використання є неправильним.
Проаналізувавши даний код програмою Cppcheck отримуємо наступне повідомлення:
main.c: 9: printf format string has 2 parameters but 3 are given
Лабораторна робота №4
Тема: Автоматизація тестування web-додатків за допомогою Silenium.
Мета: Засвоїти основні принципи автоматизації тестування web-додатків.
Загальні відомості
Більшість програмних продуктів, що випускаються сьогодні, є веб - орієнтованими програмами, розрахованими на роботу в інтернет-браузері. Ефективність тестування подібних додатків відрізняється в різних компаніях і організаціях. В епоху високої інтерактивності і взаємодії в процесі розробки програм, коли багато організацій використовують методологію Agile в тій чи іншій формі, автоматизація тестування часто стає необхідністю. Під автоматизацією тестування мається на увазі використання інструментів для того, щоб багаторазово виконувати повторювані тести для тестованого програми. Регресійне тестування є найбільш типовим прикладом застосування цього підходу.
Автоматизоване тестування володіє безліччю переваг, пов'язаних головним чином з високою швидкістю виконання тестів і можливістю виконувати однотипні тести знову і знову. Існує велика кількість як комерційних , так і безкоштовних інструментів, що допомагають у розробці автоматизованих тестів. Selenium є найбільш поширеним серед інструментів з відкритим кодом.
Автоматизоване тестування дозволяє:
Частіше проводити регресійне тестування;
Швидко надавати розробникам звіт про стан продукту;
Отримати потенційно нескінченне число прогонів тестів;
Забезпечити підтримку Agile і екстремальних методів розробки;
Зберігати сувору документацію тестів;
Виявити помилки, які були пропущені на стадії ручного тестування.
Порядок виконання
Завдання 1
Для того, щоб почати роботу з системою, потрібно відвідати сайт http://www.seleniumhq.org/download/ та скачати додаток (плагін) Selenium IDE на інтернет браузер Mozilla Firefox. Після установки плагіна, потрібно виконати наступний крок:
Firefor -> Веб-розробка -> Selenium IDE, або просто виконати команду швидкого доступу Alt + Ctrl + S. Перед нами появиться наступне вікно (рис. 1).
Інтерфейс системи Selenium IDE.
В браузері Mozilla Firefox в адресному полі введемо наступний сайт https://www.google.com.ua/ і виконаємо перехід. Виконаємо запит «Погода в Україні» в пошуковику, в Selenium IDE побачимо наступні зміни (рис. 2).
Результат зчитування даних з google.
В таблицю Selenium IDE записано 2 кроки (команди). Команда переходу на сайт https://www.google.com.ua/ та команда пошуку. Ми можемо повторити пошук, натиснувши на кнопку «Play current test case», в цьому випадку система в автоматичному порядку виконає 2 команди з таблиці. Щоб виконати команди в ручному режимі, достатньо натиснути на кнопку «Step» або натиснути 2 рази правою кнопки миші на вибрану команду в таблиці.
За допомогою бібліотек Selenium WebDriver та мови Java (Eclipse), ми виконаємо наступну задачу, що складається з 4 кроків:
В автоматичному режимі виконаємо перехід на сайт http://www.gmail.com
Знайдемо локатор типу id «Email» та авторизуємось в ньому, заповнивши поля Email та Passwd, підтвердивши авторизацію.
Виконаємо надсилання нового листа з gmail на yandex, заповнивши поля одержувача та назву листа.
Після надсилання листа, виконаємо перехід на 1 лист у поштовій скриньці gmail.
Завдання 2 Selenium WebDriver
Завантажуємо бібліотеки Selenium WebDriver для мови Java за посиланням "http://www.seleniumhq.org/download/" та підключаємо їх до створеного проекту за допомогою вкладки "Project->Properties->Java Build Path->Libraries".
Створюємо об`єкт класу WebDriver: "private WebDriver driver; " та відкриваємо задану сторінку за допомогою методу get: "driver.get("http:/mail.ru");" .
Доступаємось до елемента сторінки за допомогою методу findElement: "driver.findElement(By.id("Pas"));" , далі виконуємо потрібні нам дії з даним елементом. Доступні дії над елементом: click – натиснення на елемент, clear – очищення елемента, sendKeys(new String[] {"Text"}) – вставлення відповідного тексту у елемент.
Зауваження: WebDriver надає кілька способів пошуку елементів. Наприклад, якщо у вас є елемент, визначений в HTML коді наступним чином:
<Input Type = "text" name = "passwd" id = "passwd-id" />
то можна знайти його будь-яким з наведених нижче способів:
WebElement element ;
element = driver . findElement ( By . id ( "passwd-id" ));
element = driver . findElement ( By . name ( "passwd" ));
element = driver . findElement ( By . xpath ( "//input[@id='passwd-id']" ));
Окрім цього ви можете знаходити посилання на їхній текст. Але будьте уважні! Текст посилання повинен бути точним збігом! Також, будьте уважні при використанні XPath в WebDriver . У випадку, якщо критеріям пошуку задовольняє декілька елементів, результатом виконання "findElement" буде перший з них. Якщо ж нічого знайти не вдалося, буде видано виключення "NoSuchElementException". Інколи розробник при створенні елемента не використовує id або name, тоді до елемента можна доступитись за допомогою cssSelector. Його можна знайти, натиснувши правою кнопкою на елемент, вибрати поле "Дослідити елемент" та у виділеному коді натиснути "Копіювати унікальний селектор".
Приклад:
WebElement element ;
element = driver . findElement ( By .cssSelector("#mailbox__auth__button"));
Для коректного завершення, якщо програма виконує багато дій, потрібно виконати команди:
driver.close();
Thread.sleep(3000);
driver.quit();
Якщо дій небагато, – достатньо тільки першої команди.
Код програми до першого завдання
import java.util.concurrent.TimeUnit;
import org.junit.*;
import org.openqa.selenium.*;
import org.openqa.selenium.firefox.FirefoxDriver;
import java.*;
public class Google
{
public static void main(String[] args)//main метод
{
Googlee g = new Googlee();
try
{
g.setUp();
g.sendEmail();
g.tearDown();
}
catch (Exception ex)
{
System.out.println(ex);
}
}
}
class Googlee {
private WebDriver driver;
private String baseUrl="http://www.gmail.com/";
//@Before
public void setUp() throws Exception {
driver = new FirefoxDriver();
driver.get(baseUrl);
driver.manage().timeouts().implicitlyWait(100, TimeUnit.SECONDS);
}
//@Test
public void sendEmail() throws Exception {
driver.switchTo().defaultContent();
//Enter your gmail username
WebElement userName = driver.findElement(By.id("Email"));
userName.sendKeвys(new String[] {"qwerty@gmail.com"});//емейл
//Enter your gmail password
WebElement password = driver.findElement(By.id("Passwd"));
password.sendKeys(new String[] {"123454321"});//пароль
//Click on sign In button.
driver.findElement(By.id("signIn")).click();
driver.findElement(By.xpath("//div[@id=':h5']/div/div")).click();
driver.findElement(By.id(":tj")).clear();
driver.findElement(By.id(":tj")).sendKeys(new String[] {"qwerty@yandex.ru"});//емейл отримувача
driver.findElement(By.id(":t5")).click();
driver.findElement(By.id(":t5")).clear();
driver.findElement(By.id(":t5")).sendKeys(new String[] {"Test Msg"});//заголовок повідомлення
driver.findElement(By.id(":sv")).click();
driver.findElement(By.id(":31")).click();//відкрити перше повідомлення у пошті
}
//@After
public void tearDown() throws Exception {
driver.quit();
}
}
Код програми до другого завдання
import java.util.concurrent.TimeUnit;
//import org.junit.*;
import org.openqa.selenium.*;
import org.openqa.selenium.firefox.FirefoxDriver;
//import java.*;
public class Selenium
{
public static void main(String[] args)//main метод
{
Test g = new Test();
try
{
g.setUp();
g.sendEmail();
g.tearDown();
}
catch (Exception ex)
{
System.out.println(ex);
}
}
}
class Test {
private WebDriver driver;
private String baseUrl="https://mail.ru/";
//@Before
public void setUp() throws Exception {
driver = new FirefoxDriver();
driver.get(baseUrl);
driver.manage().timeouts().implicitlyWait(100, TimeUnit.SECONDS);
}
//@Test
public void sendEmail() throws Exception {
driver.switchTo().defaultContent();
//Enter your username
WebElement userName = driver.findElement(By.name("Login"));
userName.sendKeys(new String[] {"mail"});//емейл
//Enter your password
WebElement password = driver.findElement(By.name("Password"));