SlideShare ist ein Scribd-Unternehmen logo
1 von 38
Downloaden Sie, um offline zu lesen
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

Weitere ähnliche Inhalte

Was ist angesagt?

Testing Web Applications
Testing Web ApplicationsTesting Web Applications
Testing Web ApplicationsSeth McLaughlin
 
Automated User Tests with Apache Flex
Automated User Tests with Apache FlexAutomated User Tests with Apache Flex
Automated User Tests with Apache FlexGert 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 applicationsLudmila Nesvitiy
 
Android Design Patterns
Android Design PatternsAndroid Design Patterns
Android Design PatternsGodfrey Nolan
 
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 DevOpsAndrey Karpov
 
Advanced Selenium Workshop
Advanced Selenium WorkshopAdvanced Selenium Workshop
Advanced Selenium WorkshopClever 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 YiiIlPeach
 
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 MongoDBMichal 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 PresentationClever Moe
 
JavaFX8 TestFX - CDI
JavaFX8   TestFX - CDIJavaFX8   TestFX - CDI
JavaFX8 TestFX - CDISven 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 knowISOCHK
 
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 JavaSandeep 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 AutomationApplitools
 

Was ist angesagt? (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
 

Ähnlich wie 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 testBryan 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 EngineIndicThreads
 
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 EngineInphina Technologies
 
OWASP ZAP Workshop for QA Testers
OWASP ZAP Workshop for QA TestersOWASP ZAP Workshop for QA Testers
OWASP ZAP Workshop for QA TestersJavan Rasokat
 
Web UI test automation instruments
Web UI test automation instrumentsWeb UI test automation instruments
Web UI test automation instrumentsArtem 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 testsAbhijeet 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 proDomenico Gemoli
 
Selenium Testing Training in Bangalore
Selenium Testing Training in BangaloreSelenium Testing Training in Bangalore
Selenium Testing Training in Bangalorerajkamal560066
 
Heuristics to scale your framework
Heuristics to scale your frameworkHeuristics to scale your framework
Heuristics to scale your frameworkvodQA
 
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 LLCJim Lane
 
Javascript first-class citizenery
Javascript first-class citizeneryJavascript first-class citizenery
Javascript first-class citizenerytoddbr
 
JCConf 2016 - Dataflow Workshop Labs
JCConf 2016 - Dataflow Workshop LabsJCConf 2016 - Dataflow Workshop Labs
JCConf 2016 - Dataflow Workshop LabsSimon Su
 
Android UI Testing with Appium
Android UI Testing with AppiumAndroid UI Testing with Appium
Android UI Testing with AppiumLuke 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 GridDaniel Herken
 
Testing ASP.NET - Progressive.NET
Testing ASP.NET - Progressive.NETTesting ASP.NET - Progressive.NET
Testing ASP.NET - Progressive.NETBen Hall
 
Automated Testing using JavaScript
Automated Testing using JavaScriptAutomated Testing using JavaScript
Automated Testing using JavaScriptSimon Guest
 

Ähnlich wie 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
 

Mehr von Tobias Schneck

ARM Talk @ Rejekts - Will ARM be the new Mainstream in our Data Centers_.pdf
ARM Talk @ Rejekts - Will ARM be the new Mainstream in our Data Centers_.pdfARM Talk @ Rejekts - Will ARM be the new Mainstream in our Data Centers_.pdf
ARM Talk @ Rejekts - Will ARM be the new Mainstream in our Data Centers_.pdfTobias 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 MeetupTobias 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 KubernetesTobias 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 CloudTobias 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 MeetupTobias 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! @JavaForumStuttgartTobias 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-PipelinesTobias 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 MannheimTobias 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 DayTobias Schneck
 
Skale your test environment! Containerized End-2-End-Testing @Herbstcampus Nü...
Skale your test environment! Containerized End-2-End-Testing @Herbstcampus Nü...Skale your test environment! Containerized End-2-End-Testing @Herbstcampus Nü...
Skale your test environment! Containerized End-2-End-Testing @Herbstcampus Nü...Tobias Schneck
 
Containerized End-2-End-Testing - Tobias Schneck
Containerized End-2-End-Testing - Tobias SchneckContainerized End-2-End-Testing - Tobias Schneck
Containerized End-2-End-Testing - Tobias SchneckTobias Schneck
 

Mehr von Tobias Schneck (19)

ARM Talk @ Rejekts - Will ARM be the new Mainstream in our Data Centers_.pdf
ARM Talk @ Rejekts - Will ARM be the new Mainstream in our Data Centers_.pdfARM Talk @ Rejekts - Will ARM be the new Mainstream in our Data Centers_.pdf
ARM Talk @ Rejekts - Will ARM be the new Mainstream in our Data Centers_.pdf
 
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
 
Skale your test environment! Containerized End-2-End-Testing @Herbstcampus Nü...
Skale your test environment! Containerized End-2-End-Testing @Herbstcampus Nü...Skale your test environment! Containerized End-2-End-Testing @Herbstcampus Nü...
Skale your test environment! Containerized End-2-End-Testing @Herbstcampus Nü...
 
Containerized End-2-End-Testing - Tobias Schneck
Containerized End-2-End-Testing - Tobias SchneckContainerized End-2-End-Testing - Tobias Schneck
Containerized End-2-End-Testing - Tobias Schneck
 

Kürzlich hochgeladen

%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...masabamasaba
 
WSO2CON 2024 - Does Open Source Still Matter?
WSO2CON 2024 - Does Open Source Still Matter?WSO2CON 2024 - Does Open Source Still Matter?
WSO2CON 2024 - Does Open Source Still Matter?WSO2
 
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...masabamasaba
 
%in Soweto+277-882-255-28 abortion pills for sale in soweto
%in Soweto+277-882-255-28 abortion pills for sale in soweto%in Soweto+277-882-255-28 abortion pills for sale in soweto
%in Soweto+277-882-255-28 abortion pills for sale in sowetomasabamasaba
 
%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrandmasabamasaba
 
%in Benoni+277-882-255-28 abortion pills for sale in Benoni
%in Benoni+277-882-255-28 abortion pills for sale in Benoni%in Benoni+277-882-255-28 abortion pills for sale in Benoni
%in Benoni+277-882-255-28 abortion pills for sale in Benonimasabamasaba
 
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...WSO2
 
BUS PASS MANGEMENT SYSTEM USING PHP.pptx
BUS PASS MANGEMENT SYSTEM USING PHP.pptxBUS PASS MANGEMENT SYSTEM USING PHP.pptx
BUS PASS MANGEMENT SYSTEM USING PHP.pptxalwaysnagaraju26
 
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...WSO2
 
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...masabamasaba
 
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...WSO2
 
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...WSO2
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisamasabamasaba
 
tonesoftg
tonesoftgtonesoftg
tonesoftglanshi9
 
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...SelfMade bd
 
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...WSO2
 
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...chiefasafspells
 
WSO2Con2024 - Hello Choreo Presentation - Kanchana
WSO2Con2024 - Hello Choreo Presentation - KanchanaWSO2Con2024 - Hello Choreo Presentation - Kanchana
WSO2Con2024 - Hello Choreo Presentation - KanchanaWSO2
 
Announcing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareAnnouncing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareJim McKeeth
 
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024VictoriaMetrics
 

Kürzlich hochgeladen (20)

%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
 
WSO2CON 2024 - Does Open Source Still Matter?
WSO2CON 2024 - Does Open Source Still Matter?WSO2CON 2024 - Does Open Source Still Matter?
WSO2CON 2024 - Does Open Source Still Matter?
 
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
 
%in Soweto+277-882-255-28 abortion pills for sale in soweto
%in Soweto+277-882-255-28 abortion pills for sale in soweto%in Soweto+277-882-255-28 abortion pills for sale in soweto
%in Soweto+277-882-255-28 abortion pills for sale in soweto
 
%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand
 
%in Benoni+277-882-255-28 abortion pills for sale in Benoni
%in Benoni+277-882-255-28 abortion pills for sale in Benoni%in Benoni+277-882-255-28 abortion pills for sale in Benoni
%in Benoni+277-882-255-28 abortion pills for sale in Benoni
 
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
 
BUS PASS MANGEMENT SYSTEM USING PHP.pptx
BUS PASS MANGEMENT SYSTEM USING PHP.pptxBUS PASS MANGEMENT SYSTEM USING PHP.pptx
BUS PASS MANGEMENT SYSTEM USING PHP.pptx
 
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
 
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
 
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
 
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
tonesoftg
tonesoftgtonesoftg
tonesoftg
 
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
 
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
 
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
 
WSO2Con2024 - Hello Choreo Presentation - Kanchana
WSO2Con2024 - Hello Choreo Presentation - KanchanaWSO2Con2024 - Hello Choreo Presentation - Kanchana
WSO2Con2024 - Hello Choreo Presentation - Kanchana
 
Announcing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareAnnouncing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK Software
 
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 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