SlideShare a Scribd company logo
UI TestingUI Testing
Selenium? Rich-Clients? Containers?Selenium? Rich-Clients? Containers?
, /Tobias Schneck Loodse GmbH ConSol Software GmbH
How is Loodse?How is Loodse?
During the UI development phase ...During the UI development phase ...
Yeah - release 1.0 is out!Yeah - release 1.0 is out!
Writing first web UI tests!Writing first web UI tests!
Sahi OS Selenium TestCafe
First Selenium TestFirst Selenium Test
public class CitrusHtmSeleniumTest {
private static final String CITRUS_URL = "http://www.citrusframework.org/";
private WebDriver driver;
private CustomSeleniumDsl dsl;
@BeforeMethod
public void setUp() {
driver = new ChromeDriver();
dsl = new CustomSeleniumDsl((JavascriptExecutor) driver);
}
@Test
public void testCitrusHtmlContent() throws Exception {
driver.get(CITRUS_URL);
//find Heading
WebElement heading1 = driver.findElement(By.cssSelector("p.first"));
dsl.highlightElement(heading1);
assertEquals(heading1.getText(), "Citrus IntegrationnTesting");
assertTrue(heading1.isDisplayed());
//validate HTML content
WebElement heading2 = driver.findElement(By.tagName("h1"));
dsl.highlightElement(heading2);
assertEquals(heading2.getText(), "Integration challenge");
assertTrue(heading2.isDisplayed());
}
@AfterMethod
public void tearDown() { driver.close();}
}
Next stepNext step ??
Make this things perfect!Make this things perfect!
Rewrite all of our tests?Rewrite all of our tests?
Validate the documentation PDF?Validate the documentation PDF?
Test the rich-client implementation as well?Test the rich-client implementation as well?
Where to run the test?Where to run the test?
Keep current tests
Use same codebase
Keep it simple
ConceptConcept
Add Maven DependenciesAdd Maven Dependencies
<dependencies>
<!--- selenium and testNG dependency ... -->
<dependency>
<groupid>org.sakuli</groupid>
<artifactid>sakuli-selenium-setup</artifactid>
<version>1.3.0-247-sakuli-se-SNAPSHOT</version>
<scope>test</scope>
</dependency>
</dependencies>
<!-- ConSol Labs repository holds the Sakuli libraries-->
<repository>
<id>labs-consol</id>
<name>ConSol Labs Repository</name>
<url>http://labs.consol.de/maven/repository</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</repository>
<repository>
<id>labs-consol-snapshots</id>
<name>ConSol Labs Snapshot-Repository</name>
<url>http://labs.consol.de/maven/snapshots-repository</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</repository>
Use the Sakuli AnnotationsUse the Sakuli Annotations
@Listeners(SakuliSeTest.class)
public class BasicSakuliSeTest {
private static final String PDF_EDITOR_NAME = "masterpdfeditor4";
protected WebDriver driver;
protected Region screen;
protected Environment env;
protected SeTestCaseAction tcAction;
private Application pdfEditor;
@BeforeMethod
public void setUp() throws Exception {
driver = getSeleniumDriver();
screen = new Region();
env = new Environment();
tcAction = new SeTestCaseAction();
}
@AfterMethod(alwaysRun = true)
public void tearDown() throws Exception {
if (driver != null)
driver.close();
}
private Application openPDF(String pdfFilePath) {
return pdfEditor = new Application(PDF_EDITOR_NAME + " "" + pdfFilePath + """).open();
}
//....
}
Use the Sakuli AnnotationsUse the Sakuli Annotations
public class GitHubSakuliSeExampleTest extends AbstractSakuliSeTest {
private String SAKULI_URL = "https://github.com/ConSol/sakuli/blob/master/README.adoc";
@Test
@SakuliTestCase(additionalImagePaths = "/common_pics")
public void test1() throws Exception {
//your test code
driver.get(SAKULI_URL);
screen.highlight(5);
screen.find("sakuli_logo.png").highlight();
}
@Test
@SakuliTestCase(
testCaseName = "mysecondtest",
warningTime = 15, criticalTime = 25,
additionalImagePaths = "/common_pics")
public void test2() throws Exception {
//your test code
driver.get(SAKULI_URL);
screen.highlight(5);
screen.type(Key.END).find("github_logo.png").highlight();
}
}
Rewrite all of our tests?Rewrite all of our tests?
Validate the documentation PDF?Validate the documentation PDF?
Test the rich-client implementation as well?Test the rich-client implementation as well?
Where to run the test?Where to run the test?
Generate PDF file
Open it in a native PDF viewer
Validate the content
Test DefinitionTest Definition (Selenium only)(Selenium only)
@Test
@SakuliTestCase
public void testCitrusHtmlContent() throws Exception {
testCitrusContent("HTML");
//VALIDATE HTML content
WebElement heading = driver.findElement(
By.cssSelector("#citrus-framework--reference-documentation-"));
dsl.highlightElement(heading);
assertEquals(heading.getText(), "Citrus Framework - Reference Documentation");
assertTrue(heading.isDisplayed());
//VALIDATE PDF ???
}
public void testCitrusContent(String dest) throws Exception {
searchHeading();
WebElement docuLink = driver.findElement(By.partialLinkText("Documentation"));
dsl.highlightElement(docuLink);
assertTrue(docuLink.isDisplayed());
docuLink.click();
WebElement userGuideLink = driver.findElement(By.partialLinkText("User Guide"));
dsl.highlightElement(userGuideLink);
assertTrue(userGuideLink.isDisplayed());
userGuideLink.click();
WebElement htmlUserGuideLink = driver.findElement(By.partialLinkText(dest));
dsl.highlightElement(htmlUserGuideLink);
assertTrue(htmlUserGuideLink.isDisplayed());
htmlUserGuideLink.click();
}
Test DefinitionTest Definition (Selenium + Sakuli SE)(Selenium + Sakuli SE)
@Test
@SakuliTestCase(additionalImagePaths = "citrus_pics")
public void testCitrusPdfContent() throws Exception {
//opens PDF download page and click download
testCitrusContent("PDF");
screen.find("reload_button.png").highlight();
scroll( //search citrus logo on PDF
() -> screen.exists("pdf_citrus_title.png", 1),
//scroll action
() -> env.type(Key.DOWN).type(Key.DOWN).type(Key.DOWN).type(Key.DOWN),
//times to try
10
);
//navigate over bookmark menu of PDF viewer
screen.find("reload_button.png")
.below(40).highlight()
.mouseMove();
screen.find("bookmark_button.png").highlight().click();
screen.find("bookmark_entry.png").highlight().click();
screen.find("test_case_pdf_heading.png").highlight().click();
//scroll until the expected diagram is visible
scroll(() -> screen.exists("test_case_diagram.png", 1),
() -> env.type(Key.DOWN).type(Key.DOWN).type(Key.DOWN).type(Key.DOWN),
10
);
}
Using Java power for UI testing!Using Java power for UI testing!
//...
scroll( //search for logo
() -> screen.exists("citrus_fruit.png", 1),
//scroll action
() -> env.type(Key.DOWN).type(Key.DOWN).type(Key.DOWN).type(Key.DOWN),
//times to try
10
);
//...
public void scroll(Supplier<Region> check, Supplier doScroll, int times) throws SakuliException {
for (int i = 1; !Optional.ofNullable(check.get()).isPresent() && i <= times; i++) {
Logger.logInfo("Scroll page (" + i + ")");
doScroll.get();
}
Optional.ofNullable(check.get()).orElseThrow(() ->
new SakuliException("Cannot find region by scrooling!")).highlight();
}
Rewrite all of our tests?Rewrite all of our tests?
Validate the documentation PDF?Validate the documentation PDF?
Test the rich-client implementation as well?Test the rich-client implementation as well?
Where to run the test?Where to run the test?
Make an order at the web client
Trigger the reporting function in the rich client
Validate the reported count of produces orders
Control Web and Rich ClientsControl Web and Rich Clients
@Test
@SakuliTestCase
public void testWebOrderToReportClient() throws Exception {
driver.get(TEST_URL);
WebElement heading1 = driver.findElement(By.name("Cookie Bakery Application"));
assertTrue(heading1.isDisplayed());
WebElement order = driver.findElement(By.cssSelector("button blueberry-order"));
assertTrue(order.isDisplayed());
for (int i = 0; i < 20; i++) {
LOGGER.info("place blueberry order " + i);
order.click();
}
//open native client application over $PATH
reportClient = new Application("baker-report-client").open();
Region reportClientRegion = reportClient.getRegion();
//generate the report
reportClientRegion.type("r", Key.ALT); //type ALT + r to open the report view
reportClientRegion.find("get-daily-report-button").click();
reportClientRegion.waitForImage("report-header", 10);
try {
reportClientRegion.find("blueberry_muffin_logo");
reportClientRegion.find("report_blueberry")
.below(100)
.find("report_value_20");
} catch (Exception e) {
//useful for custom error messaten
throw new SakuliException("Validation of the report client failed"
+ " - no muffins produced?");
}
}
Rich Client Gnome EditorRich Client Gnome Editor
@Test
@SakuliTestCase(warningTime = 50, criticalTime = 60)
public void testEditorOpensReadMe() throws Exception {
checkEnvironment();
gedit.open();
// shows fluent API and how sub regions can be used
final Region geditAnchor = screen.waitForImage("gedit", 5)
.highlight()
.click();
// move focus mouse pointer
geditAnchor.below(100).highlight().mouseMove();
// use already known region
final Region otherDocument = geditAnchor
// great larger search region
.below(200).setW(300).highlight()
.waitForImage("search", 20).highlight()
.click()
.type("Hello Guys!")
// base region of "search" button grows 400px
.grow(400, 400).highlight(2)
.find("other_documents").highlight();
//...
}
Rewrite all of our tests?Rewrite all of our tests?
Validate the documentation PDF?Validate the documentation PDF?
Test the rich-client implementation as well?Test the rich-client implementation as well?
Where to run the test?Where to run the test?
Run all UI tests in the container
Make it scalable for parallel execution
Keep the possibility to "watch" the test
Should be triggered by the CI server
Use our internal private cloud infrastructure
We need a containerized UI!We need a containerized UI!
Based on: ConSol/docker-headless-vnc-container
Containers - the new VMs?Containers - the new VMs?
Let's try the Sakuli ContainerLet's try the Sakuli Container
# start the docker container
docker run -it -p 5911:5901 -p 6911:6901 consol/sakuli-ubuntu-xfce
docker run -it -p 5912:5901 -p 6912:6901 consol/sakuli-centos-xfce
docker run -it -p 5913:5901 -p 6913:6901 consol/sakuli-ubuntu-xfce-java
docker run -it -p 5914:5901 -p 6914:6901 consol/sakuli-centos-xfce-java
# start in parallel via docker-compose
# use docker-compos.yml from https://github.com/ConSol/sakuli/tree/master/docker
docker-compose up
Setup Selenium in DockerSetup Selenium in Docker
(Dockerfile)
FROM consol/sakuli-ubuntu-xfce-java:1.3.0-247-sakuli-se-SNAPSHOT
MAINTAINER Tobias Schneck "tobias.schneck@consol.de"
ENV REFRESHED_AT 2018-07-23
### Install gedit as test app
USER 0
RUN apt-get update 
&& apt-get install -y gedit 
&& apt-get clean -y
USER 1000
### Install webdriver
ENV WEB_DRIVER /headless/webdriver
#chrome
RUN mkdir $WEB_DRIVER && cd $WEB_DRIVER 
&& wget https://chromedriver.storage.googleapis.com/2.25/chromedriver_linux64.zip 
&& unzip *.zip && rm *.zip && ls -la
Build and start the container:
docker build -t local/sakuli-se . 
&& docker run -it -v $(pwd):/opt/maven --user $(id -u) -p 6911:6901 
local/sakuli-se mvn -P docker test
Define a repeatable Test SetupDefine a repeatable Test Setup
(e.g. Docker Compose)
version: '2'
services:
sakuli_se_test:
build: .
environment:
- TZ=Europe/Berlin
user: "1000"
volumes:
- .:/opt/maven
- data:/headless/.m2
network_mode: "bridge"
ports:
- 5911:5901
- 6911:6901
# to keep container running and login via `docker exec -it javaexample_sakuli_java_test_1 bash
# command: "'--tail-log'"
command: mvn clean test -P docker -f /opt/maven/pom.xml
volumes:
data:
driver: local
Build and start the container:
docker-compose up --build --force-recreate
Add tests to Kubernetes clusterAdd tests to Kubernetes cluster
(e.g. Skaffold)
apiVersion: skaffold/v1alpha2
kind: Config
build:
tagPolicy:
gitCommit: {}
artifacts:
- imageName: toschneck/sakuli-se-example
docker:
dockerfilePath: Dockerfile.skaffold
deploy:
kubectl:
manifests:
- ./kubernetes-manifests/**.yaml
Build and create Kubernetes Job:
# local (dev stage)
skaffold dev
# remote (deployment stage)
skaffold run
Rewrite all of our tests?Rewrite all of our tests?
Validate the documentation PDF?Validate the documentation PDF?
Test the rich-client implementation as well?Test the rich-client implementation as well?
Where to run the test?Where to run the test?
WhyWhy
Support different web testing providers:
Sahi OS
Selenium
... more should follow
Combines DOM access and native screen recognition
OpenSource
no vendor lock in and easy to extend
Ready-to-use Docker images
Cloud-ready: Kubernetes & OpenShift
Monitoring IntegrationMonitoring Integration
Nagios OMD Incinga Check_MK
CI Pipeline with JenkinsCI Pipeline with Jenkins
Test Management UITest Management UI
Comfortable writing and management of test suites
Direct test execution with integrated live view and logs
Extended reports for easy error detection
Video
What's next?What's next?
Implement Junit 5 test runner
Web UI to handle Sakuli test suites
JavaScript
Java
Headless execution
Linux: VNC & Docker
Windows: only Terminalserver
Video recording of the test execution (error documentation)
LinksLinks
ConSol/sakuli
ConSol/sakuli-examples
ConSol/sakuli-examples/java-selenium-example
Sakuli Showroom
sakuli@consol.de @sakuli_e2e
Thank you!Thank you!
Tobias Schneck
Loodse GmbH
Fuhlsbüttler Straße 405
D-22307 Hamburg
tobi@loodse.com
@toschneck toschneck
info@loodse.com
www.loodse.com
@Loodse Loodse

More Related Content

What's hot (19)

PDF
Testing Web Applications
Seth McLaughlin
 
PDF
Automated User Tests with Apache Flex
Gert Poppe
 
PPTX
Protractor framework – how to make stable e2e tests for Angular applications
Ludmila Nesvitiy
 
PDF
Android Design Patterns
Godfrey Nolan
 
PDF
Springを用いた社内ライブラリ開発
Recruit Lifestyle Co., Ltd.
 
PDF
PVS-Studio Is Now in Chocolatey: Checking Chocolatey under Azure DevOps
Andrey Karpov
 
PDF
Advanced Selenium Workshop
Clever Moe
 
PDF
淺談 Groovy 與 AWS 雲端應用開發整合
Kyle Lin
 
PDF
PHP Unit Testing in Yii
IlPeach
 
PDF
Automated User Tests with Apache Flex
Gert Poppe
 
PDF
Integration Testing With ScalaTest and MongoDB
Michal Bigos
 
PDF
San Jose Selenium Meet-up PushToTest TestMaker Presentation
Clever Moe
 
PDF
JS and patterns
David Rodenas
 
PDF
JavaFX8 TestFX - CDI
Sven Ruppert
 
PDF
Phone gap 12 things you should know
ISOCHK
 
PPTX
Selenium Automation in Java Using HttpWatch Plug-in
Sandeep Tol
 
PDF
Using HttpWatch Plug-in with Selenium Automation in Java
Sandeep Tol
 
PPTX
Codeception
少東 張
 
PPTX
The Screenplay Pattern: Better Interactions for Better Automation
Applitools
 
Testing Web Applications
Seth McLaughlin
 
Automated User Tests with Apache Flex
Gert Poppe
 
Protractor framework – how to make stable e2e tests for Angular applications
Ludmila Nesvitiy
 
Android Design Patterns
Godfrey Nolan
 
Springを用いた社内ライブラリ開発
Recruit Lifestyle Co., Ltd.
 
PVS-Studio Is Now in Chocolatey: Checking Chocolatey under Azure DevOps
Andrey Karpov
 
Advanced Selenium Workshop
Clever Moe
 
淺談 Groovy 與 AWS 雲端應用開發整合
Kyle Lin
 
PHP Unit Testing in Yii
IlPeach
 
Automated User Tests with Apache Flex
Gert Poppe
 
Integration Testing With ScalaTest and MongoDB
Michal Bigos
 
San Jose Selenium Meet-up PushToTest TestMaker Presentation
Clever Moe
 
JS and patterns
David Rodenas
 
JavaFX8 TestFX - CDI
Sven Ruppert
 
Phone gap 12 things you should know
ISOCHK
 
Selenium Automation in Java Using HttpWatch Plug-in
Sandeep Tol
 
Using HttpWatch Plug-in with Selenium Automation in Java
Sandeep Tol
 
Codeception
少東 張
 
The Screenplay Pattern: Better Interactions for Better Automation
Applitools
 

Similar to UI Testing - Selenium? Rich-Clients? Containers? (SwanseaCon 2018) (20)

PDF
Testing - Selenium? Rich-Clients? Containers?
Tobias Schneck
 
PDF
Web UI test automation instruments
Artem Nagornyi
 
PPT
Selenium
husnara mohammad
 
PDF
Selenium With Spices
Nikolajs Okunevs
 
PPTX
Mastering Test Automation: How To Use Selenium Successfully
SpringPeople
 
PPT
Selenium testing - Handle Elements in WebDriver
Vibrant Technologies & Computers
 
ZIP
Browser-Based testing using Selenium
ret0
 
PPTX
UI Testing Automation - Alex Kalinovsky - CreamTec LLC
Jim Lane
 
PDF
Top100summit 谷歌-scott-improve your automated web application testing
drewz lin
 
PPTX
Selenium
abiramimaya
 
PPTX
Automated Testing on Web Applications
Samuel Borg
 
PDF
Selenide
DataArt
 
PPT
selenium.ppt
rajnexient
 
PPT
selenium.ppt
AmenSheikh
 
PPT
selenium.ppt
ssuser7b4894
 
PPTX
4&5.pptx SOFTWARE TESTING UNIT-4 AND UNIT-5
hemasubbu08
 
PPT
Selenium
Sun Technlogies
 
PPTX
Automated ui-testing
Slobodan Lohja
 
PDF
Designing keyword and Data Driven Automation framework with Selenium
Edureka!
 
PDF
Tellurium.A.New.Approach.For.Web.Testing.V5
John.Jian.Fang
 
Testing - Selenium? Rich-Clients? Containers?
Tobias Schneck
 
Web UI test automation instruments
Artem Nagornyi
 
Selenium With Spices
Nikolajs Okunevs
 
Mastering Test Automation: How To Use Selenium Successfully
SpringPeople
 
Selenium testing - Handle Elements in WebDriver
Vibrant Technologies & Computers
 
Browser-Based testing using Selenium
ret0
 
UI Testing Automation - Alex Kalinovsky - CreamTec LLC
Jim Lane
 
Top100summit 谷歌-scott-improve your automated web application testing
drewz lin
 
Selenium
abiramimaya
 
Automated Testing on Web Applications
Samuel Borg
 
Selenide
DataArt
 
selenium.ppt
rajnexient
 
selenium.ppt
AmenSheikh
 
selenium.ppt
ssuser7b4894
 
4&5.pptx SOFTWARE TESTING UNIT-4 AND UNIT-5
hemasubbu08
 
Selenium
Sun Technlogies
 
Automated ui-testing
Slobodan Lohja
 
Designing keyword and Data Driven Automation framework with Selenium
Edureka!
 
Tellurium.A.New.Approach.For.Web.Testing.V5
John.Jian.Fang
 
Ad

More from Tobias Schneck (20)

PDF
Evaluating Global Load Balancing Options for Kubernetes in Practice (Kubermat...
Tobias Schneck
 
PDF
Kubernetes and AI - Beauty and the Beast - Tobias Schneck - DOAG 24 NUE - 20....
Tobias Schneck
 
PDF
Containers & AI - Beauty and the Beast !?! @MLCon - 27.6.2024
Tobias Schneck
 
PDF
Containers & AI - Beauty and the Beast!?!
Tobias Schneck
 
PDF
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Tobias Schneck
 
PDF
Kubernetes in the Manufacturing Line @KubeCon EU Valencia 2022
Tobias Schneck
 
PDF
$ kubectl hacking @DevOpsCon Berlin 2019
Tobias Schneck
 
PDF
Will ARM be the new Mainstream in our Data Centers? @Rejekts Paris 2024
Tobias Schneck
 
PDF
Kubermatic How to Migrate 100 Clusters from On-Prem to Google Cloud Without D...
Tobias Schneck
 
PDF
ClusterAPI Overview - Managing multi-cloud Kubernetes Clusters - k8s Meetup@v...
Tobias Schneck
 
PDF
Creating Kubernetes multi clusters with ClusterAPI @ Stuttgart Kubernetes Meetup
Tobias Schneck
 
PDF
KubeCI - Cloud Native Continuous Delivery for Kubernetes
Tobias Schneck
 
PDF
Kubernetes Cluster API - managing the infrastructure of multi clusters (k8s ...
Tobias Schneck
 
PDF
Creating Kubernetes multi clusters with ClusterAPI in the Hetzner Cloud
Tobias Schneck
 
PDF
OpenShift Build Pipelines @ Lightweight Java User Group Meetup
Tobias Schneck
 
PDF
OpenShift-Build-Pipelines: Build -> Test -> Run! @JavaForumStuttgart
Tobias Schneck
 
PDF
OpenShift-Build-Pipelines: Build ► Test ► Run!
Tobias Schneck
 
PDF
Kotlin for backend development (Hackaburg 2018 Regensburg)
Tobias Schneck
 
PDF
Continuous Testing: Integration- und UI-Testing mit OpenShift-Build-Pipelines
Tobias Schneck
 
PDF
OOP2017: Containerized End-2-End Testing – automate it!
Tobias Schneck
 
Evaluating Global Load Balancing Options for Kubernetes in Practice (Kubermat...
Tobias Schneck
 
Kubernetes and AI - Beauty and the Beast - Tobias Schneck - DOAG 24 NUE - 20....
Tobias Schneck
 
Containers & AI - Beauty and the Beast !?! @MLCon - 27.6.2024
Tobias Schneck
 
Containers & AI - Beauty and the Beast!?!
Tobias Schneck
 
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Tobias Schneck
 
Kubernetes in the Manufacturing Line @KubeCon EU Valencia 2022
Tobias Schneck
 
$ kubectl hacking @DevOpsCon Berlin 2019
Tobias Schneck
 
Will ARM be the new Mainstream in our Data Centers? @Rejekts Paris 2024
Tobias Schneck
 
Kubermatic How to Migrate 100 Clusters from On-Prem to Google Cloud Without D...
Tobias Schneck
 
ClusterAPI Overview - Managing multi-cloud Kubernetes Clusters - k8s Meetup@v...
Tobias Schneck
 
Creating Kubernetes multi clusters with ClusterAPI @ Stuttgart Kubernetes Meetup
Tobias Schneck
 
KubeCI - Cloud Native Continuous Delivery for Kubernetes
Tobias Schneck
 
Kubernetes Cluster API - managing the infrastructure of multi clusters (k8s ...
Tobias Schneck
 
Creating Kubernetes multi clusters with ClusterAPI in the Hetzner Cloud
Tobias Schneck
 
OpenShift Build Pipelines @ Lightweight Java User Group Meetup
Tobias Schneck
 
OpenShift-Build-Pipelines: Build -> Test -> Run! @JavaForumStuttgart
Tobias Schneck
 
OpenShift-Build-Pipelines: Build ► Test ► Run!
Tobias Schneck
 
Kotlin for backend development (Hackaburg 2018 Regensburg)
Tobias Schneck
 
Continuous Testing: Integration- und UI-Testing mit OpenShift-Build-Pipelines
Tobias Schneck
 
OOP2017: Containerized End-2-End Testing – automate it!
Tobias Schneck
 
Ad

Recently uploaded (20)

PDF
Wondershare PDFelement Pro Crack for MacOS New Version Latest 2025
bashirkhan333g
 
PDF
How to Hire AI Developers_ Step-by-Step Guide in 2025.pdf
DianApps Technologies
 
PPTX
Change Common Properties in IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
PDF
Generic or Specific? Making sensible software design decisions
Bert Jan Schrijver
 
PDF
The 5 Reasons for IT Maintenance - Arna Softech
Arna Softech
 
PPTX
Home Care Tools: Benefits, features and more
Third Rock Techkno
 
PDF
Build It, Buy It, or Already Got It? Make Smarter Martech Decisions
bbedford2
 
PDF
Dipole Tech Innovations – Global IT Solutions for Business Growth
dipoletechi3
 
PDF
IObit Driver Booster Pro 12.4.0.585 Crack Free Download
henryc1122g
 
PPTX
Build a Custom Agent for Agentic Testing.pptx
klpathrudu
 
PDF
NEW-Viral>Wondershare Filmora 14.5.18.12900 Crack Free
sherryg1122g
 
PDF
Top Agile Project Management Tools for Teams in 2025
Orangescrum
 
PPTX
Agentic Automation Journey Session 1/5: Context Grounding and Autopilot for E...
klpathrudu
 
PDF
Open Chain Q2 Steering Committee Meeting - 2025-06-25
Shane Coughlan
 
PDF
SciPy 2025 - Packaging a Scientific Python Project
Henry Schreiner
 
PDF
MiniTool Power Data Recovery 8.8 With Crack New Latest 2025
bashirkhan333g
 
PDF
Simplify React app login with asgardeo-sdk
vaibhav289687
 
PDF
Everything you need to know about pricing & licensing Microsoft 365 Copilot f...
Q-Advise
 
PDF
ERP Consulting Services and Solutions by Contetra Pvt Ltd
jayjani123
 
PDF
TheFutureIsDynamic-BoxLang witch Luis Majano.pdf
Ortus Solutions, Corp
 
Wondershare PDFelement Pro Crack for MacOS New Version Latest 2025
bashirkhan333g
 
How to Hire AI Developers_ Step-by-Step Guide in 2025.pdf
DianApps Technologies
 
Change Common Properties in IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
Generic or Specific? Making sensible software design decisions
Bert Jan Schrijver
 
The 5 Reasons for IT Maintenance - Arna Softech
Arna Softech
 
Home Care Tools: Benefits, features and more
Third Rock Techkno
 
Build It, Buy It, or Already Got It? Make Smarter Martech Decisions
bbedford2
 
Dipole Tech Innovations – Global IT Solutions for Business Growth
dipoletechi3
 
IObit Driver Booster Pro 12.4.0.585 Crack Free Download
henryc1122g
 
Build a Custom Agent for Agentic Testing.pptx
klpathrudu
 
NEW-Viral>Wondershare Filmora 14.5.18.12900 Crack Free
sherryg1122g
 
Top Agile Project Management Tools for Teams in 2025
Orangescrum
 
Agentic Automation Journey Session 1/5: Context Grounding and Autopilot for E...
klpathrudu
 
Open Chain Q2 Steering Committee Meeting - 2025-06-25
Shane Coughlan
 
SciPy 2025 - Packaging a Scientific Python Project
Henry Schreiner
 
MiniTool Power Data Recovery 8.8 With Crack New Latest 2025
bashirkhan333g
 
Simplify React app login with asgardeo-sdk
vaibhav289687
 
Everything you need to know about pricing & licensing Microsoft 365 Copilot f...
Q-Advise
 
ERP Consulting Services and Solutions by Contetra Pvt Ltd
jayjani123
 
TheFutureIsDynamic-BoxLang witch Luis Majano.pdf
Ortus Solutions, Corp
 

UI Testing - Selenium? Rich-Clients? Containers? (SwanseaCon 2018)

  • 1. UI TestingUI Testing Selenium? Rich-Clients? Containers?Selenium? Rich-Clients? Containers? , /Tobias Schneck Loodse GmbH ConSol Software GmbH
  • 2. How is Loodse?How is Loodse?
  • 3. During the UI development phase ...During the UI development phase ...
  • 4. Yeah - release 1.0 is out!Yeah - release 1.0 is out!
  • 5. Writing first web UI tests!Writing first web UI tests! Sahi OS Selenium TestCafe
  • 6. First Selenium TestFirst Selenium Test public class CitrusHtmSeleniumTest { private static final String CITRUS_URL = "http://www.citrusframework.org/"; private WebDriver driver; private CustomSeleniumDsl dsl; @BeforeMethod public void setUp() { driver = new ChromeDriver(); dsl = new CustomSeleniumDsl((JavascriptExecutor) driver); } @Test public void testCitrusHtmlContent() throws Exception { driver.get(CITRUS_URL); //find Heading WebElement heading1 = driver.findElement(By.cssSelector("p.first")); dsl.highlightElement(heading1); assertEquals(heading1.getText(), "Citrus IntegrationnTesting"); assertTrue(heading1.isDisplayed()); //validate HTML content WebElement heading2 = driver.findElement(By.tagName("h1")); dsl.highlightElement(heading2); assertEquals(heading2.getText(), "Integration challenge"); assertTrue(heading2.isDisplayed()); } @AfterMethod public void tearDown() { driver.close();} }
  • 7. Next stepNext step ?? Make this things perfect!Make this things perfect!
  • 8. Rewrite all of our tests?Rewrite all of our tests? Validate the documentation PDF?Validate the documentation PDF? Test the rich-client implementation as well?Test the rich-client implementation as well? Where to run the test?Where to run the test?
  • 9. Keep current tests Use same codebase Keep it simple
  • 11. Add Maven DependenciesAdd Maven Dependencies <dependencies> <!--- selenium and testNG dependency ... --> <dependency> <groupid>org.sakuli</groupid> <artifactid>sakuli-selenium-setup</artifactid> <version>1.3.0-247-sakuli-se-SNAPSHOT</version> <scope>test</scope> </dependency> </dependencies> <!-- ConSol Labs repository holds the Sakuli libraries--> <repository> <id>labs-consol</id> <name>ConSol Labs Repository</name> <url>http://labs.consol.de/maven/repository</url> <snapshots> <enabled>false</enabled> </snapshots> <releases> <enabled>true</enabled> </releases> </repository> <repository> <id>labs-consol-snapshots</id> <name>ConSol Labs Snapshot-Repository</name> <url>http://labs.consol.de/maven/snapshots-repository</url> <snapshots> <enabled>true</enabled> </snapshots> <releases> <enabled>true</enabled> </releases> </repository>
  • 12. Use the Sakuli AnnotationsUse the Sakuli Annotations @Listeners(SakuliSeTest.class) public class BasicSakuliSeTest { private static final String PDF_EDITOR_NAME = "masterpdfeditor4"; protected WebDriver driver; protected Region screen; protected Environment env; protected SeTestCaseAction tcAction; private Application pdfEditor; @BeforeMethod public void setUp() throws Exception { driver = getSeleniumDriver(); screen = new Region(); env = new Environment(); tcAction = new SeTestCaseAction(); } @AfterMethod(alwaysRun = true) public void tearDown() throws Exception { if (driver != null) driver.close(); } private Application openPDF(String pdfFilePath) { return pdfEditor = new Application(PDF_EDITOR_NAME + " "" + pdfFilePath + """).open(); } //.... }
  • 13. Use the Sakuli AnnotationsUse the Sakuli Annotations public class GitHubSakuliSeExampleTest extends AbstractSakuliSeTest { private String SAKULI_URL = "https://github.com/ConSol/sakuli/blob/master/README.adoc"; @Test @SakuliTestCase(additionalImagePaths = "/common_pics") public void test1() throws Exception { //your test code driver.get(SAKULI_URL); screen.highlight(5); screen.find("sakuli_logo.png").highlight(); } @Test @SakuliTestCase( testCaseName = "mysecondtest", warningTime = 15, criticalTime = 25, additionalImagePaths = "/common_pics") public void test2() throws Exception { //your test code driver.get(SAKULI_URL); screen.highlight(5); screen.type(Key.END).find("github_logo.png").highlight(); } }
  • 14. Rewrite all of our tests?Rewrite all of our tests? Validate the documentation PDF?Validate the documentation PDF? Test the rich-client implementation as well?Test the rich-client implementation as well? Where to run the test?Where to run the test?
  • 15. Generate PDF file Open it in a native PDF viewer Validate the content
  • 16. Test DefinitionTest Definition (Selenium only)(Selenium only) @Test @SakuliTestCase public void testCitrusHtmlContent() throws Exception { testCitrusContent("HTML"); //VALIDATE HTML content WebElement heading = driver.findElement( By.cssSelector("#citrus-framework--reference-documentation-")); dsl.highlightElement(heading); assertEquals(heading.getText(), "Citrus Framework - Reference Documentation"); assertTrue(heading.isDisplayed()); //VALIDATE PDF ??? } public void testCitrusContent(String dest) throws Exception { searchHeading(); WebElement docuLink = driver.findElement(By.partialLinkText("Documentation")); dsl.highlightElement(docuLink); assertTrue(docuLink.isDisplayed()); docuLink.click(); WebElement userGuideLink = driver.findElement(By.partialLinkText("User Guide")); dsl.highlightElement(userGuideLink); assertTrue(userGuideLink.isDisplayed()); userGuideLink.click(); WebElement htmlUserGuideLink = driver.findElement(By.partialLinkText(dest)); dsl.highlightElement(htmlUserGuideLink); assertTrue(htmlUserGuideLink.isDisplayed()); htmlUserGuideLink.click(); }
  • 17. Test DefinitionTest Definition (Selenium + Sakuli SE)(Selenium + Sakuli SE) @Test @SakuliTestCase(additionalImagePaths = "citrus_pics") public void testCitrusPdfContent() throws Exception { //opens PDF download page and click download testCitrusContent("PDF"); screen.find("reload_button.png").highlight(); scroll( //search citrus logo on PDF () -> screen.exists("pdf_citrus_title.png", 1), //scroll action () -> env.type(Key.DOWN).type(Key.DOWN).type(Key.DOWN).type(Key.DOWN), //times to try 10 ); //navigate over bookmark menu of PDF viewer screen.find("reload_button.png") .below(40).highlight() .mouseMove(); screen.find("bookmark_button.png").highlight().click(); screen.find("bookmark_entry.png").highlight().click(); screen.find("test_case_pdf_heading.png").highlight().click(); //scroll until the expected diagram is visible scroll(() -> screen.exists("test_case_diagram.png", 1), () -> env.type(Key.DOWN).type(Key.DOWN).type(Key.DOWN).type(Key.DOWN), 10 ); }
  • 18. Using Java power for UI testing!Using Java power for UI testing! //... scroll( //search for logo () -> screen.exists("citrus_fruit.png", 1), //scroll action () -> env.type(Key.DOWN).type(Key.DOWN).type(Key.DOWN).type(Key.DOWN), //times to try 10 ); //... public void scroll(Supplier<Region> check, Supplier doScroll, int times) throws SakuliException { for (int i = 1; !Optional.ofNullable(check.get()).isPresent() && i <= times; i++) { Logger.logInfo("Scroll page (" + i + ")"); doScroll.get(); } Optional.ofNullable(check.get()).orElseThrow(() -> new SakuliException("Cannot find region by scrooling!")).highlight(); }
  • 19. Rewrite all of our tests?Rewrite all of our tests? Validate the documentation PDF?Validate the documentation PDF? Test the rich-client implementation as well?Test the rich-client implementation as well? Where to run the test?Where to run the test?
  • 20. Make an order at the web client Trigger the reporting function in the rich client Validate the reported count of produces orders
  • 21. Control Web and Rich ClientsControl Web and Rich Clients @Test @SakuliTestCase public void testWebOrderToReportClient() throws Exception { driver.get(TEST_URL); WebElement heading1 = driver.findElement(By.name("Cookie Bakery Application")); assertTrue(heading1.isDisplayed()); WebElement order = driver.findElement(By.cssSelector("button blueberry-order")); assertTrue(order.isDisplayed()); for (int i = 0; i < 20; i++) { LOGGER.info("place blueberry order " + i); order.click(); } //open native client application over $PATH reportClient = new Application("baker-report-client").open(); Region reportClientRegion = reportClient.getRegion(); //generate the report reportClientRegion.type("r", Key.ALT); //type ALT + r to open the report view reportClientRegion.find("get-daily-report-button").click(); reportClientRegion.waitForImage("report-header", 10); try { reportClientRegion.find("blueberry_muffin_logo"); reportClientRegion.find("report_blueberry") .below(100) .find("report_value_20"); } catch (Exception e) { //useful for custom error messaten throw new SakuliException("Validation of the report client failed" + " - no muffins produced?"); } }
  • 22. Rich Client Gnome EditorRich Client Gnome Editor @Test @SakuliTestCase(warningTime = 50, criticalTime = 60) public void testEditorOpensReadMe() throws Exception { checkEnvironment(); gedit.open(); // shows fluent API and how sub regions can be used final Region geditAnchor = screen.waitForImage("gedit", 5) .highlight() .click(); // move focus mouse pointer geditAnchor.below(100).highlight().mouseMove(); // use already known region final Region otherDocument = geditAnchor // great larger search region .below(200).setW(300).highlight() .waitForImage("search", 20).highlight() .click() .type("Hello Guys!") // base region of "search" button grows 400px .grow(400, 400).highlight(2) .find("other_documents").highlight(); //... }
  • 23. Rewrite all of our tests?Rewrite all of our tests? Validate the documentation PDF?Validate the documentation PDF? Test the rich-client implementation as well?Test the rich-client implementation as well? Where to run the test?Where to run the test?
  • 24. Run all UI tests in the container Make it scalable for parallel execution Keep the possibility to "watch" the test Should be triggered by the CI server Use our internal private cloud infrastructure
  • 25. We need a containerized UI!We need a containerized UI! Based on: ConSol/docker-headless-vnc-container
  • 26. Containers - the new VMs?Containers - the new VMs?
  • 27. Let's try the Sakuli ContainerLet's try the Sakuli Container # start the docker container docker run -it -p 5911:5901 -p 6911:6901 consol/sakuli-ubuntu-xfce docker run -it -p 5912:5901 -p 6912:6901 consol/sakuli-centos-xfce docker run -it -p 5913:5901 -p 6913:6901 consol/sakuli-ubuntu-xfce-java docker run -it -p 5914:5901 -p 6914:6901 consol/sakuli-centos-xfce-java # start in parallel via docker-compose # use docker-compos.yml from https://github.com/ConSol/sakuli/tree/master/docker docker-compose up
  • 28. Setup Selenium in DockerSetup Selenium in Docker (Dockerfile) FROM consol/sakuli-ubuntu-xfce-java:1.3.0-247-sakuli-se-SNAPSHOT MAINTAINER Tobias Schneck "[email protected]" ENV REFRESHED_AT 2018-07-23 ### Install gedit as test app USER 0 RUN apt-get update && apt-get install -y gedit && apt-get clean -y USER 1000 ### Install webdriver ENV WEB_DRIVER /headless/webdriver #chrome RUN mkdir $WEB_DRIVER && cd $WEB_DRIVER && wget https://chromedriver.storage.googleapis.com/2.25/chromedriver_linux64.zip && unzip *.zip && rm *.zip && ls -la Build and start the container: docker build -t local/sakuli-se . && docker run -it -v $(pwd):/opt/maven --user $(id -u) -p 6911:6901 local/sakuli-se mvn -P docker test
  • 29. Define a repeatable Test SetupDefine a repeatable Test Setup (e.g. Docker Compose) version: '2' services: sakuli_se_test: build: . environment: - TZ=Europe/Berlin user: "1000" volumes: - .:/opt/maven - data:/headless/.m2 network_mode: "bridge" ports: - 5911:5901 - 6911:6901 # to keep container running and login via `docker exec -it javaexample_sakuli_java_test_1 bash # command: "'--tail-log'" command: mvn clean test -P docker -f /opt/maven/pom.xml volumes: data: driver: local Build and start the container: docker-compose up --build --force-recreate
  • 30. Add tests to Kubernetes clusterAdd tests to Kubernetes cluster (e.g. Skaffold) apiVersion: skaffold/v1alpha2 kind: Config build: tagPolicy: gitCommit: {} artifacts: - imageName: toschneck/sakuli-se-example docker: dockerfilePath: Dockerfile.skaffold deploy: kubectl: manifests: - ./kubernetes-manifests/**.yaml Build and create Kubernetes Job: # local (dev stage) skaffold dev # remote (deployment stage) skaffold run
  • 31. Rewrite all of our tests?Rewrite all of our tests? Validate the documentation PDF?Validate the documentation PDF? Test the rich-client implementation as well?Test the rich-client implementation as well? Where to run the test?Where to run the test?
  • 32. WhyWhy Support different web testing providers: Sahi OS Selenium ... more should follow Combines DOM access and native screen recognition OpenSource no vendor lock in and easy to extend Ready-to-use Docker images Cloud-ready: Kubernetes & OpenShift
  • 34. CI Pipeline with JenkinsCI Pipeline with Jenkins
  • 35. Test Management UITest Management UI Comfortable writing and management of test suites Direct test execution with integrated live view and logs Extended reports for easy error detection Video
  • 36. What's next?What's next? Implement Junit 5 test runner Web UI to handle Sakuli test suites JavaScript Java Headless execution Linux: VNC & Docker Windows: only Terminalserver Video recording of the test execution (error documentation)
  • 38. Thank you!Thank you! Tobias Schneck Loodse GmbH Fuhlsbüttler Straße 405 D-22307 Hamburg [email protected] @toschneck toschneck [email protected] www.loodse.com @Loodse Loodse