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

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

What's hot (19)

Testing Web Applications
Testing Web ApplicationsTesting Web Applications
Testing Web Applications
 
Automated User Tests with Apache Flex
Automated User Tests with Apache FlexAutomated User Tests with Apache Flex
Automated User Tests with Apache Flex
 
Protractor framework – how to make stable e2e tests for Angular applications
Protractor framework – how to make stable e2e tests for Angular applicationsProtractor framework – how to make stable e2e tests for Angular applications
Protractor framework – how to make stable e2e tests for Angular applications
 
Android Design Patterns
Android Design PatternsAndroid Design Patterns
Android Design Patterns
 
Springを用いた社内ライブラリ開発
Springを用いた社内ライブラリ開発Springを用いた社内ライブラリ開発
Springを用いた社内ライブラリ開発
 
PVS-Studio Is Now in Chocolatey: Checking Chocolatey under Azure DevOps
PVS-Studio Is Now in Chocolatey: Checking Chocolatey under Azure DevOpsPVS-Studio Is Now in Chocolatey: Checking Chocolatey under Azure DevOps
PVS-Studio Is Now in Chocolatey: Checking Chocolatey under Azure DevOps
 
Advanced Selenium Workshop
Advanced Selenium WorkshopAdvanced Selenium Workshop
Advanced Selenium Workshop
 
淺談 Groovy 與 AWS 雲端應用開發整合
淺談 Groovy 與 AWS 雲端應用開發整合淺談 Groovy 與 AWS 雲端應用開發整合
淺談 Groovy 與 AWS 雲端應用開發整合
 
PHP Unit Testing in Yii
PHP Unit Testing in YiiPHP Unit Testing in Yii
PHP Unit Testing in Yii
 
Automated User Tests with Apache Flex
Automated User Tests with Apache FlexAutomated User Tests with Apache Flex
Automated User Tests with Apache Flex
 
Integration Testing With ScalaTest and MongoDB
Integration Testing With ScalaTest and MongoDBIntegration Testing With ScalaTest and MongoDB
Integration Testing With ScalaTest and MongoDB
 
San Jose Selenium Meet-up PushToTest TestMaker Presentation
San Jose Selenium Meet-up PushToTest TestMaker PresentationSan Jose Selenium Meet-up PushToTest TestMaker Presentation
San Jose Selenium Meet-up PushToTest TestMaker Presentation
 
JS and patterns
JS and patternsJS and patterns
JS and patterns
 
JavaFX8 TestFX - CDI
JavaFX8   TestFX - CDIJavaFX8   TestFX - CDI
JavaFX8 TestFX - CDI
 
Phone gap 12 things you should know
Phone gap 12 things you should knowPhone gap 12 things you should know
Phone gap 12 things you should know
 
Selenium Automation in Java Using HttpWatch Plug-in
 Selenium Automation in Java Using HttpWatch Plug-in  Selenium Automation in Java Using HttpWatch Plug-in
Selenium Automation in Java Using HttpWatch Plug-in
 
Using HttpWatch Plug-in with Selenium Automation in Java
Using HttpWatch Plug-in with Selenium Automation in JavaUsing HttpWatch Plug-in with Selenium Automation in Java
Using HttpWatch Plug-in with Selenium Automation in Java
 
Codeception
CodeceptionCodeception
Codeception
 
The Screenplay Pattern: Better Interactions for Better Automation
The Screenplay Pattern: Better Interactions for Better AutomationThe Screenplay Pattern: Better Interactions for Better Automation
The Screenplay Pattern: Better Interactions for Better Automation
 

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

探討Web ui自動化測試工具
探討Web ui自動化測試工具探討Web ui自動化測試工具
探討Web ui自動化測試工具
政億 林
 
Automated acceptance test
Automated acceptance testAutomated acceptance test
Automated acceptance test
Bryan Liu
 
Testing Your Application On Google App Engine
Testing Your Application On Google App EngineTesting Your Application On Google App Engine
Testing Your Application On Google App Engine
IndicThreads
 
Testing your application on Google App Engine
Testing your application on Google App EngineTesting your application on Google App Engine
Testing your application on Google App Engine
Inphina Technologies
 
OWASP ZAP Workshop for QA Testers
OWASP ZAP Workshop for QA TestersOWASP ZAP Workshop for QA Testers
OWASP ZAP Workshop for QA Testers
Javan Rasokat
 
Web UI test automation instruments
Web UI test automation instrumentsWeb UI test automation instruments
Web UI test automation instruments
Artem Nagornyi
 
Integration tests: use the containers, Luke!
Integration tests: use the containers, Luke!Integration tests: use the containers, Luke!
Integration tests: use the containers, Luke!
Roberto Franchini
 
Good practices for debugging Selenium and Appium tests
Good practices for debugging Selenium and Appium testsGood practices for debugging Selenium and Appium tests
Good practices for debugging Selenium and Appium tests
Abhijeet Vaikar
 
End to-end testing from rookie to pro
End to-end testing  from rookie to proEnd to-end testing  from rookie to pro
End to-end testing from rookie to pro
Domenico Gemoli
 
Selenium Testing Training in Bangalore
Selenium Testing Training in BangaloreSelenium Testing Training in Bangalore
Selenium Testing Training in Bangalore
rajkamal560066
 
Heuristics to scale your framework
Heuristics to scale your frameworkHeuristics to scale your framework
Heuristics to scale your framework
vodQA
 
Testing - Selenium? Rich-Clients? Containers?
Testing - Selenium? Rich-Clients? Containers?Testing - Selenium? Rich-Clients? Containers?
Testing - Selenium? Rich-Clients? Containers?
Tobias Schneck
 
2013 10-10 selenium presentation to ocjug
2013 10-10 selenium presentation to ocjug2013 10-10 selenium presentation to ocjug
2013 10-10 selenium presentation to ocjugPhilip Schlesinger
 
UI Testing Automation - Alex Kalinovsky - CreamTec LLC
UI Testing Automation - Alex Kalinovsky - CreamTec LLCUI Testing Automation - Alex Kalinovsky - CreamTec LLC
UI Testing Automation - Alex Kalinovsky - CreamTec LLC
Jim Lane
 
Javascript first-class citizenery
Javascript first-class citizeneryJavascript first-class citizenery
Javascript first-class citizenery
toddbr
 
JCConf 2016 - Dataflow Workshop Labs
JCConf 2016 - Dataflow Workshop LabsJCConf 2016 - Dataflow Workshop Labs
JCConf 2016 - Dataflow Workshop Labs
Simon Su
 
Android UI Testing with Appium
Android UI Testing with AppiumAndroid UI Testing with Appium
Android UI Testing with Appium
Luke Maung
 
Get Started With Selenium 3 and Selenium 3 Grid
Get Started With Selenium 3 and Selenium 3 GridGet Started With Selenium 3 and Selenium 3 Grid
Get Started With Selenium 3 and Selenium 3 Grid
Daniel Herken
 
Testing ASP.NET - Progressive.NET
Testing ASP.NET - Progressive.NETTesting ASP.NET - Progressive.NET
Testing ASP.NET - Progressive.NET
Ben Hall
 
Automated Testing using JavaScript
Automated Testing using JavaScriptAutomated Testing using JavaScript
Automated Testing using JavaScript
Simon Guest
 

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

探討Web ui自動化測試工具
探討Web ui自動化測試工具探討Web ui自動化測試工具
探討Web ui自動化測試工具
 
Automated acceptance test
Automated acceptance testAutomated acceptance test
Automated acceptance test
 
Testing Your Application On Google App Engine
Testing Your Application On Google App EngineTesting Your Application On Google App Engine
Testing Your Application On Google App Engine
 
Testing your application on Google App Engine
Testing your application on Google App EngineTesting your application on Google App Engine
Testing your application on Google App Engine
 
OWASP ZAP Workshop for QA Testers
OWASP ZAP Workshop for QA TestersOWASP ZAP Workshop for QA Testers
OWASP ZAP Workshop for QA Testers
 
Web UI test automation instruments
Web UI test automation instrumentsWeb UI test automation instruments
Web UI test automation instruments
 
Integration tests: use the containers, Luke!
Integration tests: use the containers, Luke!Integration tests: use the containers, Luke!
Integration tests: use the containers, Luke!
 
Good practices for debugging Selenium and Appium tests
Good practices for debugging Selenium and Appium testsGood practices for debugging Selenium and Appium tests
Good practices for debugging Selenium and Appium tests
 
End to-end testing from rookie to pro
End to-end testing  from rookie to proEnd to-end testing  from rookie to pro
End to-end testing from rookie to pro
 
Selenium Testing Training in Bangalore
Selenium Testing Training in BangaloreSelenium Testing Training in Bangalore
Selenium Testing Training in Bangalore
 
Heuristics to scale your framework
Heuristics to scale your frameworkHeuristics to scale your framework
Heuristics to scale your framework
 
Testing - Selenium? Rich-Clients? Containers?
Testing - Selenium? Rich-Clients? Containers?Testing - Selenium? Rich-Clients? Containers?
Testing - Selenium? Rich-Clients? Containers?
 
2013 10-10 selenium presentation to ocjug
2013 10-10 selenium presentation to ocjug2013 10-10 selenium presentation to ocjug
2013 10-10 selenium presentation to ocjug
 
UI Testing Automation - Alex Kalinovsky - CreamTec LLC
UI Testing Automation - Alex Kalinovsky - CreamTec LLCUI Testing Automation - Alex Kalinovsky - CreamTec LLC
UI Testing Automation - Alex Kalinovsky - CreamTec LLC
 
Javascript first-class citizenery
Javascript first-class citizeneryJavascript first-class citizenery
Javascript first-class citizenery
 
JCConf 2016 - Dataflow Workshop Labs
JCConf 2016 - Dataflow Workshop LabsJCConf 2016 - Dataflow Workshop Labs
JCConf 2016 - Dataflow Workshop Labs
 
Android UI Testing with Appium
Android UI Testing with AppiumAndroid UI Testing with Appium
Android UI Testing with Appium
 
Get Started With Selenium 3 and Selenium 3 Grid
Get Started With Selenium 3 and Selenium 3 GridGet Started With Selenium 3 and Selenium 3 Grid
Get Started With Selenium 3 and Selenium 3 Grid
 
Testing ASP.NET - Progressive.NET
Testing ASP.NET - Progressive.NETTesting ASP.NET - Progressive.NET
Testing ASP.NET - Progressive.NET
 
Automated Testing using JavaScript
Automated Testing using JavaScriptAutomated Testing using JavaScript
Automated Testing using JavaScript
 

More from Tobias Schneck

Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Tobias Schneck
 
Kubernetes in the Manufacturing Line @KubeCon EU Valencia 2022
Kubernetes in the Manufacturing Line  @KubeCon EU Valencia 2022 Kubernetes in the Manufacturing Line  @KubeCon EU Valencia 2022
Kubernetes in the Manufacturing Line @KubeCon EU Valencia 2022
Tobias Schneck
 
$ kubectl hacking @DevOpsCon Berlin 2019
$ kubectl hacking @DevOpsCon Berlin 2019$ kubectl hacking @DevOpsCon Berlin 2019
$ kubectl hacking @DevOpsCon Berlin 2019
Tobias Schneck
 
Will ARM be the new Mainstream in our Data Centers? @Rejekts Paris 2024
 Will ARM be the new Mainstream in our Data Centers? @Rejekts Paris 2024 Will ARM be the new Mainstream in our Data Centers? @Rejekts Paris 2024
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...
Kubermatic How to Migrate 100 Clusters from On-Prem to Google Cloud Without D...Kubermatic How to Migrate 100 Clusters from On-Prem to Google Cloud Without D...
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...
ClusterAPI Overview - Managing multi-cloud Kubernetes Clusters - k8s Meetup@v...ClusterAPI Overview - Managing multi-cloud Kubernetes Clusters - k8s Meetup@v...
ClusterAPI Overview - Managing multi-cloud Kubernetes Clusters - k8s Meetup@v...
Tobias Schneck
 
Creating Kubernetes multi clusters with ClusterAPI @ Stuttgart Kubernetes Meetup
Creating Kubernetes multi clusters with ClusterAPI @ Stuttgart Kubernetes MeetupCreating Kubernetes multi clusters with ClusterAPI @ Stuttgart Kubernetes Meetup
Creating Kubernetes multi clusters with ClusterAPI @ Stuttgart Kubernetes Meetup
Tobias Schneck
 
KubeCI - Cloud Native Continuous Delivery for Kubernetes
KubeCI - Cloud Native Continuous Delivery for KubernetesKubeCI - Cloud Native Continuous Delivery for Kubernetes
KubeCI - Cloud Native Continuous Delivery for Kubernetes
Tobias Schneck
 
Kubernetes Cluster API - managing the infrastructure of multi clusters (k8s ...
Kubernetes Cluster API - managing the infrastructure of  multi clusters (k8s ...Kubernetes Cluster API - managing the infrastructure of  multi clusters (k8s ...
Kubernetes Cluster API - managing the infrastructure of multi clusters (k8s ...
Tobias Schneck
 
Creating Kubernetes multi clusters with ClusterAPI in the Hetzner Cloud
Creating Kubernetes multi clusters with ClusterAPI in the Hetzner CloudCreating Kubernetes multi clusters with ClusterAPI in the Hetzner Cloud
Creating Kubernetes multi clusters with ClusterAPI in the Hetzner Cloud
Tobias Schneck
 
OpenShift Build Pipelines @ Lightweight Java User Group Meetup
OpenShift Build Pipelines @ Lightweight Java User Group MeetupOpenShift Build Pipelines @ Lightweight Java User Group Meetup
OpenShift Build Pipelines @ Lightweight Java User Group Meetup
Tobias Schneck
 
OpenShift-Build-Pipelines: Build -> Test -> Run! @JavaForumStuttgart
OpenShift-Build-Pipelines: Build -> Test -> Run! @JavaForumStuttgartOpenShift-Build-Pipelines: Build -> Test -> Run! @JavaForumStuttgart
OpenShift-Build-Pipelines: Build -> Test -> Run! @JavaForumStuttgart
Tobias Schneck
 
OpenShift-Build-Pipelines: Build ► Test ► Run!
OpenShift-Build-Pipelines: Build ► Test ► Run!OpenShift-Build-Pipelines: Build ► Test ► Run!
OpenShift-Build-Pipelines: Build ► Test ► Run!
Tobias Schneck
 
Kotlin for backend development (Hackaburg 2018 Regensburg)
Kotlin for backend development (Hackaburg 2018 Regensburg)Kotlin for backend development (Hackaburg 2018 Regensburg)
Kotlin for backend development (Hackaburg 2018 Regensburg)
Tobias Schneck
 
Continuous Testing: Integration- und UI-Testing mit OpenShift-Build-Pipelines
Continuous Testing: Integration- und UI-Testing mit OpenShift-Build-PipelinesContinuous Testing: Integration- und UI-Testing mit OpenShift-Build-Pipelines
Continuous Testing: Integration- und UI-Testing mit OpenShift-Build-Pipelines
Tobias Schneck
 
OOP2017: Containerized End-2-End Testing – automate it!
OOP2017: Containerized End-2-End Testing – automate it!OOP2017: Containerized End-2-End Testing – automate it!
OOP2017: Containerized End-2-End Testing – automate it!
Tobias Schneck
 
Containerized End-2-End Testing - Agile Testing Meetup at Süddeutsche Zeitung...
Containerized End-2-End Testing - Agile Testing Meetup at Süddeutsche Zeitung...Containerized End-2-End Testing - Agile Testing Meetup at Süddeutsche Zeitung...
Containerized End-2-End Testing - Agile Testing Meetup at Süddeutsche Zeitung...
Tobias Schneck
 
Containerized End-2-End-Testing - ContainerConf Mannheim
Containerized End-2-End-Testing - ContainerConf MannheimContainerized End-2-End-Testing - ContainerConf Mannheim
Containerized End-2-End-Testing - ContainerConf Mannheim
Tobias Schneck
 
Containerized End-2-End-Testing - Software-QS-Tag (deutsch)
Containerized End-2-End-Testing - Software-QS-Tag (deutsch)Containerized End-2-End-Testing - Software-QS-Tag (deutsch)
Containerized End-2-End-Testing - Software-QS-Tag (deutsch)
Tobias Schneck
 
Containerized End-2-End Testing - JUG Saxony Day
Containerized End-2-End Testing - JUG Saxony DayContainerized End-2-End Testing - JUG Saxony Day
Containerized End-2-End Testing - JUG Saxony Day
Tobias Schneck
 

More from Tobias Schneck (20)

Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
 
Kubernetes in the Manufacturing Line @KubeCon EU Valencia 2022
Kubernetes in the Manufacturing Line  @KubeCon EU Valencia 2022 Kubernetes in the Manufacturing Line  @KubeCon EU Valencia 2022
Kubernetes in the Manufacturing Line @KubeCon EU Valencia 2022
 
$ kubectl hacking @DevOpsCon Berlin 2019
$ kubectl hacking @DevOpsCon Berlin 2019$ kubectl hacking @DevOpsCon Berlin 2019
$ kubectl hacking @DevOpsCon Berlin 2019
 
Will ARM be the new Mainstream in our Data Centers? @Rejekts Paris 2024
 Will ARM be the new Mainstream in our Data Centers? @Rejekts Paris 2024 Will ARM be the new Mainstream in our Data Centers? @Rejekts Paris 2024
Will ARM be the new Mainstream in our Data Centers? @Rejekts Paris 2024
 
Kubermatic How to Migrate 100 Clusters from On-Prem to Google Cloud Without D...
Kubermatic How to Migrate 100 Clusters from On-Prem to Google Cloud Without D...Kubermatic How to Migrate 100 Clusters from On-Prem to Google Cloud Without D...
Kubermatic How to Migrate 100 Clusters from On-Prem to Google Cloud Without D...
 
ClusterAPI Overview - Managing multi-cloud Kubernetes Clusters - k8s Meetup@v...
ClusterAPI Overview - Managing multi-cloud Kubernetes Clusters - k8s Meetup@v...ClusterAPI Overview - Managing multi-cloud Kubernetes Clusters - k8s Meetup@v...
ClusterAPI Overview - Managing multi-cloud Kubernetes Clusters - k8s Meetup@v...
 
Creating Kubernetes multi clusters with ClusterAPI @ Stuttgart Kubernetes Meetup
Creating Kubernetes multi clusters with ClusterAPI @ Stuttgart Kubernetes MeetupCreating Kubernetes multi clusters with ClusterAPI @ Stuttgart Kubernetes Meetup
Creating Kubernetes multi clusters with ClusterAPI @ Stuttgart Kubernetes Meetup
 
KubeCI - Cloud Native Continuous Delivery for Kubernetes
KubeCI - Cloud Native Continuous Delivery for KubernetesKubeCI - Cloud Native Continuous Delivery for Kubernetes
KubeCI - Cloud Native Continuous Delivery for Kubernetes
 
Kubernetes Cluster API - managing the infrastructure of multi clusters (k8s ...
Kubernetes Cluster API - managing the infrastructure of  multi clusters (k8s ...Kubernetes Cluster API - managing the infrastructure of  multi clusters (k8s ...
Kubernetes Cluster API - managing the infrastructure of multi clusters (k8s ...
 
Creating Kubernetes multi clusters with ClusterAPI in the Hetzner Cloud
Creating Kubernetes multi clusters with ClusterAPI in the Hetzner CloudCreating Kubernetes multi clusters with ClusterAPI in the Hetzner Cloud
Creating Kubernetes multi clusters with ClusterAPI in the Hetzner Cloud
 
OpenShift Build Pipelines @ Lightweight Java User Group Meetup
OpenShift Build Pipelines @ Lightweight Java User Group MeetupOpenShift Build Pipelines @ Lightweight Java User Group Meetup
OpenShift Build Pipelines @ Lightweight Java User Group Meetup
 
OpenShift-Build-Pipelines: Build -> Test -> Run! @JavaForumStuttgart
OpenShift-Build-Pipelines: Build -> Test -> Run! @JavaForumStuttgartOpenShift-Build-Pipelines: Build -> Test -> Run! @JavaForumStuttgart
OpenShift-Build-Pipelines: Build -> Test -> Run! @JavaForumStuttgart
 
OpenShift-Build-Pipelines: Build ► Test ► Run!
OpenShift-Build-Pipelines: Build ► Test ► Run!OpenShift-Build-Pipelines: Build ► Test ► Run!
OpenShift-Build-Pipelines: Build ► Test ► Run!
 
Kotlin for backend development (Hackaburg 2018 Regensburg)
Kotlin for backend development (Hackaburg 2018 Regensburg)Kotlin for backend development (Hackaburg 2018 Regensburg)
Kotlin for backend development (Hackaburg 2018 Regensburg)
 
Continuous Testing: Integration- und UI-Testing mit OpenShift-Build-Pipelines
Continuous Testing: Integration- und UI-Testing mit OpenShift-Build-PipelinesContinuous Testing: Integration- und UI-Testing mit OpenShift-Build-Pipelines
Continuous Testing: Integration- und UI-Testing mit OpenShift-Build-Pipelines
 
OOP2017: Containerized End-2-End Testing – automate it!
OOP2017: Containerized End-2-End Testing – automate it!OOP2017: Containerized End-2-End Testing – automate it!
OOP2017: Containerized End-2-End Testing – automate it!
 
Containerized End-2-End Testing - Agile Testing Meetup at Süddeutsche Zeitung...
Containerized End-2-End Testing - Agile Testing Meetup at Süddeutsche Zeitung...Containerized End-2-End Testing - Agile Testing Meetup at Süddeutsche Zeitung...
Containerized End-2-End Testing - Agile Testing Meetup at Süddeutsche Zeitung...
 
Containerized End-2-End-Testing - ContainerConf Mannheim
Containerized End-2-End-Testing - ContainerConf MannheimContainerized End-2-End-Testing - ContainerConf Mannheim
Containerized End-2-End-Testing - ContainerConf Mannheim
 
Containerized End-2-End-Testing - Software-QS-Tag (deutsch)
Containerized End-2-End-Testing - Software-QS-Tag (deutsch)Containerized End-2-End-Testing - Software-QS-Tag (deutsch)
Containerized End-2-End-Testing - Software-QS-Tag (deutsch)
 
Containerized End-2-End Testing - JUG Saxony Day
Containerized End-2-End Testing - JUG Saxony DayContainerized End-2-End Testing - JUG Saxony Day
Containerized End-2-End Testing - JUG Saxony Day
 

Recently uploaded

Navigating the Metaverse: A Journey into Virtual Evolution"
Navigating the Metaverse: A Journey into Virtual Evolution"Navigating the Metaverse: A Journey into Virtual Evolution"
Navigating the Metaverse: A Journey into Virtual Evolution"
Donna Lenk
 
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoamOpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
takuyayamamoto1800
 
Cracking the code review at SpringIO 2024
Cracking the code review at SpringIO 2024Cracking the code review at SpringIO 2024
Cracking the code review at SpringIO 2024
Paco van Beckhoven
 
A Comprehensive Look at Generative AI in Retail App Testing.pdf
A Comprehensive Look at Generative AI in Retail App Testing.pdfA Comprehensive Look at Generative AI in Retail App Testing.pdf
A Comprehensive Look at Generative AI in Retail App Testing.pdf
kalichargn70th171
 
Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024
Globus
 
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
informapgpstrackings
 
Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024
Globus
 
Prosigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology SolutionsProsigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology Solutions
Prosigns
 
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptx
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptxTop Features to Include in Your Winzo Clone App for Business Growth (4).pptx
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptx
rickgrimesss22
 
RISE with SAP and Journey to the Intelligent Enterprise
RISE with SAP and Journey to the Intelligent EnterpriseRISE with SAP and Journey to the Intelligent Enterprise
RISE with SAP and Journey to the Intelligent Enterprise
Srikant77
 
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Globus
 
Into the Box 2024 - Keynote Day 2 Slides.pdf
Into the Box 2024 - Keynote Day 2 Slides.pdfInto the Box 2024 - Keynote Day 2 Slides.pdf
Into the Box 2024 - Keynote Day 2 Slides.pdf
Ortus Solutions, Corp
 
Quarkus Hidden and Forbidden Extensions
Quarkus Hidden and Forbidden ExtensionsQuarkus Hidden and Forbidden Extensions
Quarkus Hidden and Forbidden Extensions
Max Andersen
 
Beyond Event Sourcing - Embracing CRUD for Wix Platform - Java.IL
Beyond Event Sourcing - Embracing CRUD for Wix Platform - Java.ILBeyond Event Sourcing - Embracing CRUD for Wix Platform - Java.IL
Beyond Event Sourcing - Embracing CRUD for Wix Platform - Java.IL
Natan Silnitsky
 
Providing Globus Services to Users of JASMIN for Environmental Data Analysis
Providing Globus Services to Users of JASMIN for Environmental Data AnalysisProviding Globus Services to Users of JASMIN for Environmental Data Analysis
Providing Globus Services to Users of JASMIN for Environmental Data Analysis
Globus
 
Enhancing Research Orchestration Capabilities at ORNL.pdf
Enhancing Research Orchestration Capabilities at ORNL.pdfEnhancing Research Orchestration Capabilities at ORNL.pdf
Enhancing Research Orchestration Capabilities at ORNL.pdf
Globus
 
Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604
Fermin Galan
 
How Recreation Management Software Can Streamline Your Operations.pptx
How Recreation Management Software Can Streamline Your Operations.pptxHow Recreation Management Software Can Streamline Your Operations.pptx
How Recreation Management Software Can Streamline Your Operations.pptx
wottaspaceseo
 
Graphic Design Crash Course for beginners
Graphic Design Crash Course for beginnersGraphic Design Crash Course for beginners
Graphic Design Crash Course for beginners
e20449
 
BoxLang: Review our Visionary Licenses of 2024
BoxLang: Review our Visionary Licenses of 2024BoxLang: Review our Visionary Licenses of 2024
BoxLang: Review our Visionary Licenses of 2024
Ortus Solutions, Corp
 

Recently uploaded (20)

Navigating the Metaverse: A Journey into Virtual Evolution"
Navigating the Metaverse: A Journey into Virtual Evolution"Navigating the Metaverse: A Journey into Virtual Evolution"
Navigating the Metaverse: A Journey into Virtual Evolution"
 
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoamOpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
 
Cracking the code review at SpringIO 2024
Cracking the code review at SpringIO 2024Cracking the code review at SpringIO 2024
Cracking the code review at SpringIO 2024
 
A Comprehensive Look at Generative AI in Retail App Testing.pdf
A Comprehensive Look at Generative AI in Retail App Testing.pdfA Comprehensive Look at Generative AI in Retail App Testing.pdf
A Comprehensive Look at Generative AI in Retail App Testing.pdf
 
Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024
 
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
 
Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024
 
Prosigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology SolutionsProsigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology Solutions
 
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptx
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptxTop Features to Include in Your Winzo Clone App for Business Growth (4).pptx
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptx
 
RISE with SAP and Journey to the Intelligent Enterprise
RISE with SAP and Journey to the Intelligent EnterpriseRISE with SAP and Journey to the Intelligent Enterprise
RISE with SAP and Journey to the Intelligent Enterprise
 
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
 
Into the Box 2024 - Keynote Day 2 Slides.pdf
Into the Box 2024 - Keynote Day 2 Slides.pdfInto the Box 2024 - Keynote Day 2 Slides.pdf
Into the Box 2024 - Keynote Day 2 Slides.pdf
 
Quarkus Hidden and Forbidden Extensions
Quarkus Hidden and Forbidden ExtensionsQuarkus Hidden and Forbidden Extensions
Quarkus Hidden and Forbidden Extensions
 
Beyond Event Sourcing - Embracing CRUD for Wix Platform - Java.IL
Beyond Event Sourcing - Embracing CRUD for Wix Platform - Java.ILBeyond Event Sourcing - Embracing CRUD for Wix Platform - Java.IL
Beyond Event Sourcing - Embracing CRUD for Wix Platform - Java.IL
 
Providing Globus Services to Users of JASMIN for Environmental Data Analysis
Providing Globus Services to Users of JASMIN for Environmental Data AnalysisProviding Globus Services to Users of JASMIN for Environmental Data Analysis
Providing Globus Services to Users of JASMIN for Environmental Data Analysis
 
Enhancing Research Orchestration Capabilities at ORNL.pdf
Enhancing Research Orchestration Capabilities at ORNL.pdfEnhancing Research Orchestration Capabilities at ORNL.pdf
Enhancing Research Orchestration Capabilities at ORNL.pdf
 
Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604
 
How Recreation Management Software Can Streamline Your Operations.pptx
How Recreation Management Software Can Streamline Your Operations.pptxHow Recreation Management Software Can Streamline Your Operations.pptx
How Recreation Management Software Can Streamline Your Operations.pptx
 
Graphic Design Crash Course for beginners
Graphic Design Crash Course for beginnersGraphic Design Crash Course for beginners
Graphic Design Crash Course for beginners
 
BoxLang: Review our Visionary Licenses of 2024
BoxLang: Review our Visionary Licenses of 2024BoxLang: Review our Visionary Licenses of 2024
BoxLang: Review our Visionary Licenses of 2024
 

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 "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
  • 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 tobi@loodse.com @toschneck toschneck info@loodse.com www.loodse.com @Loodse Loodse