3. KAKUNIN WORKSHOPS
AGENDA
▸ HOW TO INSTALL AND CONFIGURE KAKUNIN?
▸ HOW TO NAVIGATE BETWEEN PAGES AND
VALIDATE CURRENT PAGE?
▸ HOW TO INTERACT WITH ELEMENTS AND
VALIDATE CONTENT?
▸ HOW TO FILL IN, CHECK OUT ITS VALUES AND
VALIDATE FORMS?
▸ HOW TO CHECK EMAILS CONTENT?
▸ HOW TO DEBUG KAKUNIN?
4. KAKUNIN WORKSHOPS
▸ HOW TO EXTEND KAKUNIN WITH CUSTOM STEPS?
▸ HOW TO HANDLE NON-BUILT-IN FORM FIELD
TYPES?
▸ HOW TO ADD SCENARIO SPECIFIC HOOKS?
▸ HOW TO CONNECT DIFFERENT MAILING SERVICE?
AGENDA
6. WHAT IS KAKUNIN?
▸ PROTRACTOR EXTENSION
▸ GHERKIN AS A PROGRAMMING LANGUAGE
▸ BUILT-IN STEPS TO SOLVE MOST COMMON CASES
▸ EASLY EXTENDABLE
▸ HANDLES ANGULAR AND NON-ANGULAR APPS
OUT OF THE BOX
KAKUNIN
10. INSTALATION
HOW TO INSTALL?
npm run kakunin init
cd step_definitions
ln -s ../node_modules/kakunin/dist/step_definitions/elements.js kakunin-elements.js
ln -s ../node_modules/kakunin/dist/step_definitions/debug.js kakunin-debug.js
ln -s ../node_modules/kakunin/dist/step_definitions/file.js kakunin-file.js
ln -s ../node_modules/kakunin/dist/step_definitions/form.js kakunin-form.js
ln -s ../node_modules/kakunin/dist/step_definitions/email.js kakunin-email.js
ln -s ../node_modules/kakunin/dist/step_definitions/generators.js kakunin-generators.js
ln -s ../node_modules/kakunin/dist/step_definitions/navigation.js kakunin-navigation.js
11. INSTALATION
HOW TO INSTALL?
npm run kakunin
Scenario:
If you can see this in console then hook is working properly.
✔ When I visit the "page" page
✔ And I generate random "name" as "myName"
✔ Then my matcher "e:name" matches "v:myName"
✔ And my matcher "e:name" matches "Bob"
1 scenario (1 passed)
4 steps (4 passed)
0m00.757s
12. INSTALATION
HOW TO RUN A SINGLE SCENARIO?
npm run kakunin -- --tags @someTag
npm run kakunin -- --tags="@someTag and @otherTag"
npm run kakunin -- --tags="@someTag or @otherTag"
npm run kakunin -- --tags="not @someTag"
14. NAVIGATE BETWEEN PAGES
PAGE OBJECT
const { BasePage } = require('kakunin');
class MainPage extends BasePage {
constructor() {
super();
this.url = '/';
}
}
module.exports = new MainPage();
15. NAVIGATE BETWEEN PAGES
SCENARIO - NAVIGATING
Feature: Load main page
Scenario: Load main page as homepage
Given/When I visit the "main" page
The name of a page object file. For this case there has to be a file "main.js" in pages directory.
16. NAVIGATE BETWEEN PAGES
SCENARIO - CHECKING OUT ON WHAT PAGE WE ARE
Then the "main" page is displayed
The name of a page object file. For this case there has to be a file "main.js" in pages directory.
18. NAVIGATE BETWEEN PAGES
WHAT ABOUT URL WITH PARAMETERS ?
/suppliers/some-supplier-id/clients/some-client-id
/suppliers/:supplierId/clients/:clientId
...
this.url = '/suppliers/:supplierId/clients/:clientId';
...
19. NAVIGATE BETWEEN PAGES
PAGE CONTEXT
Then the "main" page is displayed
EVERY BUILT-IN STEP (EXCEPT NAVIGATION
ONES) WILL HAVE AN ACCESS TO MAIN PAGE
OBJECT.
21. INTERACTING WITH ELEMENTS
Then the "showActive" element is visible
The name of a selector from current page object file.
ELEMENT VISIBILITY
22. INTERACTING WITH ELEMENTS
SELECTORS
▸ defines access to element
▸ support for protractor locators
http://www.protractortest.org/#/api?
view=ProtractorBy
▸ support for angular only attributes
23. INTERACTING WITH ELEMENTS
SELECTORS
▸ id attribute, custom attribute, custom class, unique class - GOOD
▸ for angular app: ng-model, ng-repeat - GOOD
▸ html tag - BAD
▸ angular validation classes (ng-valid, ng-pristine etc) - VERY BAD
24. INTERACTING WITH ELEMENTS
SELECTORS
this.mySelectorName = $('.css-selector');
this.mySelectorName = $('html-tag');
this.mySelectorName = $('html-tag.css-selector');
this.mySelectorName = element(by.repeater('project in projects'));
25. INTERACTING WITH ELEMENTS
Then the "showActive" element is visible
ELEMENT VISIBILITY - PROBLEM
THE ELEMENT MUST BE VISIBLE RIGHT AWAY.
IT DOES NOT WAIT FOR ELEMENT TO BE
VISIBLE.
26. INTERACTING WITH ELEMENTS
When/Given/Then I wait for "visibilityOf" of the "showActive" element
ELEMENT VISIBILITY - SOLUTION
uses protractors expected conditions internally, for example
visibilityOf
invisibilityOf
27. INTERACTING WITH ELEMENTS
ELEMENT VISIBILITY - WHAT ELSE?
When/Given/Then the "showCompleted" element is present
When/Given/Then the "showCompleted" element is not visible
When/Given/Then the "showCompleted" element is not present
28. INTERACTING WITH ELEMENTS
When I fill the "myForm" form with:
| fieldSelector | value to be used |
Form selector
Input selector
this.myForm = $('.add-todo');
this.fieldSelector = $('.add-todo input[name="add-todo"]');
FILLING UP FORM
29. INTERACTING WITH ELEMENTS
Then the "myForm" form is filled with:
| fieldSelector | value to be used |
Form selector
Input selector
CHECKING OUT FORM VALUE
30. INTERACTING WITH ELEMENTS
WHAT ABOUT DIFFERENT FIELD TYPES?
▸ supports all of the basic html field types (radio, checkbox, textarea, select, file, text)
▸ allows to add custom made handlers for field types
31. INTERACTING WITH ELEMENTS
HOW ABOUT SUBMITTING ?
When I click the "addTodoButton" element
The name of a selector from current page object file.
55. TRANSFORMERS
When I fill the "myForm" form with:
| projectUrl | http://some-url.com |
| projectType | 1234 |
WITHOUT TRANSFORMERS
When I fill the "myForm" form with:
| projectUrl | g:projectUrl |
| projectType | d:projectTypes:website |
WITH TRANSFORMERS
60. EMAILS
CHECKING EMAILS
Then the email has been sent:
| currentUser | | | |
| subject | some subject | | |
| html_body | some id | | |
| file | some file | PDF | 9000 |
ALLOWS TO FILTER EMAIL CONTENT
BY MULTIPLE FILEDS
61. EMAILS
CHECKING EMAILS - FILTERS
▸ currentUser - checks if email was sent to current logged user, requires integration with Kakunin User
Provider
▸ subject - allows to check email subject
▸ html_body - allows to check content of email
▸ file - allows to check attachments, it's type, name and size
ALL FILTERS SUPPORT MATCHERS
65. CONTENT VALIDATION
FORM VALIDATIONS
Then the error messages should be displayed:
| element | errorMessage |
| nameValidationMsg | This value should not be blank. |
| targetMarketSegmentValidationMsg | This value should not be blank. |
this.nameValidationMsg = $('.name .form__error');
66. CONTENT VALIDATION
VALIDATE ELEMENT CONTENT
Then there are "equal 1" "todos" elements
uses chai.js expectations
equal X
above X
between X Y
at least X
68. CONTENT VALIDATION
VALIDATE ELEMENT CONTENT
Then there are "equal 1" "todos" elements
this.todos = $$('ul li');
this.todos = element.all(by.css('ul li'));
69. CONTENT VALIDATION
VALIDATE ELEMENT CONTENT
Then there is element "myElement" with value "r:notEmpty"
Then there is element "myElement" with value "t:some text"
Then there is element "myElement" with value "f:isClickable"
73. CONTENT VALIDATION
VALIDATE ELEMENT CONTENT - DETAILED CHECK
Then there are "equal 1" following elements for element "todos":
| element | value |
| removeButton | f:isVisible |
REQUIRES LIST SELECTOR
CHILD ELEMENTS MUST BE LOCATORS, NOT ELEMENTS
74. CONTENT VALIDATION
this.todos = $$('ul li');
Then there are "equal 1" following elements for element "todos":
| element | value |
| removeButton | f:isVisible |
this.removeButton = by.css('.remove');
VALIDATE ELEMENT CONTENT - DETAILED CHECK
76. CONTENT VALIDATION
FILE DOWNLOAD
Then the file "fileName.extension" should be downloaded
downloaded file name, the same as the one normally have in browser