Showing preview only (3,501K chars total). Download the full file or copy to clipboard to get everything.
Repository: in28minutes/automation-testing-with-java-and-selenium
Branch: master
Commit: 412028b98522
Files: 237
Total size: 3.3 MB
Directory structure:
gitextract_p7fzfj5_/
├── .gitignore
├── README.md
├── code.md
├── html-basics/
│ ├── 1-first-html.html
│ ├── 2-second-html.html
│ ├── 3-tables.html
│ ├── 4-miscellaneous.html
│ ├── 5-nesting-and-more.html
│ ├── 6-form.html
│ ├── 7-form-with-css.html
│ ├── 8-form-with-external-css.html
│ ├── 9-id-and-class.html
│ └── style.css
├── java-selenium-code.md
├── junit-basics/
│ ├── pom.xml
│ └── src/
│ └── test/
│ └── java/
│ └── com/
│ ├── example/
│ │ └── tests/
│ │ ├── FacebookLogin.java
│ │ ├── FacebookLoginDummy.java
│ │ └── GoogleSearchForIn28minutes.java
│ └── in28minutes/
│ └── tests/
│ ├── FirstJUnitTest.java
│ └── FirstSeleniumJUnitTest.java
├── selenium-ide/
│ ├── FirstKatalonStudioProject.html
│ ├── FirstKatalonStudioProject_files/
│ │ └── css
│ └── FirstSeleniumIDEProject.side
├── testng-basics/
│ ├── pom.xml
│ ├── src/
│ │ └── test/
│ │ └── java/
│ │ └── com/
│ │ ├── example/
│ │ │ └── tests/
│ │ │ ├── FacebookLogin.java
│ │ │ └── GoogleSearchForIn28minutes.java
│ │ └── in28minutes/
│ │ └── test/
│ │ └── testng/
│ │ ├── FirstSeleniumTestNgTest.java
│ │ ├── FirstTestngTest.java
│ │ └── MultipleBrowserTest.java
│ └── testng.xml
├── todo-web-application/
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── in28minutes/
│ │ │ └── springboot/
│ │ │ └── web/
│ │ │ ├── SpringBootFirstWebApplication.java
│ │ │ ├── controller/
│ │ │ │ ├── ErrorController.java
│ │ │ │ ├── FileUploadController.java
│ │ │ │ ├── LoginController.java
│ │ │ │ ├── LogoutController.java
│ │ │ │ ├── TodoController.java
│ │ │ │ └── WelcomeController.java
│ │ │ ├── model/
│ │ │ │ └── Todo.java
│ │ │ └── service/
│ │ │ ├── LoginService.java
│ │ │ ├── TodoRepository.java
│ │ │ └── TodoService.java
│ │ ├── resources/
│ │ │ ├── application.properties
│ │ │ ├── data.sql
│ │ │ └── static/
│ │ │ ├── .gitignore
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── bower.json
│ │ │ ├── data/
│ │ │ │ ├── flot-data.js
│ │ │ │ └── morris-data.js
│ │ │ ├── dist/
│ │ │ │ ├── css/
│ │ │ │ │ └── sb-admin-2.css
│ │ │ │ └── js/
│ │ │ │ └── sb-admin-2.js
│ │ │ ├── gulpfile.js
│ │ │ ├── index.html
│ │ │ ├── js/
│ │ │ │ └── sb-admin-2.js
│ │ │ ├── less/
│ │ │ │ ├── mixins.less
│ │ │ │ ├── sb-admin-2.less
│ │ │ │ └── variables.less
│ │ │ ├── package.json
│ │ │ ├── pages/
│ │ │ │ ├── blank.html
│ │ │ │ ├── buttons.html
│ │ │ │ ├── file-upload.html
│ │ │ │ ├── flot.html
│ │ │ │ ├── forms.html
│ │ │ │ ├── frames-example-left.html
│ │ │ │ ├── frames-example-right.html
│ │ │ │ ├── frames-example.html
│ │ │ │ ├── grid.html
│ │ │ │ ├── icons.html
│ │ │ │ ├── index.html
│ │ │ │ ├── login.html
│ │ │ │ ├── morris.html
│ │ │ │ ├── notifications.html
│ │ │ │ ├── panels-wells.html
│ │ │ │ ├── sortable.html
│ │ │ │ ├── tables.html
│ │ │ │ └── typography.html
│ │ │ └── vendor/
│ │ │ ├── bootstrap/
│ │ │ │ ├── css/
│ │ │ │ │ └── bootstrap.css
│ │ │ │ └── js/
│ │ │ │ └── bootstrap.js
│ │ │ ├── bootstrap-social/
│ │ │ │ ├── bootstrap-social.css
│ │ │ │ ├── bootstrap-social.less
│ │ │ │ └── bootstrap-social.scss
│ │ │ ├── datatables/
│ │ │ │ ├── css/
│ │ │ │ │ ├── dataTables.bootstrap.css
│ │ │ │ │ ├── dataTables.bootstrap4.css
│ │ │ │ │ ├── dataTables.foundation.css
│ │ │ │ │ ├── dataTables.jqueryui.css
│ │ │ │ │ ├── dataTables.material.css
│ │ │ │ │ ├── dataTables.semanticui.css
│ │ │ │ │ ├── dataTables.uikit.css
│ │ │ │ │ ├── jquery.dataTables.css
│ │ │ │ │ └── jquery.dataTables_themeroller.css
│ │ │ │ ├── images/
│ │ │ │ │ └── Sorting icons.psd
│ │ │ │ └── js/
│ │ │ │ ├── dataTables.bootstrap.js
│ │ │ │ ├── dataTables.bootstrap4.js
│ │ │ │ ├── dataTables.foundation.js
│ │ │ │ ├── dataTables.jqueryui.js
│ │ │ │ ├── dataTables.material.js
│ │ │ │ ├── dataTables.semanticui.js
│ │ │ │ ├── dataTables.uikit.js
│ │ │ │ ├── jquery.dataTables.js
│ │ │ │ └── jquery.js
│ │ │ ├── datatables-plugins/
│ │ │ │ ├── dataTables.bootstrap.css
│ │ │ │ ├── dataTables.bootstrap.js
│ │ │ │ └── index.html
│ │ │ ├── datatables-responsive/
│ │ │ │ ├── dataTables.responsive.css
│ │ │ │ ├── dataTables.responsive.js
│ │ │ │ └── dataTables.responsive.scss
│ │ │ ├── flot/
│ │ │ │ ├── excanvas.js
│ │ │ │ ├── jquery.colorhelpers.js
│ │ │ │ ├── jquery.flot.canvas.js
│ │ │ │ ├── jquery.flot.categories.js
│ │ │ │ ├── jquery.flot.crosshair.js
│ │ │ │ ├── jquery.flot.errorbars.js
│ │ │ │ ├── jquery.flot.fillbetween.js
│ │ │ │ ├── jquery.flot.image.js
│ │ │ │ ├── jquery.flot.js
│ │ │ │ ├── jquery.flot.navigate.js
│ │ │ │ ├── jquery.flot.pie.js
│ │ │ │ ├── jquery.flot.resize.js
│ │ │ │ ├── jquery.flot.selection.js
│ │ │ │ ├── jquery.flot.stack.js
│ │ │ │ ├── jquery.flot.symbol.js
│ │ │ │ ├── jquery.flot.threshold.js
│ │ │ │ ├── jquery.flot.time.js
│ │ │ │ └── jquery.js
│ │ │ ├── flot-tooltip/
│ │ │ │ ├── jquery.flot.tooltip.js
│ │ │ │ └── jquery.flot.tooltip.source.js
│ │ │ ├── font-awesome/
│ │ │ │ ├── HELP-US-OUT.txt
│ │ │ │ ├── css/
│ │ │ │ │ └── font-awesome.css
│ │ │ │ ├── fonts/
│ │ │ │ │ └── FontAwesome.otf
│ │ │ │ ├── less/
│ │ │ │ │ ├── animated.less
│ │ │ │ │ ├── bordered-pulled.less
│ │ │ │ │ ├── core.less
│ │ │ │ │ ├── extras.less
│ │ │ │ │ ├── fixed-width.less
│ │ │ │ │ ├── font-awesome.less
│ │ │ │ │ ├── icons.less
│ │ │ │ │ ├── larger.less
│ │ │ │ │ ├── list.less
│ │ │ │ │ ├── mixins.less
│ │ │ │ │ ├── path.less
│ │ │ │ │ ├── rotated-flipped.less
│ │ │ │ │ ├── screen-reader.less
│ │ │ │ │ ├── spinning.less
│ │ │ │ │ ├── stacked.less
│ │ │ │ │ └── variables.less
│ │ │ │ └── scss/
│ │ │ │ ├── _animated.scss
│ │ │ │ ├── _bordered-pulled.scss
│ │ │ │ ├── _core.scss
│ │ │ │ ├── _extras.scss
│ │ │ │ ├── _fixed-width.scss
│ │ │ │ ├── _icons.scss
│ │ │ │ ├── _larger.scss
│ │ │ │ ├── _list.scss
│ │ │ │ ├── _mixins.scss
│ │ │ │ ├── _path.scss
│ │ │ │ ├── _rotated-flipped.scss
│ │ │ │ ├── _screen-reader.scss
│ │ │ │ ├── _spinning.scss
│ │ │ │ ├── _stacked.scss
│ │ │ │ ├── _variables.scss
│ │ │ │ └── font-awesome.scss
│ │ │ ├── jquery/
│ │ │ │ └── jquery.js
│ │ │ ├── metisMenu/
│ │ │ │ ├── metisMenu.css
│ │ │ │ └── metisMenu.js
│ │ │ ├── morrisjs/
│ │ │ │ ├── morris.css
│ │ │ │ └── morris.js
│ │ │ └── raphael/
│ │ │ └── raphael.js
│ │ └── webapp/
│ │ └── WEB-INF/
│ │ └── jsp/
│ │ ├── common/
│ │ │ ├── footer.jspf
│ │ │ ├── header.jspf
│ │ │ └── navigation.jspf
│ │ ├── error.jsp
│ │ ├── file-upload-successful.jsp
│ │ ├── list-todos.jsp
│ │ ├── login.jsp
│ │ ├── todo.jsp
│ │ └── welcome.jsp
│ └── test/
│ └── java/
│ └── com/
│ └── in28minutes/
│ └── springboot/
│ └── web/
│ └── SpringBootFirstWebApplicationTests.java
├── web-driver-1-basics/
│ ├── pom.xml
│ └── src/
│ └── test/
│ └── java/
│ └── com/
│ └── in28minutes/
│ └── webdriver/
│ ├── basics/
│ │ ├── AbstractChromeWebDriverTest.java
│ │ ├── WebDriverBasicsLocatorsPerformanceTest.java
│ │ ├── WebDriverBasicsLocatorsWithCSSSelectorTest.java
│ │ ├── WebDriverBasicsLocatorsWithClassTest.java
│ │ ├── WebDriverBasicsLocatorsWithIdTest.java
│ │ ├── WebDriverBasicsLocatorsWithLinkTextTest.java
│ │ ├── WebDriverBasicsLocatorsWithNameTest.java
│ │ ├── WebDriverBasicsLocatorsWithTagTest.java
│ │ ├── WebDriverBasicsLocatorsWithXPathSelectorTest.java
│ │ └── form/
│ │ ├── FormElementCheckBoxTest.java
│ │ ├── FormElementRadioButtonTest.java
│ │ ├── FormElementSelectTest.java
│ │ └── FormElementTextTest.java
│ └── login/
│ ├── FirstWebApplicationLoginTest.java
│ └── StaticLoginTest.java
├── web-driver-2-more-scenarios/
│ ├── pom.xml
│ ├── src/
│ │ └── test/
│ │ └── java/
│ │ └── com/
│ │ └── in28minutes/
│ │ └── webdriver/
│ │ ├── basics/
│ │ │ └── AbstractChromeWebDriverTest.java
│ │ └── scenarios/
│ │ ├── ActionsBasicTest.java
│ │ ├── CheckElementStylesTest.java
│ │ ├── FramesTest.java
│ │ ├── JavaScriptAlertTest.java
│ │ ├── NewWindowTest.java
│ │ ├── PlayingWithModalWindowAndWaitsTest.java
│ │ ├── PlayingWithScreenWindowTest.java
│ │ ├── ReadTablesTest.java
│ │ ├── RunJavaScriptTest.java
│ │ ├── TakesScreenshotTest.java
│ │ └── framework/
│ │ └── TableReader.java
│ └── testng.xml
├── web-driver-3-cross-browser-framework/
│ ├── pom.xml
│ ├── src/
│ │ └── test/
│ │ └── java/
│ │ └── com/
│ │ └── in28minutes/
│ │ └── selenium/
│ │ └── crossbrowser/
│ │ ├── CrossBrowserBasicsTest.java
│ │ ├── HeadlessBrowserBasicsTest.java
│ │ └── framework/
│ │ └── CrossBrowserFrameworkTest.java
│ └── testng.xml
├── web-driver-4-data-driven-tests/
│ ├── pom.xml
│ └── src/
│ └── test/
│ ├── java/
│ │ └── com/
│ │ └── in28minutes/
│ │ └── datadriventests/
│ │ ├── ExcelReadUtil.java
│ │ ├── LoginDataProviderCompleteCSVTest.java
│ │ ├── LoginDataProviderCompleteExcelTest.java
│ │ ├── LoginDataProviderCompleteTest.java
│ │ ├── SuccessfulLoginBasicTest.java
│ │ ├── UnSuccessfulLoginBasicTest.java
│ │ ├── UnSuccessfulLoginDataDrivenBasicTest.java
│ │ └── UnSuccessfulLoginDataDrivenLevel1Test.java
│ └── resources/
│ ├── login-data.csv
│ └── login-data.xlsx
├── web-driver-5-page-object-model/
│ ├── pom.xml
│ └── src/
│ └── test/
│ └── java/
│ └── com/
│ └── in28minutes/
│ └── pageobjects/
│ └── updatetodo/
│ ├── ListTodoPage.java
│ ├── LoginPage.java
│ ├── TodoPage.java
│ ├── UpdateTodoBasicTest.java
│ ├── UpdateTodoBasicTest1BeforePageObjects.java
│ ├── UpdateTodoBasicTest2AfterLoginPage.java
│ ├── UpdateTodoBasicTest3AfterListTodoPage.java
│ ├── UpdateTodoBasicTest5AfterExercises.java
│ └── WelcomePage.java
└── web-driver-6-stand-alone-and-grid/
├── pom.xml
└── src/
└── test/
└── java/
└── com/
└── in28minutes/
├── SeleniumHubTest.java
└── SeleniumStandAloneTest.java
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
# Compiled class file
*.class
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.ear
*.zip
*.tar.gz
*.rar
*.cmd
*.classpath
*.settings
*.project
*.mvn
mvnw
target
*.DS_Store
test-output
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
================================================
FILE: README.md
================================================
# Learn Automation Testing with Java and Selenium
Course Link : https://www.udemy.com/course/automation-testing-with-selenium-and-java-for-beginners/
## Your First Steps towards Great Automation Tester
* [Course Overview](#course-overview)
- [Course Steps](#step-list)
- [Expectations](#expectations)
* [Installing Eclipse, Maven and Java](#installing-tools)
* [Running Examples](#running-examples)
* [About in28Minutes](#about-in28minutes)
- [Our Beliefs](#our-beliefs)
- [Our Approach](#our-approach)
- [Find Us](#useful-links)
- [Other Courses](#other-courses)
## Course Checklist
## Getting Started
- Eclipse - https://courses.in28minutes.com/p/eclipse-tutorial-for-beginners
- Maven - https://courses.in28minutes.com/p/maven-tutorial-for-beginners-in-5-steps
- JUnit - https://courses.in28minutes.com/p/junit-tutorial-for-beginners
- Mockito - https://courses.in28minutes.com/p/mockito-for-beginner-in-5-steps
## Installing Tools
- Installation Video : https://www.youtube.com/playlist?list=PLBBog2r6uMCSmMVTW_QmDLyASBvovyAO3
- GIT Repository For Installation : https://github.com/in28minutes/getting-started-in-5-steps
- PDF : https://github.com/in28minutes/SpringIn28Minutes/blob/master/InstallationGuide-JavaEclipseAndMaven_v2.pdf
## Running Examples
- Download the zip or clone the Git repository.
- Unzip the zip file (if you downloaded one).
- Open Command Prompt and Change directory (cd) to folder containing pom.xml
- Open Eclipse
- File -> Import -> Existing Maven Project -> Navigate to the folder where you unzipped the zip
- Select the right project
- Choose the Spring Boot Application file (search for file with @SpringBootApplication)
- Right Click on the file and Run as Java Application
- You are all Set
- For help : use our installation guide - https://www.youtube.com/playlist?list=PLBBog2r6uMCSmMVTW_QmDLyASBvovyAO3
### References
#### Selenium Standalone
- Manual Installation - https://github.com/lmc-eu/steward/wiki/Selenium-server-&-browser-drivers
- Automated Installation - https://www.npmjs.com/package/selenium-standalone
- URL - http://localhost:4444/wd/hub
##### Installation and Launch
- Step I : Install NPM
- Step II : Install selenium-standalone
Terminal or Command Prompt
```
# In Windows, Run CMD as Administrator
npm install selenium-standalone@latest -g
# If need use sudo npm install selenium-standalone@latest -g
selenium-standalone install
# if needed use sudo
```
- Step III : Launch Selenium Standalone
```
selenium-standalone start
```
> By default, google chrome, firefox and phantomjs are available when installed on the host system
```
# install a single driver within the default list (chrome, ie, edge, firefox)
selenium-standalone install --singleDriverInstall=chrome
```
Reference
- More Options - https://www.npmjs.com/package/selenium-standalone#command-line-interface
#### Selenium Grid
- URL -http://localhost:4444/grid/console
##### Installation and Launch
- Follow Step I and II of Selenium Standalone
- Step III
```
selenium-standalone start -- -role hub
selenium-standalone start -- -role node -hub http://localhost:4444/grid/register
selenium-standalone start -- -role node -hub http://localhost:4444/grid/register -port 5556
selenium-standalone start -- -role node -hub http://localhost:4444/grid/register -browser browserName=firefox
selenium-andalone start -- -role node -hub http://localhost:4444/grid/register -port 5556 -browser browserName=chrome,maxInstances=2
```
#### Code Snippets
##### Maven Dependencies
###### JUnit
```xml
<dependencies>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.13.0</version>
<scope>test</scope>
</dependency>
<!-- https://github.com/bonigarcia/webdrivermanager -->
<dependency>
<groupId>io.github.bonigarcia</groupId>
<artifactId>webdrivermanager</artifactId>
<version>2.2.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.0.13</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
```
###### Test NG
```xml
<dependencies>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.13.0</version>
<scope>test</scope>
</dependency>
<!-- https://github.com/bonigarcia/webdrivermanager -->
<dependency>
<groupId>io.github.bonigarcia</groupId>
<artifactId>webdrivermanager</artifactId>
<version>2.2.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.0.13</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.14.3</version>
<scope>test</scope>
</dependency>
</dependencies>
```
###### Other Dependencies
```xml
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>3.10.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>3.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.6</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.6</version>
<scope>test</scope>
</dependency>
```
##### Java Code
###### Chrome Driver
```java
ChromeDriverManager.getInstance().setup();
driver = new ChromeDriver();
```
###### Firefox Driver
```java
FirefoxDriverManager.getInstance().setup();
driver = new FirefoxDriver();
```
###### Excel Data Reader
```java
package com.in28minutes.datadriventests;
import java.io.File;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
public class ExcelReadUtil {
public static String[][] readExcelInto2DArray(String excelFilePath, String sheetName, int totalCols) {
File file = new File(excelFilePath);
String[][] tabArray = null;
try {
OPCPackage opcPackage = OPCPackage.open(file.getAbsolutePath());
Workbook wb = WorkbookFactory.create(opcPackage);
Sheet sheet = wb.getSheet(sheetName);
int totalRows = sheet.getLastRowNum() + 1;
tabArray = new String[totalRows][totalCols];
for (int i = 0; i < totalRows; i++) {
for (int j = 0; j < totalCols; j++) {
Cell cell = sheet.getRow(i).getCell(j);
System.out.println(cell + " " + i + " " + j);
if (cell == null)
continue;
switch (cell.getCellType()) {
case Cell.CELL_TYPE_BOOLEAN:
tabArray[i][j] = String.valueOf(cell.getBooleanCellValue());
break;
case Cell.CELL_TYPE_NUMERIC:
tabArray[i][j] = String.valueOf(cell.getNumericCellValue());
break;
case Cell.CELL_TYPE_STRING:
tabArray[i][j] = cell.getStringCellValue();
break;
default:
tabArray[i][j] = "";
break;
}
}
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
return tabArray;
}
}
```
##### TestNG (testng.xml)
```
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="First Suite" verbose="1">
</suite>
```
##### AbstractChromeWebDriverTest
```java
package com.in28minutes.webdriver.basics;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import io.github.bonigarcia.wdm.WebDriverManager;
public abstract class AbstractChromeWebDriverTest {
protected WebDriver driver;
public AbstractChromeWebDriverTest() {
super();
}
@BeforeTest
public void beforeTest() {
//Download the web driver executable
WebDriverManager.chromedriver().setup();
//Create a instance of your web driver - chrome
driver = new ChromeDriver();
}
@AfterTest
public void afterTest() {
driver.quit();
}
public void sleep(int seconds) {
try {
Thread.sleep(seconds * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
```
#### Resources
##### Plugins
- Eclipse Plugin for TestNg - http://beust.com/eclipse
##### Selenium IDE
- Selenium IDE will no longer work from Firefox 55
- https://seleniumhq.wordpress.com/2017/08/09/firefox-55-and-selenium-ide/
- A new version of Selenium IDE for Selenium 3 is being built
- https://seleniumhq.wordpress.com/2018/08/06/selenium-ide-tng/
##### Troubleshooting
- Troubleshooting Guide - https://github.com/in28minutes/in28minutes-initiatives/tree/master/The-in28Minutes-TroubleshootingGuide-And-FAQ
- Troubleshooting Guide for Maven Issues - https://github.com/in28minutes/in28minutes-initiatives/tree/master/The-in28Minutes-TroubleshootingGuide-And-FAQ#error---you-are-not-using-a-jdk
##### Browsers
- WebDriver Specification - https://www.w3.org/TR/webdriver/
- Firefox version 47.0+ Geckodriver is needed to interact with Firefox - Similar to Chrome.
- https://ftp.mozilla.org/pub/firefox/releases/61.0.1/
- https://ftp.mozilla.org/pub/firefox/releases/54.0.1/
## Overview
### Introduction
Writing your first automation test is a lot of fun.
Java is one of the most popular programming languages. Java offers both object oriented and functional programming features. Selenium can be used for screen scraping and automating repeated tasks on browser.
In this course, you will learn the basics of programming with Java and Automation Testing with Selenium.
We take an hands-on approach using Eclipse as an IDE to illustrate more than 200 Java Coding Exercises, Puzzles and Code Examples. We will also write more than 100 Selenium automation tests with Java for a wide variety of scenarios.
In more than 350 Steps, we explore the most important Java Programming Features and Selenium Automation Testing Scenarios
- Basics of Java Programming - Expressions, Variables and Printing Output
- Using Selenium IDE and Katalon Studio to Record and Replay Automation Testing Scenarios
- Exporting Automation Tests and Setting up new Maven Project for JUnit and TestNG
- TestNG vs JUnit
- TestNG Advanced Features - XML Suite, Test Reports, Running Tests with Parameters defined in XML and Running Tests in Parallel
- Basics of HTML, CSS and XPath
- Selenium Locators - By Id, By Name, By Link Text, By Partial Link Text, By Class, CSS Selectors and XPath Expressions
- Setting and Reading values from Form Elements - Text, TextArea, CheckBox , Radio Button, Select Box and Multi Select Box
- Advanced Selenium Automation Testing Scenarios - Playing with Windows, Modal Windows (Sleep, Implicit Wait and Explicit Waits), Alert Boxes, Window Handles and New Browser Window Launches, Frames, Taking Screenshots, Executing JavaScript Code, Actions Interface to control mouse and keyboard
- Set up Automation Testing Frameworks - Tables
- Important Interfaces - WebDriver
- Introduction to Cross Browser Automation Testing, Headless Testing and Setting up a Basic Cross Browser Automation Testing Framework
- Writing Data Driven Testing with Data Providers, CSV and Excel Spreadsheets
- Implementing Page Object Model for a Complex Test Scenario
- Scaling up with Selenium Standalone and Grid
- Java Operators - Java Assignment Operator, Relational and Logical Operators, Short Circuit Operators
- Java Conditionals and If Statement
- Methods - Parameters, Arguments and Return Values
- An Overview Of Java Platform - java, javac, bytecode, JVM and Platform Independence - JDK vs JRE vs JVM
- Object Oriented Programming - Class, Object, State and Behavior
- Basics of OOPS - Encapsulation, Abstraction, Inheritance and Polymorphism
- Basics about Java Data Types - Casting, Operators and More
- Java Built in Classes - BigDecimal, String, Java Wrapper Classes
- Conditionals with Java - If Else Statement, Nested If Else, Java Switch Statement, Java Ternary Operator
- Loops - For Loop, While Loop in Java, Do While Loop, Break and Continue
- Java Array and ArrayList - Java String Arrays, Arrays of Objects, Primitive Data Types, toString and Exceptions
- Java Collections - List Interface(ArrayList, LinkedList and Vector), Set Interface (HashSet, LinkedHashSet and TreeSet), Queue Interface (PriorityQueue) and Map Interface (HashMap, HashTable, LinkedHashMap and TreeMap() - Compare, Contrast and Choose
- Generics - Why do we need Generics? Restrictions with extends and Generic Methods, WildCards - Upper Bound and Lower Bound.
- Introduction to Exception Handling - Your Thought Process during Exception Handling. try, catch and finally. Exception Hierarchy - Checked Exceptions vs Unchecked Exceptions. Throwing an Exception. Creating and Throwing a Custom Exception - CurrenciesDoNotMatchException. Try with Resources - New Feature in Java 7.
You will be using Eclipse and Brackets as the IDE. You will be using Maven, npm (Dependency Management), TestNG (XML Test Suite, Parallel, Multiple Browsers), JUnit, Selenium IDE, Katalon Studio, Selenium Standalone and Selenium Grid. We will help you set up each one of these.
- Tools : Maven, JUnit, TestNG (XML Test Suite, Groups, Listeners, Parallel, Multiple Browsers), Selenium IDE, Katalon Studio, Brackets
- Concepts : HTML, DOM, XPath, Selenium Architecture, Reporting (HTML), Parallel Execution (Data Driven Tests, Browsers, Test Ng, Grid), Debugging (Screenshots/logs), Page Object Model, Data Driven(Excel), Keyword Driven, Record and Replay, Selenium Grid, Cross Browser Testing, DRY
- Basics : Selenium Web Driver, Locating Web Elements(link text, name, id, xpath, css), Different Elements(select, radio, web tables, drag and drop, javascript alerts, windows, popups, iframes, switching windows), Wait (Explicit/Implicit), JavaScript Executor Action Class, Mouse movement, Keyboard with Selenium)
- Tips : Selenium Web Driver is an Interface, Headless Testing(PhantomJS, Chrome)
### What You will learn
- You will learn how to think as a Java Programmer
- You will learn how to start your journey as a Java Programmer
- You will learn the basics of Eclipse IDE and JShell
- You will learn to develop awesome object oriented programs with Java
- You will learn to use Selenium IDE and Katalon Studio to Record and Replay Automation Testing Scenarios
- You will learn to setup new automation projects with Selenium, Web Driver, JUnit and TestNG Frameworks
- You will learn some of the TestNG Advanced Features - XML Suite, Test Reports, Test Parameters and Parallel Execution
- You will learn the basics of HTML, CSS and XPath
- You will understand all Selenium Locators - By Id, By Name, By Link Text, By Partial Link Text, By Class, CSS Selectors and XPath Expressions
- You will learn to play with Form Elements - Text, TextArea, CheckBox , Radio Button, Select Box and Multi Select Box
- You will learn to write automation test for wide range of scenarios - Playing with Windows, Modal Windows (Sleep, Implicit Wait and Explicit Waits), Alert Boxes, Window Handles and New Browser Window Launches, Frames, Taking Screenshots, Executing JavaScript Code, Actions Interface to control mouse and keyboard
- You will learn to Set up Automation Testing Frameworks for Form Elements, Tables and Cross Browser Testing
- You will learn to write Data Driven Tests with Data Providers, CSV and Excel Spreadsheets
- You will learn to implement Page Object Model for a Complex Automation Test Scenario
- You will learn to parallelize and scale up Automation Tests with Selenium Standalone and Grid
### Requirements
- You should have the ability to learn while having fun!
- Connectivity to Internet to download various tools needed.
- We will help you install Selenium IDE, Katalon Studio, Brackets, Java, NodeJs and Eclipse.
- We will help you download all needed dependencies using Maven and NPM
## Step Wise Details
### 00 - Overview
- 00 - 00 Introduction to Automation Testing with Java and Selenium
- 00 - 01 Automation Testing with Java and Selenium - Course Guide.pdf
- 00 - 02 How To Make Best use of the Course Guide?
- 00 - 03 Installing Java and Eclipse
### 01 - Getting Started with Selenium, JUnit and TestNG
- Step 01 - Getting Started with Selenium - An Overview
- Step 02 - Installing Selenium IDE
- Step 03 - Recording and Replaying Google Search with Selenium IDE
- Step 04 - Exercise - Recording Facebook Login
- Step 05 - Advanced Features in Selenium IDE
- Step 06 - Alternative for Selenium IDE - Katalon Studio
- Step 07 - Installing and Recording Tests with Katalon Studio
- Step 08 - Advanced Features of Katalon Studio
- Step 09 - Export Unit Tests and Set up new Maven Project
- Step 10 - Adding Maven Dependencies for JUnit, Web Driver Manager and Web Driver
- Step 11 - Fixing Driver Error with ChromeDriverManager
- Step 12 - Exercise - Run Facebook JUnit Test
- Step 13 - Running a Selenium Automation Test - What is happening in Background
- Step 14 - Install TestNG Plugin and Create New Project with TestNG
- Step 15 - Export and Run TestNG Test for Google and Facebook
- Step 16 - Comparing TestNG and JUnit Tests and Course Overview
### 02 - TestNG vs JUnit
- Step 01 - Introduction to TestNG vs JUnit
- Step 02 - Creating a Unit Test for SimpleClass
- Step 03 - Adding Asserts to Unit Test
- Step 04 - Exercise - Write more unit test Scenarios
- Step 05 - Writing Selenium JUnit Automation Test for Google - Part 1
- Step 06 - Writing Selenium JUnit Automation Test for Google - Part 2
- Step 07 - Exploring WebDriver Interface
- Step 08 - Writing Selenium JUnit Automation Test for Google - Part 3
- Step 09 - Reducing Duplication with @Before and @After JUnit Annotations
- Step 10 - Time for TestNG - Convert Unit Test to TestNG
- Step 11 - TestNG Advanced Features - XML Suite and Test Reports
- Step 12 - TestNG Advanced Features - Running Tests with Parameters defined in XML
- Step 13 - TestNG Advanced Features - Running Tests in Parallel
### 03 - Getting Started with HTML, CSS and XPath
- Step 01 - Why should you learn HTML and CSS
- Step 02 - How does Web Work - Request, Response, HTML and Browser
- Step 03 - Installing Web Editor - Brackets
- Step 04 - First HTML File - Tags, HTML, Head and Body
- Step 05 - Basic HTML Tags - Paragraph, Div, Heading - H1 to H6
- Step 06 - Formatting Tags - Bold, Italicized and Quotes
- Step 07 - Using Tags without closing tag - BR and HR
- Step 08 - W3C Standards for HTML
- Step 09 - Creating List of elements with UL LI and OL
- Step 10 - Organizing Your Data Using Tables
- Step 11 - Organizing Your Data Using Tables - Exercise Solutions
- Step 12 - HTML Attributes and Links - Absolute and Relative
- Step 13 - Image Tag in HTML - Local and Internet Links
- Step 14 - Introduction to Live Preview Feature in Brackets
- Step 15 - Nesting of Divs and Understanding align Attribute
- Step 16 - Getting Data from User using Forms - Text and TextArea
- Step 17 - Attributes on Text Elements - Size, maxlength, value
- Step 18 - Choosing among multiple options using Radio Buttons
- Step 19 - Choosing among multiple options using Select Box
- Step 20 - Choosing Yes or No with Check Box
- Step 21 - Submitting a Form and Understanding GET and POST
- Step 22 - Introduction to Frames
- Step 23 - Miscellaneous - Password Fields, File Input and Multi Select Box
- Step 24 - Introduction to CSS
- Step 25 - CSS for input, select and text area
- Step 26 - CSS attributes with color, background color
- Step 27 - Grouping Form Elements with fieldset
- Step 28 - Styling Fieldsets with CSS
- Step 29 - Exercise - Styling Lists
- Step 30 - Using an External CSS File
- Step 31 - Understanding Class in CSS
- Step 32 - Making best use of Class in CSS and Multiple Classes
- Step 33 - Using id with CSS
- Step 34 - Understanding CSS Selectors and Testing using $$ function
- Step 35 - CSS Selectors - Identifying Input Element
- Step 36 - Introduction to XPath Expressions - Absolute and Relative
- Step 37 - Using id and class in XPath Expressions
- Step 38 - Using XPath on the Forms Page
- Step 39 - A Review of XPath Expressions and CSS Selectors
### 04 - Setting up First Web Application
- Step 01 - Setting up First Web Application
- Step 02 - Refactoring Shortcuts To Learn
- Step 03 - My Favorite Shortcuts - Ctrl + 1 and Ctrl + Space
### 05 - Selenium Automation - Locators
- Step 01 - Introduction to the Section
- Step 02 - Setting up New Project with TestNG
- Step 03 01 - Selenium Locators - Locate Elements By Id and WebElement Interface
- Step 03 02 - Exercise - Selenium Locators - Locate Elements By Id
- Step 04 - Selenium Locators - Locate Elements By Name - Part 1
- Step 05 - Selenium Locators - Locate Elements By Name - Part 2
- Step 06 - Abstracting @BeforeTest and @AfterTest to common super class AbstractChromeWebDriverTest
- Step 07 - Debugging Errors - Element Not Found Exception
- Step 08 - Selenium Locators - Locate Elements By Tag Name
- Step 09 - Finding Multiple Matching Elements with findElements
- Step 10 - Finding Multiple Matching input Elements
- Step 11 - Slowing Tests using sleep for visualizing
- Step 12 - Automation Test for Entering UserId and Password and Logging in from Login Page
- Step 13 - Exercise - Create Automation Test fo Login Static Page
- Step 14 - Selenium Locators - Locate Elements By Link Text
- Step 15 - Selenium Locators - Locate Elements By Partial Link Text
- Step 16 - Selenium Locators - Locate Elements By Class
- Step 17 - Exercise - Selenium Locators - Locate Elements By Class
- Step 18 - Selenium Locators - Locate Table Element
- Step 19 - Exercise - Selenium Locators - Locate and Click Table Element
- Step 20 - Understanding CSS Selectors for Table Data - td
- Step 21 - Using XPath Expressions to Locate Table Elements
- Step 22 - Choosing among multiple Selenium Locator Options
- Step 23 - Improving Performance By Caching WebElements
- Step 24 - Conclusion
### 06 - Selenium Automation - Playing with Form Elements
- Step 01 - Introduction to Section
- Step 02 - Reading and Setting values into Text Elements using Selenium Web Driver Interface
- Step 03 - Reading and Setting values into TextArea Elements using Selenium Web Driver Interface
- Step 04 - Reading value of CheckBox in Automation Tests
- Step 05 - Setting value of CheckBox in Automation Tests
- Step 06 - Creating Framework Utility Method for CheckBox in Automation Tests
- Step 07 - Reading value of Radio Button in Automation Tests
- Step 08 - Setting value of Radio Button in Automation Tests
- Step 09 - Reading value of Select Box
- Step 10 - Reading value of Multi Select Box
- Step 11 - Setting value of Select Box in Automation Test
- Step 12 - Conclusion
### 07 - Selenium Automation - Advanced Testing Scenarios
- Step 01 - Introduction and Setting up New Project with TestNG and Selenium
- Step 02 - Reading CSS Styles
- Step 03 - Exercise - Reading CSS Styles
- Step 04 - Checking if an element is enabled using isEnabled and Exploring WebDriver Interface
- Step 05 - More methods in WebDriver Interface - getAttribute, getLocation and getSize
- Step 06 - Accessing Window Information using WebDriver manage window method
- Step 07 - Window Navigation in Selenium Automation Test with WebDriver navigate method
- Step 08 - Automation Testing Modal Windows using Sleep
- Step 09 - Automation Testing Modal Windows with Implicit Wait
- Step 10 01 - Automation Testing Modal Windows with Explicit Waits
- Step 10 02 - Automation Testing Modal Windows with Explicit Waits - Events
- Step 11 - Testing Alert Boxes with Selenium
- Step 12 - Window Handles and Basics of Testing New Browser Window Launch
- Step 13 - Finding the Handle of Newly Launched Window
- Step 14 - Switching to Newly Launched Window
- Step 15 - Writing Automation Tests for Frames
- Step 16 - Taking Screenshot during Automation Test
- Step 17 - Executing JavaScript Code in Selenium Test
- Step 18 - Reviewing WebDriver Interface
- Step 20 - Writing Automation Tests for Tables
- Step 21 - Designing a basic framework for Tables
- Step 22 - Using Actions Interface for Basic Actions with Keyboard and Mouse
- Step 23 - More Actions Interface - Drag, Drop, Hold and Release
### 08 - Introduction to Cross Browser Automation Testing
- Step 01 - Introduction to Cross Browser Automation Testing
- Step 02 - Setting up a New Project and Running Tests in Chrome and Firefox
- Step 03 - Running Automation Tests in Other Browser - Safari, Internet Explorer and Edge
- Step 04 - Running Headless Automation Test with PhanthomJS
- Step 05 - Running Automation Tests with Chrome and Firefox Browsers in Headless mode
- Step 06 - Designing Cross Browser Automation Test Framework - Part 1
- Step 07 - Designing Cross Browser Automation Test Framework - Part 2
### 09 - Data Driven Testing with Data Providers, CSV and Excel Spreadsheets
- Step 01 - Section Overview
- Step 02 - Understanding Prerequisites and Login Test Scenario
- Step 03 - Setting up a new Project with Hardcoded Login Scenario
- Step 04 - Writing Automation Test for Unsuccessful Login
- Step 05 - Data Driving Unsuccessful Login Automation Test with DataProvider
- Step 06 - Adding Passwords to DataProvider
- Step 07 - Adding Expected Test Result to Data Provider
- Step 08 - Reading Test Data From CSV File
- Step 09 - Connecting Test Data Provider to CSV File
- Step 10 - Setting up Excel File with Google Spreadsheets
- Step 11 - Reading Test Data From Excel using POI and ExcelReadUtil
- Step 12 - Understanding ExcelReadUtil
- Step 13 - Connecting Test Data Provider to Excel File
### 10 - Implementing Page Object Model for Update Todo Scenario
- Step 01 - Introduction - Objectives and Prerequisites
- Step 02 - Setting up a New Project and Creating an outline for the Update Todo Test
- Step 03 - Writing First Version of Update Todo Automation Test
- Step 04 - First Working Version of Update todo Test and a Discussion on Maintainability
- Step 05 - Introduction to Page Object Model
- Step 06 - Creating Your first Page Object
- Step 07 - Updating the Automation Test to use Login Page Object
- Step 08 - Creating Action Methods in Login Page Object
- Step 09 - Creating Todo Page Object
- Step 10 - Creating List Todo Page Object
### 11 - Scaling up with Selenium Standalone and Grid
- Step 01 - Selenium Standalone and Grid - An Introduction
- Step 02 - Intallation Step I - NPM using Node JS
- Step 03 - Intallation Steps II and III - Installing and Launching Selenium Standalone Server
- Step 04 - Setting up an Automation Project and Creating a Simple Test
- Step 05 - Creating a New Test to run using Selenium Standalone Server
- Step 06 - Introduction to Selenium Grid - Hub and Nodes
- Step 07 - Setting up Selenium Grid with a Hub and 2 Nodes
- Step 08 - Setting up different browser capabilities for the Nodes in the Selenium Grid
### 12 - Thank You
- 99 00 Introduction to Automation Testing with Java and Selenium - Congratulations
## Templates
### Welcome Message
```
## ADD A FEW SAMPLE REVIEWS AFter a couple of months
## ADD A FEW SAMPLE REVIEWS - in the description of the course
Congratulations on joining this course from in28Minutes.
We have 6800+ 5 Star reviews on our courses.
I hope that by the time you are prompted to leave a review, that you think this course is an amazing course and can write a few sentences about what you like about the course for future students to see. If you do not think this course is a 5-star course, we want to make it a better course for you! Please message me with ways that I can make it the best course for you.
There are three things you need to understand before you start this course!
1...... Listen + See + Do Hands-on + Repeat = 90% Retention
For the first 2 hours, we repeat a few concepts to help you retain them. .
2...... Set Yourself a Goal
Set 1 hour aside every day for the next week for this course! No exceptions allowed :)
3...... Udemy asks you for a review very early in the course! If you are not ready for giving a review, you can skip giving a review.
Thank you and enjoy the course,
Ranga
```
### Thank You for completing the course message
```
Congratulations on completing the course from in28Minutes.
We have 6800+ 5 Star reviews on our courses. We hope you think this course is an amazing course and can write a few sentences about what you like about the course for future students to see.
We are on a constant journey to improve our courses further. Do message me if you have any suggestions.
Good Luck for your future.
Ranga from in28Minutes
```
### Bonus Lectures
```
20+ Courses on Programming, Full Stack Development and Automation Testing. 200+ Youtube Videos on Programming, Design and Architecture.
https://github.com/in28minutes/learn
```
## Exercises
- TODO
## Future Things To Do
- TODO
## About in28Minutes
At in28Minutes, we ask ourselves one question everyday
> How do we create more amazing course experiences?
> We use 80-20 Rule. We discuss 20% things used 80% of time in depth.
We are creating amazing learning experiences for learning Spring Boot with AWS, Azure, GCP, Docker, Kubernetes and Full Stack. 300,000 Learners rely on our expertise. [Find out more.... ](https://github.com/in28minutes/learn#best-selling-courses)

### Graphviz
```
digraph G {
color="#1BA84A";//green
color="#D14D28";//orange
color="#59C8DE";//blue
node[style=filled,color="#59C8DE"]
subgraph cluster_0 {
style=filled;
color="#59C8DE";
node [style=filled,color="#D14D28", fontcolor=white];
Code[label=<Automation Code + Libraries<BR />
<FONT POINT-SIZE="10">Java, Python etc</FONT>>];
WebDriver[label=<Web Driver<BR />
<FONT POINT-SIZE="10">Chrome Driver, Firefox Driver,<BR /> Safari Driver, IE Driver etc</FONT>>];
Browser[label=<Browser<BR />
<FONT POINT-SIZE="10">Chrome, Firefox, Safari, IE etc</FONT>>];
Code -> WebDriver -> Browser;
label = "Single System";
}
RunTests[label=<Run Automation Tests<BR />
<FONT POINT-SIZE="10">Manually, Continuous Integration etc</FONT>>];
Application[label=<Web Application<BR />
<FONT POINT-SIZE="10">Todo Management, Google, Facebook etc</FONT>>];
RunTests -> Code;
Browser -> Application;
RunTests [shape=Mdiamond];
Application [shape=rectangle];
}
digraph SeleniumStandAlone {
color="#1BA84A";//green
color="#D14D28";//orange
color="#59C8DE";//blue
node[style=filled,color="#59C8DE"]
subgraph cluster_2 {
style=filled;
color="#59C8DE";
node [style=filled,color="#D14D28", fontcolor=white];
WebDriver[label=<Web Driver<BR />
<FONT POINT-SIZE="10">Chrome Driver, Firefox Driver,<BR /> Safari Driver, IE Driver etc</FONT>>];
Browser[label=<Browser<BR />
<FONT POINT-SIZE="10">Chrome, Firefox, Safari, IE etc</FONT>>];
StandaloneServer[];
StandaloneServer -> WebDriver -> Browser;
label = "Stand Alone Server";
}
subgraph cluster_0 {
style=filled;
color="#59C8DE";
node [style=filled,color="#D14D28", fontcolor=white];
Code[label=<Automation Code + Libraries<BR />
<FONT POINT-SIZE="10">Java, Python etc</FONT>>];
Code -> StandaloneServer
label = "System 1";
}
subgraph cluster_1 {
style=filled;
color="#59C8DE";
node [style=filled,color="#D14D28", fontcolor=white];
Code1[label=<Automation Code + Libraries<BR />
<FONT POINT-SIZE="10">Java, Python etc</FONT>>];
Code1 -> StandaloneServer
label = "System 2";
}
Application[label=<Web Application<BR />
<FONT POINT-SIZE="10">Todo Management, Google, Facebook etc</FONT>>];
Browser -> Application;
Application [shape=rectangle];
}
digraph SeleniumGrid {
color="#1BA84A";//green
color="#D14D28";//orange
color="#59C8DE";//blue
node[style=filled,color="#59C8DE"]
subgraph cluster_3 {
style=filled;
color="#59C8DE";
node [style=filled,color="#D14D28", fontcolor=white];
WebDriver[label=<Web Driver<BR />
<FONT POINT-SIZE="10">Chrome Driver, Firefox Driver,<BR /> Safari Driver, IE Driver etc</FONT>>];
Browser[label=<Browser<BR />
<FONT POINT-SIZE="10">Chrome, Firefox, Safari, IE etc</FONT>>];
SeleniumNode1[label="Selenium Node"];
SeleniumNode1 -> WebDriver -> Browser;
label = "Selenium Node 1";
}
subgraph cluster_4 {
style=filled;
color="#59C8DE";
node [style=filled,color="#D14D28", fontcolor=white];
WebDriver2[label=<Web Driver<BR />
<FONT POINT-SIZE="10">Chrome Driver, Firefox Driver,<BR /> Safari Driver, IE Driver etc</FONT>>];
Browser2[label=<Browser<BR />
<FONT POINT-SIZE="10">Chrome, Firefox, Safari, IE etc</FONT>>];
SeleniumNode2[label="Selenium Node"];
SeleniumNode2 -> WebDriver2 -> Browser2;
label = "Selenium Node 2";
}
subgraph cluster_2 {
style=filled;
color="#59C8DE";
node [style=filled,color="#D14D28", fontcolor=white];
WebDriver[label=<Web Driver<BR />
<FONT POINT-SIZE="10">Chrome Driver, Firefox Driver,<BR /> Safari Driver, IE Driver etc</FONT>>];
Browser[label=<Browser<BR />
<FONT POINT-SIZE="10">Chrome, Firefox, Safari, IE etc</FONT>>];
SeleniumGrid -> SeleniumNode1;
SeleniumGrid -> SeleniumNode2;
label = "Selenium Grid";
}
Application[label=<Web Application<BR />
<FONT POINT-SIZE="10">Todo Management, Google, Facebook etc</FONT>>];
AutomationCode[label=<Automation Code + Libraries<BR />
<FONT POINT-SIZE="10">Java, Python etc, Application 1..n etc, System 1..n etc </FONT>>];
AutomationCode -> SeleniumGrid;
Browser -> Application;
Browser2 -> Application;
Application [shape=rectangle];
AutomationCode [shape=Mdiamond];
}
```
### Backup
#### JUnit + Selenium - Google Export from Katalon
```
package com.example.tests;
import java.util.regex.Pattern;
import java.util.concurrent.TimeUnit;
import org.junit.*;
import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;
import org.openqa.selenium.*;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.Select;
public class GoogleSearchForIn28minutes {
private WebDriver driver;
private String baseUrl;
private boolean acceptNextAlert = true;
private StringBuffer verificationErrors = new StringBuffer();
@Before
public void setUp() throws Exception {
driver = new FirefoxDriver();
baseUrl = "https://www.katalon.com/";
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}
@Test
public void testGoogleSearchForIn28minutes() throws Exception {
driver.get("https://www.google.com/");
driver.findElement(By.id("lst-ib")).click();
driver.findElement(By.id("lst-ib")).clear();
driver.findElement(By.id("lst-ib")).sendKeys("in28minutes");
driver.findElement(By.id("lst-ib")).sendKeys(Keys.ENTER);
}
@After
public void tearDown() throws Exception {
driver.quit();
String verificationErrorString = verificationErrors.toString();
if (!"".equals(verificationErrorString)) {
fail(verificationErrorString);
}
}
private boolean isElementPresent(By by) {
try {
driver.findElement(by);
return true;
} catch (NoSuchElementException e) {
return false;
}
}
private boolean isAlertPresent() {
try {
driver.switchTo().alert();
return true;
} catch (NoAlertPresentException e) {
return false;
}
}
private String closeAlertAndGetItsText() {
try {
Alert alert = driver.switchTo().alert();
String alertText = alert.getText();
if (acceptNextAlert) {
alert.accept();
} else {
alert.dismiss();
}
return alertText;
} finally {
acceptNextAlert = true;
}
}
}
```
#### JUnit + Selenium - Facebook Export from Katalon
```
package com.example.tests;
import java.util.regex.Pattern;
import java.util.concurrent.TimeUnit;
import org.junit.*;
import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;
import org.openqa.selenium.*;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.Select;
public class FacebookLogin {
private WebDriver driver;
private String baseUrl;
private boolean acceptNextAlert = true;
private StringBuffer verificationErrors = new StringBuffer();
@Before
public void setUp() throws Exception {
driver = new FirefoxDriver();
baseUrl = "https://www.katalon.com/";
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}
@Test
public void testFacebookLogin() throws Exception {
driver.get("https://www.facebook.com/");
driver.findElement(By.id("email")).click();
driver.findElement(By.id("email")).clear();
driver.findElement(By.id("email")).sendKeys("in28minutes");
driver.findElement(By.id("pass")).clear();
driver.findElement(By.id("pass")).sendKeys("dummy");
driver.findElement(By.id("pass")).sendKeys(Keys.ENTER);
}
@After
public void tearDown() throws Exception {
driver.quit();
String verificationErrorString = verificationErrors.toString();
if (!"".equals(verificationErrorString)) {
fail(verificationErrorString);
}
}
private boolean isElementPresent(By by) {
try {
driver.findElement(by);
return true;
} catch (NoSuchElementException e) {
return false;
}
}
private boolean isAlertPresent() {
try {
driver.switchTo().alert();
return true;
} catch (NoAlertPresentException e) {
return false;
}
}
private String closeAlertAndGetItsText() {
try {
Alert alert = driver.switchTo().alert();
String alertText = alert.getText();
if (acceptNextAlert) {
alert.accept();
} else {
alert.dismiss();
}
return alertText;
} finally {
acceptNextAlert = true;
}
}
}
```
#### TestNg + Selenium - Google Export from Katalon
```
package com.example.tests;
import java.util.regex.Pattern;
import java.util.concurrent.TimeUnit;
import org.testng.annotations.*;
import static org.testng.Assert.*;
import org.openqa.selenium.*;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.Select;
public class GoogleSearchForIn28minutes {
private WebDriver driver;
private String baseUrl;
private boolean acceptNextAlert = true;
private StringBuffer verificationErrors = new StringBuffer();
@BeforeClass(alwaysRun = true)
public void setUp() throws Exception {
driver = new FirefoxDriver();
baseUrl = "https://www.katalon.com/";
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}
@Test
public void testGoogleSearchForIn28minutes() throws Exception {
driver.get("https://www.google.com/");
driver.findElement(By.id("lst-ib")).click();
driver.findElement(By.id("lst-ib")).clear();
driver.findElement(By.id("lst-ib")).sendKeys("in28minutes");
driver.findElement(By.id("lst-ib")).sendKeys(Keys.ENTER);
}
@AfterClass(alwaysRun = true)
public void tearDown() throws Exception {
driver.quit();
String verificationErrorString = verificationErrors.toString();
if (!"".equals(verificationErrorString)) {
fail(verificationErrorString);
}
}
private boolean isElementPresent(By by) {
try {
driver.findElement(by);
return true;
} catch (NoSuchElementException e) {
return false;
}
}
private boolean isAlertPresent() {
try {
driver.switchTo().alert();
return true;
} catch (NoAlertPresentException e) {
return false;
}
}
private String closeAlertAndGetItsText() {
try {
Alert alert = driver.switchTo().alert();
String alertText = alert.getText();
if (acceptNextAlert) {
alert.accept();
} else {
alert.dismiss();
}
return alertText;
} finally {
acceptNextAlert = true;
}
}
}
```
#### TestNg + Selenium - Facebook Export from Katalon
```
package com.example.tests;
import java.util.regex.Pattern;
import java.util.concurrent.TimeUnit;
import org.testng.annotations.*;
import static org.testng.Assert.*;
import org.openqa.selenium.*;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.Select;
public class FacebookLogin {
private WebDriver driver;
private String baseUrl;
private boolean acceptNextAlert = true;
private StringBuffer verificationErrors = new StringBuffer();
@BeforeClass(alwaysRun = true)
public void setUp() throws Exception {
driver = new FirefoxDriver();
baseUrl = "https://www.katalon.com/";
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}
@Test
public void testFacebookLogin() throws Exception {
driver.get("https://www.facebook.com/");
driver.findElement(By.id("email")).click();
driver.findElement(By.id("email")).clear();
driver.findElement(By.id("email")).sendKeys("in28minutes");
driver.findElement(By.id("pass")).clear();
driver.findElement(By.id("pass")).sendKeys("dummy");
driver.findElement(By.id("pass")).sendKeys(Keys.ENTER);
}
@AfterClass(alwaysRun = true)
public void tearDown() throws Exception {
driver.quit();
String verificationErrorString = verificationErrors.toString();
if (!"".equals(verificationErrorString)) {
fail(verificationErrorString);
}
}
private boolean isElementPresent(By by) {
try {
driver.findElement(by);
return true;
} catch (NoSuchElementException e) {
return false;
}
}
private boolean isAlertPresent() {
try {
driver.switchTo().alert();
return true;
} catch (NoAlertPresentException e) {
return false;
}
}
private String closeAlertAndGetItsText() {
try {
Alert alert = driver.switchTo().alert();
String alertText = alert.getText();
if (acceptNextAlert) {
alert.accept();
} else {
alert.dismiss();
}
return alertText;
} finally {
acceptNextAlert = true;
}
}
}
```
### Todo For Future
- Test Retry
#### Should You Automate?
- Is Your Flow Changing?
- Is Your UI Stable?
- Do you have tight deadlines?
- Building Good Automation Tests Needs Time
#### Selenium History
- 2004 - Jason Huggins at Thoughtworks created initial version of Selenium Core called Selenium RC (Selenium 1) - a very complicated Javascript framework, running in the Browser. However, since JavaScript is not considered secure - it had limitations.
- 2006 - Simon Stewart at Google started with the idea of Web Driver
- 2008 - Decision to merge Selenium and Web Driver. It will be called Selenium 2.x.
#### Selenium History - 2
- 2011 - Selenium 2 is out. Backward compatible with Selenium 1 (Selenium RC). Contained Web Driver APIs for Python, Ruby, Java and C#.
- 2016 - Selenium 3 is out. Backward compatible with WebDriver. Selenium RC is NOT supported. https://seleniumhq.wordpress.com/2016/10/13/selenium-3-0-out-now/
#### Todo to Improve Course
- Ctrl + Click to Open a Class
- sysout template expansion
- Rerecord
- Step 01 - Why should you learn HTML and CSS.mp4
- Step 02 - How does Web Work - Request, Response, HTML and Browser.mp4
#### Text search with contains
```java
WebElement notifications = driver.findElement(By.xpath("//*[contains(text(),'" + textToSearchFor + "')]"));
System.out.println("NOTIFICATIONS : " + notifications.getText());
```
#### Advanced CSS Selectors
```
attributeSuffix - driver.findElement(By.cssSelector("input[name$='word']"));
sibling - driver.findElement(By.cssSelector("input[name='password'] + input[type='submit']"));
directDescendant - driver.findElement(By.cssSelector("div > input[name='email']"));
anyDescendant() - driver.findElement(By.cssSelector("form input[name='email']"));
attributePrefix - driver.findElement(By.cssSelector("input[name^='pass']"));
```
#### Advanced XPAth Selectors
```
CLASS - //*[contains(concat(' ',normalize-space(@class),' '),' btn ')]
driver.findElement(By.xpath("//div[contains(.,'A visible paragraph')]/form"));
driver.findElement(By.xpath("//*[contains(text(),'A paragraph XXX with this text in bold')]"));
driver.findElement(By.xpath("//*[contains(normalize-space(.),'A paragraph with this text in bold')]"));
```
#### File Upload
```
@Test
public void testFileUpload() throws IOException {
ChromeDriverManager.getInstance().setup();
WebDriver driver = new ChromeDriver();
Path fileToUpload = Files.createTempFile(Paths.get("."), "some-file-to-upload", ".txt");
driver.get("http://localhost:8080/pages/file-upload.html");
driver.findElement(By.name("file")).sendKeys(fileToUpload.toFile().getCanonicalPath());
driver.findElement(By.cssSelector("input[type='submit']")).click();
String message = driver.findElement(By.id("welcome-message")).getText();
System.out.println(message);
Files.delete(fileToUpload);
driver.close();
driver.quit();
}
```
### Advanced Selenium Listeners
#### /src/test/java/com/in28minutes/automation/webapp/basics/WebDriverEventListenerUsingImplements.java
```java
public class WebDriverEventListenerUsingImplements implements WebDriverEventListener{
@Override
public void afterClickOn(WebElement element, WebDriver driver) {
System.out.printf("Element with tag %s and name %s is clicked \n", element.getTagName(), element.getAttribute("name"));
}
//Other empty methods are deleted for saving space!!
}
```
#### Unit Test
```java
@Test
public void setFormElementsWithListeners() {
ChromeDriverManager.getInstance().setup();
WebDriver driver = new ChromeDriver();
EventFiringWebDriver eventFiringDriver = new EventFiringWebDriver(driver);
WebDriverEventListenerUsingImplements eventListener = new WebDriverEventListenerUsingImplements();
eventFiringDriver.register(eventListener);
eventFiringDriver.get("http://localhost:8080/pages/forms.html");
driver.findElement(By.id("textElement")).sendKeys("new-textElement-value");
driver.findElement(By.id("textAreaElement")).sendKeys("new-textAreaElement-value");
eventFiringDriver.findElement(By.id("checkboxElement1")).click();
eventFiringDriver.findElement(By.id("checkboxElement2")).click();
driver.findElement(By.id("inlineCheckboxElement1")).click();
driver.findElement(By.id("inlineCheckboxElement2")).click();
List<WebElement> optionRadios = driver.findElements(By.name("optionsRadios"));
optionRadios.get(1).click();
List<WebElement> optionsRadiosInline = driver.findElements(By.name("optionsRadiosInline"));
optionsRadiosInline.get(1).click();
Select selectElement = new Select(driver.findElement(By.id("selectElement1")));// 1
selectElement.selectByValue("4");
Select multiSelectElement = new Select(driver.findElement(By.id("multiSelectElement")));// 1,3
multiSelectElement.selectByValue("5");
driver.close();
driver.quit();
}
```
#### /src/test/java/com/in28minutes/automation/webapp/basics/WebDriverEventListenerUsingExtends.java
```java
package com.in28minutes.automation.webapp.basics;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.events.AbstractWebDriverEventListener;
public class WebDriverEventListenerUsingExtends extends AbstractWebDriverEventListener{
@Override
public void beforeNavigateTo(String url, WebDriver driver) {
System.out.printf("We are at %s and we are navigating to %s \n", driver.getCurrentUrl(), url);
}
@Override
public void afterNavigateTo(String url, WebDriver driver) {
System.out.printf("We are at %s and we have navigated to %s \n", driver.getCurrentUrl(), url);
}
@Override
public void beforeNavigateBack(WebDriver driver) {
System.out.printf("We are at %s and we want to navigate back \n", driver.getCurrentUrl());
}
@Override
public void afterNavigateBack(WebDriver driver) {
System.out.printf("We are at %s and we completed the navigate back \n", driver.getCurrentUrl());
}
@Override
public void afterClickOn(WebElement element, WebDriver driver) {
System.out.printf("Element with tag %s and name %s is clicked \n", element.getTagName(), element.getAttribute("name"));
}
}
```
## Test NG Advanced Features
```java
//@Test(groups={"group-4"})
public class PlayingWithTestNGTest {
@Test(groups = { "group1" })
//Groups can be Unit Test, Integration Test, Performance etc
public void group1Test() {
System.out.println("Group 1 Test");
}
@Test(groups = { "group2" })
//Groups can be Unit Test, Integration Test etc
public void group2Test() {
System.out.println("Group 2 Test");
}
@AfterGroups(groups = { "group1" })
public void afterGroup1() {
System.out.println("After Group1");
}
@BeforeGroups(groups = { "group2" })
public void beforeGroup2() {
System.out.println("Before Group2");
}
@Test(timeOut = 1000)
public void timeoutTest() {
}
@Test(expectedExceptions = { Exception.class })
public void expectAnException() {
throw new RuntimeException("flkasdjf");
}
@Test(enabled = false)
public void ignoredTest() {
}
@Test
@Parameters({ "browser" })
public void browserSpecificTest(@Optional("firefox") String browser) {
System.out.println(browser);
}
@Test(dependsOnMethods="setupSomething")
//dependsOnGroups
public void thisTestNeedsSomethingSetup() {
System.out.println("I need something else");
}
@Test
public void setupSomething() {
System.out.println("Setup Something");
}
```
### /src/test/java/com/in28minutes/automation/TestNgResultListener.java
```java
package com.in28minutes.automation;
import org.testng.ITestContext;
import org.testng.ITestListener;
import org.testng.ITestResult;
public class TestNgResultListener implements ITestListener{
public void onFinish(ITestContext arg0) {
// TODO Auto-generated method stub
}
public void onStart(ITestContext arg0) {
// TODO Auto-generated method stub
}
public void onTestFailedButWithinSuccessPercentage(ITestResult arg0) {
// TODO Auto-generated method stub
}
public void onTestFailure(ITestResult arg0) {
System.out.println("Test Failed");
}
public void onTestSkipped(ITestResult arg0) {
// TODO Auto-generated method stub
}
public void onTestStart(ITestResult arg0) {
// TODO Auto-generated method stub
}
public void onTestSuccess(ITestResult arg0) {
System.out.println("Test Succeded");
}
}
```
---
### /src/test/java/com/in28minutes/automation/TestNgTestReporter.java
```java
package com.in28minutes.automation;
import java.util.List;
import java.util.Map;
import org.testng.IReporter;
import org.testng.ISuite;
import org.testng.ISuiteResult;
import org.testng.ITestContext;
import org.testng.xml.XmlSuite;
public class TestNgTestReporter implements IReporter {
public void generateReport(List<XmlSuite> xmlSuite, List<ISuite> iSuite, String outputDirectory) {
for(ISuite suite: iSuite) {
Map<String, ISuiteResult> results = suite.getResults();
for(ISuiteResult result:results.values()) {
ITestContext testContext = result.getTestContext();
System.out.println(testContext.getPassedTests());
}
}
}
}
```
================================================
FILE: code.md
================================================
## Complete Code Example
### CSS Selectors from html css basics
```
$$("input")
(10) [input#first-name, input#password, input, input, input, input, input, input, input, input]0: input#first-name1: input#password2: input3: input4: input5: input6: input7: input8: input9: inputlength: 10__proto__: Array(0)
$$("input[type='password']")
[input#password]0: input#passwordlength: 1__proto__: Array(0)
$$("input[type='text']")
[input#first-name]0: input#first-namelength: 1__proto__: Array(0)
$$("input[type='number']")
[input]
$$("input[type='radio']")
(4) [input, input, input, input]0: input1: input2: input3: inputlength: 4__proto__: Array(0)
$$("input[value='HTML']")
[input]0: inputlength: 1__proto__: Array(0)
$$("label")
(8) [label, label, label#update-profile-label, label, label, label, label, label]
$$("li")
(5) [li, li, li, li, li]
$$("select")
[select]
$$("option")
(4) [option, option, option, option]0:
$$("input[type='checkbox']")
[input]
```
### XPath Selectors from html css basics
```
$x("//input")
(10) [input#first-name, input#password, input, input, input, input, input, input, input, input]
$x("//input[@type='text']")
[input#first-name]
$x("//input[@type='checkbox']")
[input]
$x("//input[@type='password']")
[input#password]
$x("//input[@id='password']")
[input#password]
$x("//input[@id='first-name']")
[input#first-name]
$x("//label")
(8) [label, label, label#update-profile-label, label, label, label, label, label]
$x("//textarea")
[textarea]
$x("//input[type='number']")
[]
$x("//input[@type='number']")
[input]0: inputlength: 1__proto__: Array(0)
$x("//input[@type='radio']")
(4) [input, input, input, input]
$x("//select")
[select]
$x("//option")
(4) [option, option, option, option]
$x("//*[@id='first-name']")
[input#first-name]
$$("#first-name")
[input#first-name]
$x("//input[@type='radio']")
(4) [input, input, input, input]
```
### /html-basics/1-first-html.html
```html
<html>
<head>
<title>Learn Selenium and HTML</title>
</head>
<body>
This is the body of the page.
</body>
</html>
```
---
### /html-basics/2-second-html.html
```html
<html>
<head>
<title>Learn Selenium and HTML - 2</title>
</head>
<body>
<h1>Learning Automation Testing with Selenium and HTML</h1>
I want to learn
<ul>
<li>HTML</li>
<li>CSS</li>
<li>XPath</li>
<li>CSS Selectors</li>
<li>Selenium</li>
</ul>
<ol>
<li>HTML</li>
<li>CSS</li>
<li>XPath</li>
<li>CSS Selectors</li>
<li>Selenium</li>
</ol>
<p >Learning HTML and Selenium is awesome. The following steps are involved</p>
<h2>HTML</h2>
<p>First step is to learn HTML</p>
<h2>CSS</h2>
<p>Second step is to learn CSS</p>
<p>This is the body of the page.</p>
<p>Paragraph 2</p>
<p>Paragraph 3</p>
<div>Division 1</div>
<div>Division 2</div>
<div>Division 3</div>
<p>
<b>Paragraph which will be displayed in bold.</b>
</p>
<p>
<i>Paragraph which will be displayed in italicized.</i>
</p>
<hr/>
<blockquote>Ranga says - You become a great automation tester by learning atleast for an hour every day</blockquote>
<hr/>
<p>
Line1. <br/>
Line2. <br/>
Line3.
</p>
<hr/>
<abc>fkjsaklfjalk</abc>
<def>fkjsaklfjalk</def>
<efg/>
</body>
</html>
```
---
### /html-basics/3-tables.html
```html
<html>
<head>
<title>Learn Tables in HTML</title>
</head>
<body>
<table border="1">
<thead>
<tr>
<td>Football Player</td>
<td>Goals</td>
<td>Country</td>
</tr>
</thead>
<tbody>
<tr>
<td>Ronaldo</td>
<td>10</td>
<td>Portugal</td>
</tr>
<tr>
<td>Messi</td>
<td>10</td>
<td>Argentina</td>
</tr>
<tr>
<td>Player Name</td>
<td>6</td>
<td>Europe</td>
</tr>
<tr>
<td>Player Name 2</td>
<td>3</td>
<td>Europe</td>
</tr>
<tr>
<td>Player Name 3</td>
<td>4</td>
<td>Europe</td>
</tr>
</tbody>
</table>
<!-- Comment
table
thead
tr
td
td
tbody
tr
td
td
tr
td
td
Football Player Goals
Ronaldo 10
Messi 10
-->
</body>
</html>
```
---
### /html-basics/4-miscellaneous.html
```html
<html>
<head>
<title>Learn a few things in HTML</title>
</head>
<body>
<ol>
<li><a href="1-first-html.html">First HTML Page</a> </li>
<li><a href="http://www.in28minutes.com/">Go to in28minutes</a></li>
<li><a target="_blank" href="2-second-html.html"> Second HTML Page</a></li>
</ol>
<img border="1" src="https://avatars3.githubusercontent.com/u/14139137?s=460&v=4"/>
<img src="in28minutes-logo.png"/>
<br/>
<iframe src="http://www.in28minutes.com" height="400px" width="1000px">
IFrame is Not Supported</iframe>
</body>
</html>
```
---
### /html-basics/5-nesting-and-more.html
```html
<html>
<head>
<title>Learn Selenium and HTML 5</title>
</head>
<body>
<div>
<p align="right"> The great thing about HTML is that its simple to learn.
<a href="1-first-html.html">This is the first page we have created</a>
</p>
<p> This is the second thing we have learnt - <a href="2-second-html.html">Here is the link to it</a> </p>
</div>
</body>
</html>
```
---
### /html-basics/6-form.html
```html
<html>
<head>
<title>Learn Forms in HTML </title>
</head>
<body>
Let's get some data from the user:
<ul>
<li>Text</li>
<li>Lot of Text - in multiple lines</li>
<li>Select among options</li>
<li>Yes or No</li>
<li>Click a Button</li>
</ul>
<form method="post" action="accept-information.do">
<label>First Name</label>
<input type="text" name="first-name" size="15" maxlength="20" value="Ranga"/>
<label>Password</label>
<input type="password" name="password"/>
<label>Upload Profile Picture</label>
<input type="file" name="profile-picture"/>
<label>Age</label>
<input type="number" name="age" value="20"/>
<label>Describe Yourselves</label>
<textarea name="description" rows="5" cols="100"></textarea>
<br/>
<label>What do you want to learn?</label>
<input type="radio" name="what-to-learn" value="HTML">HTML
<input type="radio" name="what-to-learn" value="CSS" checked>CSS
<input type="radio" name="what-to-learn" value="AUT">Automation Testing
<input type="radio" name="what-to-learn" value="JAVA">Java
<BR/>
<label>How do you want to Learn?</label>
<select name="how-to-learn" multiple>
<option value="online">Online</option>
<option value="books">Books</option>
<option value="college" selected>College</option>
<option value="other">Other</option>
</select>
<BR/>
<input type="checkbox" name="drive" checked/>
<label>Do You Know to Drive?</label>
<input type="submit"/>
</form>
</body>
</html>
```
---
### /html-basics/7-form-with-css.html
```html
<html>
<head>
<title>Learn Forms in HTML with CSS</title>
<!-- CSS Selectors -->
<style type="text/css">
label {
font-size: 16px;
color: #111111;
}
input, textarea, select {
background-color: antiquewhite;
}
fieldset {
border: 0px;
padding: 20px;
background-color: #EEFFFF;
}
ul {
background-color: #EEFFEE;
}
li {
color: #666666;
}
</style>
</head>
<body>
Let's get some data from the user:
<ul>
<li>Text</li>
<li>Lot of Text - in multiple lines</li>
<li>Select among options</li>
<li>Yes or No</li>
<li>Click a Button</li>
</ul>
<form method="post" action="accept-information.do">
<fieldset>
<label >First Name</label>
<input type="text" name="first-name" size="15" maxlength="20" value="Ranga"/>
<label>Password</label>
<input type="password" name="password"/>
</fieldset>
<!--style="font-size: 25px"-->
<fieldset>
<label >Upload Profile Picture</label>
<input type="file" name="profile-picture"/>
</fieldset>
<fieldset>
<label>Age</label>
<input type="number" name="age" value="20"/>
<label>Describe Yourselves</label>
<textarea name="description" rows="5" cols="100"></textarea>
</fieldset>
<fieldset>
<label>What do you want to learn?</label>
<input type="radio" name="what-to-learn" value="HTML">HTML
<input type="radio" name="what-to-learn" value="CSS" checked>CSS
<input type="radio" name="what-to-learn" value="AUT">Automation Testing
<input type="radio" name="what-to-learn" value="JAVA">Java
</fieldset>
<fieldset>
<label>How do you want to Learn?</label>
<select name="how-to-learn" multiple>
<option value="online">Online</option>
<option value="books">Books</option>
<option value="college" selected>College</option>
<option value="other">Other</option>
</select>
</fieldset>
<fieldset>
<input type="checkbox" name="drive" checked/>
<label>Do You Know to Drive?</label>
</fieldset>
<fieldset>
<input type="submit"/>
</fieldset>
</form>
</body>
</html>
```
---
### /html-basics/8-form-with-external-css.html
```html
<html>
<head>
<title>Learn Forms in HTML with CSS</title>
<link rel="stylesheet" type="text/css" href="style.css"/>
<!--
CSS Selectors
~~~~~~~~~~~~~~~
$$("input")
(10) [input#first-name, input#password, input, input, input, input, input, input, input, input]0: input#first-name1: input#password2: input3: input4: input5: input6: input7: input8: input9: inputlength: 10__proto__: Array(0)
$$("input[type='password']")
[input#password]0: input#passwordlength: 1__proto__: Array(0)
$$("input[type='text']")
[input#first-name]0: input#first-namelength: 1__proto__: Array(0)
$$("input[type='number']")
[input]
$$("input[type='radio']")
(4) [input, input, input, input]0: input1: input2: input3: inputlength: 4__proto__: Array(0)
$$("input[value='HTML']")
[input]0: inputlength: 1__proto__: Array(0)
$$("label")
(8) [label, label, label#update-profile-label, label, label, label, label, label]
$$("li")
(5) [li, li, li, li, li]
$$("select")
[select]
$$("option")
(4) [option, option, option, option]0:
$$("input[type='checkbox']")
[input]
XPath Selectors
~~~~~~~~~~~~~~~
$x("//input")
(10) [input#first-name, input#password, input, input, input, input, input, input, input, input]
$x("//input[@type='text']")
[input#first-name]
$x("//input[@type='checkbox']")
[input]
$x("//input[@type='password']")
[input#password]
$x("//input[@id='password']")
[input#password]
$x("//input[@id='first-name']")
[input#first-name]
$x("//label")
(8) [label, label, label#update-profile-label, label, label, label, label, label]
$x("//textarea")
[textarea]
$x("//input[type='number']")
[]
$x("//input[@type='number']")
[input]0: inputlength: 1__proto__: Array(0)
$x("//input[@type='radio']")
(4) [input, input, input, input]
$x("//select")
[select]
$x("//option")
(4) [option, option, option, option]
$x("//*[@id='first-name']")
[input#first-name]
$$("#first-name")
[input#first-name]
$x("//input[@type='radio']")
(4) [input, input, input, input]
-->
</head>
<body>
Let's get some data from the user:
<ul>
<li>Text</li>
<li>Lot of Text - in multiple lines</li>
<li>Select among options</li>
<li>Yes or No</li>
<li>Click a Button</li>
</ul>
<form method="post" action="accept-information.do">
<fieldset>
<label >First Name</label>
<input type="text" name="first-name" id="first-name" size="15" maxlength="20" value="Ranga"/>
<label>Password</label>
<input type="password" id="password" name="password"/>
</fieldset>
<!--style="font-size: 25px"-->
<fieldset>
<label id="update-profile-label">Upload Profile Picture</label>
<input type="file" name="profile-picture"/>
</fieldset>
<fieldset>
<label>Age</label>
<input type="number" name="age" value="20"/>
<label>Describe Yourselves</label>
<textarea name="description" rows="5" cols="100"></textarea>
</fieldset>
<fieldset>
<label>What do you want to learn?</label>
<input type="radio" name="what-to-learn" value="HTML">HTML
<input type="radio" name="what-to-learn" value="CSS" checked>CSS
<input type="radio" name="what-to-learn" value="AUT">Automation Testing
<input type="radio" name="what-to-learn" value="JAVA">Java
</fieldset>
<fieldset>
<label>How do you want to Learn?</label>
<select name="how-to-learn" multiple>
<option value="online">Online</option>
<option value="books">Books</option>
<option value="college" selected>College</option>
<option value="other">Other</option>
</select>
</fieldset>
<fieldset>
<input type="checkbox" name="drive" checked/>
<label>Do You Know to Drive?</label>
</fieldset>
<fieldset>
<input type="submit" />
</fieldset>
</form>
</body>
</html>
```
---
### /html-basics/9-id-and-class.html
```html
<html>
<head>
<title>ID and Class in CSS</title>
<!-- CSS Selectors -->
<style type="text/css">
p {
color : brown;
}
div p {
color : royalblue;
}
h2 {
color : green;
}
p .second-paragraph {
color:red;
}
.first-paragraph {
color:orange;
}
.important-thing {
background-color: yellow;
}
#html-important-point{
background-color: #EEEEEE;
}
#important-point-outside-div{
background-color: bisque;
}
</style>
<!--
CSS Selectors
~~~~~~~~~~~~~
$$("p")
(10) [p, p.first-paragraph.important-thing, p.second-paragraph, p#html-important-point, p#important-point-outside-div, p, p.first-paragraph, p.second-paragraph, p.first-paragraph, p.second-paragraph]
$$("div p")
(8) [p.first-paragraph.important-thing, p.second-paragraph, p#html-important-point, p, p.first-paragraph, p.second-paragraph, p.first-paragraph, p.second-paragraph]
$$(".first-paragraph")
(3) [p.first-paragraph.important-thing, p.first-paragraph, p.first-paragraph]
$$(".second-paragraph")
(4) [h1.second-paragraph, p.second-paragraph, p.second-paragraph, p.second-paragraph]
$$("p .second-paragraph")
[]
$$("p.second-paragraph")
(3) [p.second-paragraph, p.second-paragraph, p.second-paragraph]
$$("h2")
(3) [h2, h2, h2]
$$("h1")
[h1.second-paragraph]0: h1.second-paragraphlength: 1__proto__: Array(0)
$$("#html-important-point")
[p#html-important-point]
XPATH Selectors
~~~~~~~~~~~~~~~
$$("p")
(10) [p, p.first-paragraph.important-thing, p.second-paragraph, p#html-important-point, p#important-point-outside-div, p, p.first-paragraph, p.second-paragraph, p.first-paragraph, p.second-paragraph]
$$("h1")
[h1.second-paragraph]
$x("h1")
[]
$x("/html/body/h1")
[h1.second-paragraph]
$x("//h1")
[h1.second-paragraph]
$x("//p")
(10) [p, p.first-paragraph.important-thing, p.second-paragraph, p#html-important-point, p#important-point-outside-div, p, p.first-paragraph, p.second-paragraph, p.first-paragraph, p.second-paragraph]
$x("//h2")
(3) [h2, h2, h2]
$x("//h2[1]")
[h2]
$x("//h2[2]")
[h2]
$x("//h2[last()]")
[h2]
$x("//p")
(10) [p, p.first-paragraph.important-thing, p.second-paragraph, p#html-important-point, p#important-point-outside-div, p, p.first-paragraph, p.second-paragraph, p.first-paragraph, p.second-paragraph]
$x("//p[@id='html-important-point']")
[p#html-important-point]0: p#html-important-pointlength: 1__proto__: Array(0)
$$("#html-important-point")
[p#html-important-point]
$x("//p[@class='first-paragraph']")
(2) [p.first-paragraph, p.first-paragraph]
$$(".first-paragraph")
(3) [p.first-paragraph.important-thing, p.first-paragraph, p.first-paragraph]
body
/html/body //body
/html/body/h1 //h1
body > h1
body > p:nth-child(2)
-->
</head>
<body>
<h1 class="second-paragraph">Learn Automation Testing</h1>
<p>Main Paragraph</p>
<h2>HTML and CSS</h2>
<div>
<p class="first-paragraph important-thing">First Paragraph</p>
<p class="second-paragraph">Second Paragraph</p>
<p id="html-important-point">An important point about HTML</p>
</div>
<p id="important-point-outside-div">Paragraph outside div</p>
<div><p>Paragraph inside div</p></div>
<h2>Language</h2>
<div>
<p class="first-paragraph">First Paragraph</p>
<p class="second-paragraph">Second Paragraph</p>
</div>
<h2>Selenium</h2>
<div>
<p class="first-paragraph">First Paragraph</p>
<p class="second-paragraph">Second Paragraph</p>
</div>
</body>
</html>
```
---
### /html-basics/style.css
```css
label {
font-size: 16px;
color: #111111;
}
input, textarea, select {
background-color: antiquewhite;
}
fieldset {
border: 0px;
padding: 20px;
background-color: #EEFFFF;
}
ul {
background-color: #EEFFEE;
}
li {
color: #666666;
}
```
---
### /junit-basics/src/test/java/com/example/tests/FacebookLogin.java
```java
package com.example.tests;
import static org.junit.Assert.fail;
import java.util.concurrent.TimeUnit;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.NoAlertPresentException;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import io.github.bonigarcia.wdm.ChromeDriverManager;
public class FacebookLogin {
private WebDriver driver;
private String baseUrl;
private boolean acceptNextAlert = true;
private StringBuffer verificationErrors = new StringBuffer();
@Before
public void setUp() throws Exception {
ChromeDriverManager.getInstance().setup();
driver = new ChromeDriver();
baseUrl = "https://www.katalon.com/";
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}
@Test
public void testFacebookLogin() throws Exception {
driver.get("https://www.facebook.com/");
driver.findElement(By.id("email")).click();
driver.findElement(By.id("email")).clear();
driver.findElement(By.id("email")).sendKeys("in28minutes");
driver.findElement(By.id("pass")).clear();
driver.findElement(By.id("pass")).sendKeys("dummy");
driver.findElement(By.id("pass")).sendKeys(Keys.ENTER);
}
@After
public void tearDown() throws Exception {
driver.quit();
String verificationErrorString = verificationErrors.toString();
if (!"".equals(verificationErrorString)) {
fail(verificationErrorString);
}
}
private boolean isElementPresent(By by) {
try {
driver.findElement(by);
return true;
} catch (NoSuchElementException e) {
return false;
}
}
private boolean isAlertPresent() {
try {
driver.switchTo().alert();
return true;
} catch (NoAlertPresentException e) {
return false;
}
}
private String closeAlertAndGetItsText() {
try {
Alert alert = driver.switchTo().alert();
String alertText = alert.getText();
if (acceptNextAlert) {
alert.accept();
} else {
alert.dismiss();
}
return alertText;
} finally {
acceptNextAlert = true;
}
}
}
```
---
### /junit-basics/src/test/java/com/example/tests/GoogleSearchForIn28minutes.java
```java
package com.example.tests;
import static org.junit.Assert.fail;
import java.util.concurrent.TimeUnit;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.NoAlertPresentException;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import io.github.bonigarcia.wdm.ChromeDriverManager;
public class GoogleSearchForIn28minutes {
private WebDriver driver;
private String baseUrl;
private boolean acceptNextAlert = true;
private StringBuffer verificationErrors = new StringBuffer();
@Before
public void setUp() throws Exception {
ChromeDriverManager.getInstance().setup();
driver = new ChromeDriver();
baseUrl = "https://www.katalon.com/";
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}
@Test
public void testGoogleSearchForIn28minutes() throws Exception {
driver.get("https://www.google.com/");
driver.findElement(By.id("lst-ib")).click();
driver.findElement(By.id("lst-ib")).clear();
driver.findElement(By.id("lst-ib")).sendKeys("in28minutes");
driver.findElement(By.id("lst-ib")).sendKeys(Keys.ENTER);
}
@After
public void tearDown() throws Exception {
driver.quit();
String verificationErrorString = verificationErrors.toString();
if (!"".equals(verificationErrorString)) {
fail(verificationErrorString);
}
}
private boolean isElementPresent(By by) {
try {
driver.findElement(by);
return true;
} catch (NoSuchElementException e) {
return false;
}
}
private boolean isAlertPresent() {
try {
driver.switchTo().alert();
return true;
} catch (NoAlertPresentException e) {
return false;
}
}
private String closeAlertAndGetItsText() {
try {
Alert alert = driver.switchTo().alert();
String alertText = alert.getText();
if (acceptNextAlert) {
alert.accept();
} else {
alert.dismiss();
}
return alertText;
} finally {
acceptNextAlert = true;
}
}
}
```
---
### /junit-basics/src/test/java/com/in28minutes/tests/FirstJUnitTest.java
```java
package com.in28minutes.tests;
import static org.junit.Assert.*;
import org.junit.Test;
class SimpleClass {
public int sum(int[] numbers) {
int sum = 0;
for(int i=0; i<numbers.length; i++) {
sum += numbers[i];
}
return sum;
}
}
public class FirstJUnitTest {
@Test
public void test() {
//Execute the Code
SimpleClass simpleClass = new SimpleClass();
int actualResult = simpleClass.sum( new int[] {12, 15, 18});
//Check the Output
int expectedResult = 45;
//check expectedResult is equal to actualResult
assertEquals(expectedResult, actualResult);
//No checks
//Checks
//Absence of Failure is Success
}
@Test
public void testFor0Elements() {
//Execute the Code
SimpleClass simpleClass = new SimpleClass();
int actualResult = simpleClass.sum( new int[] {});
//Check the Output
int expectedResult = 0;
//check expectedResult is equal to actualResult
assertEquals(expectedResult, actualResult);
//No checks
//Checks
//Absence of Failure is Success
}
@Test
public void testFor2Elements() {
//Execute the Code
SimpleClass simpleClass = new SimpleClass();
int actualResult = simpleClass.sum( new int[] {12, 15});
//Check the Output
int expectedResult = 27;
//check expectedResult is equal to actualResult
assertEquals(expectedResult, actualResult);
//No checks
//Checks
//Absence of Failure is Success
}
@Test
public void testFor5Elements() {
//Execute the Code
SimpleClass simpleClass = new SimpleClass();
int actualResult = simpleClass.sum( new int[] {2, 6, 8, 15, 18});
//Check the Output
int expectedResult = 49;
//check expectedResult is equal to actualResult
assertEquals(expectedResult, actualResult);
//No checks
//Checks
//Absence of Failure is Success
}
}
```
---
### /junit-basics/src/test/java/com/in28minutes/tests/FirstSeleniumJUnitTest.java
```java
package com.in28minutes.tests;
import static org.junit.Assert.assertEquals;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import io.github.bonigarcia.wdm.WebDriverManager;
public class FirstSeleniumJUnitTest {
WebDriver webDriver;
@Before
public void before() {
// Execute the Code
// Download the Web Driver Executable
// Set the path to Web Driver Executable
WebDriverManager.chromedriver().setup();
// Create an instance of WebDriver
webDriver = new ChromeDriver();
}
@Test
public void testGoogleDotCom() {
// WebDriver - Launch up http://www.google.com
webDriver.get("http://www.google.com");
// https://www.google.com/?gws_rd=ssl
// System.out.println(webDriver.getCurrentUrl());
// System.out.println(webDriver.getTitle());
String actualTitle = webDriver.getTitle();
String expectedTitle = "Google";
// Check the output
// WebDriver - Title is Google
assertEquals(expectedTitle, actualTitle);
}
@Test
public void testFacebookDotCom() {
webDriver.get("http://www.facebook.com");
String actualTitle = webDriver.getTitle();
String expectedTitle = "Facebook – log in or sign up";
// Check the output
assertEquals(expectedTitle, actualTitle);
}
@Test
@Ignore
public void testSomeErrorScenarioCom() {
webDriver.get("com");
String actualTitle = webDriver.getTitle();
String expectedTitle = "Facebook – log in or sign up";
// Check the output
assertEquals(expectedTitle, actualTitle);
}
@After
public void after() {
System.out.println("I'm, Executed");
webDriver.quit();
}
}
// org.openqa.selenium.WebDriverException:
// unknown error: unhandled inspector error:
// {"code":-32000,"message":"Cannot navigate to invalid URL"}
```
---
### /testng-basics/src/test/java/com/example/tests/FacebookLogin.java
```java
package com.example.tests;
import java.util.regex.Pattern;
import java.util.concurrent.TimeUnit;
import org.testng.annotations.*;
import io.github.bonigarcia.wdm.ChromeDriverManager;
import static org.testng.Assert.*;
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.Select;
public class FacebookLogin {
private WebDriver driver;
private String baseUrl;
private boolean acceptNextAlert = true;
private StringBuffer verificationErrors = new StringBuffer();
@BeforeClass(alwaysRun = true)
public void setUp() throws Exception {
ChromeDriverManager.getInstance().setup();
driver = new ChromeDriver();
baseUrl = "https://www.katalon.com/";
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}
@Test
public void testFacebookLogin() throws Exception {
driver.get("https://www.facebook.com/");
driver.findElement(By.id("email")).click();
driver.findElement(By.id("email")).clear();
driver.findElement(By.id("email")).sendKeys("in28minutes");
driver.findElement(By.id("pass")).clear();
driver.findElement(By.id("pass")).sendKeys("dummy");
driver.findElement(By.id("pass")).sendKeys(Keys.ENTER);
}
@AfterClass(alwaysRun = true)
public void tearDown() throws Exception {
driver.quit();
String verificationErrorString = verificationErrors.toString();
if (!"".equals(verificationErrorString)) {
fail(verificationErrorString);
}
}
private boolean isElementPresent(By by) {
try {
driver.findElement(by);
return true;
} catch (NoSuchElementException e) {
return false;
}
}
private boolean isAlertPresent() {
try {
driver.switchTo().alert();
return true;
} catch (NoAlertPresentException e) {
return false;
}
}
private String closeAlertAndGetItsText() {
try {
Alert alert = driver.switchTo().alert();
String alertText = alert.getText();
if (acceptNextAlert) {
alert.accept();
} else {
alert.dismiss();
}
return alertText;
} finally {
acceptNextAlert = true;
}
}
}
```
---
### /testng-basics/src/test/java/com/example/tests/GoogleSearchForIn28minutes.java
```java
package com.example.tests;
import static org.testng.Assert.fail;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.NoAlertPresentException;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import io.github.bonigarcia.wdm.ChromeDriverManager;
public class GoogleSearchForIn28minutes {
private WebDriver driver;
private String baseUrl;
private boolean acceptNextAlert = true;
private StringBuffer verificationErrors = new StringBuffer();
@BeforeClass(alwaysRun = true)
public void setUp() throws Exception {
ChromeDriverManager.getInstance().setup();
driver = new ChromeDriver();
baseUrl = "https://www.katalon.com/";
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}
@Test
public void testGoogleSearchForIn28minutes() throws Exception {
driver.get("https://www.google.com/");
driver.findElement(By.id("lst-ib")).click();
driver.findElement(By.id("lst-ib")).clear();
driver.findElement(By.id("lst-ib")).sendKeys("in28minutes");
driver.findElement(By.id("lst-ib")).sendKeys(Keys.ENTER);
}
@AfterClass(alwaysRun = true)
public void tearDown() throws Exception {
driver.quit();
String verificationErrorString = verificationErrors.toString();
if (!"".equals(verificationErrorString)) {
fail(verificationErrorString);
}
}
private boolean isElementPresent(By by) {
try {
driver.findElement(by);
return true;
} catch (NoSuchElementException e) {
return false;
}
}
private boolean isAlertPresent() {
try {
driver.switchTo().alert();
return true;
} catch (NoAlertPresentException e) {
return false;
}
}
private String closeAlertAndGetItsText() {
try {
Alert alert = driver.switchTo().alert();
String alertText = alert.getText();
if (acceptNextAlert) {
alert.accept();
} else {
alert.dismiss();
}
return alertText;
} finally {
acceptNextAlert = true;
}
}
}
```
---
### /testng-basics/src/test/java/com/in28minutes/test/testng/FirstSeleniumTestNgTest.java
```java
package com.in28minutes.test.testng;
import static org.testng.Assert.assertEquals;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Ignore;
import org.testng.annotations.Test;
import io.github.bonigarcia.wdm.WebDriverManager;
public class FirstSeleniumTestNgTest {
WebDriver webDriver;
@BeforeTest
public void before() {
// Execute the Code
// Download the Web Driver Executable
// Set the path to Web Driver Executable
WebDriverManager.chromedriver().setup();
// Create an instance of WebDriver
webDriver = new ChromeDriver();
}
@Test
public void testGoogleDotCom() {
// WebDriver - Launch up http://www.google.com
webDriver.get("http://www.google.com");
// https://www.google.com/?gws_rd=ssl
// System.out.println(webDriver.getCurrentUrl());
// System.out.println(webDriver.getTitle());
String actualTitle = webDriver.getTitle();
String expectedTitle = "Google";
// Check the output
// WebDriver - Title is Google
assertEquals(expectedTitle, actualTitle);
}
@Test
public void testFacebookDotCom() {
webDriver.get("http://www.facebook.com");
String actualTitle = webDriver.getTitle();
String expectedTitle = "Facebook – log in or sign up";
// Check the output
assertEquals(expectedTitle, actualTitle);
}
@Test
@Ignore
public void testSomeErrorScenarioCom() {
webDriver.get("com");
String actualTitle = webDriver.getTitle();
String expectedTitle = "Facebook – log in or sign up";
// Check the output
assertEquals(expectedTitle, actualTitle);
}
@AfterTest
public void after() {
System.out.println("I'm, Executed");
webDriver.quit();
}
}
// org.openqa.selenium.WebDriverException:
// unknown error: unhandled inspector error:
// {"code":-32000,"message":"Cannot navigate to invalid URL"}
```
---
### /testng-basics/src/test/java/com/in28minutes/test/testng/FirstTestngTest.java
```java
package com.in28minutes.test.testng;
import static org.testng.Assert.assertEquals;
import org.testng.annotations.Test;
class SimpleClass {
public int sum(int[] numbers) {
int sum = 0;
for(int i=0; i<numbers.length; i++) {
sum += numbers[i];
}
return sum;
}
}
public class FirstTestngTest {
@Test
public void test() {
//Execute the Code
SimpleClass simpleClass = new SimpleClass();
int actualResult = simpleClass.sum( new int[] {12, 15, 18});
//Check the Output
int expectedResult = 45;
//check expectedResult is equal to actualResult
assertEquals(expectedResult, actualResult);
//No checks
//Checks
//Absence of Failure is Success
}
@Test
public void testFor0Elements() {
//Execute the Code
SimpleClass simpleClass = new SimpleClass();
int actualResult = simpleClass.sum( new int[] {});
//Check the Output
int expectedResult = 0;
//check expectedResult is equal to actualResult
assertEquals(expectedResult, actualResult);
//No checks
//Checks
//Absence of Failure is Success
}
@Test
public void testFor2Elements() {
//Execute the Code
SimpleClass simpleClass = new SimpleClass();
int actualResult = simpleClass.sum( new int[] {12, 15});
//Check the Output
int expectedResult = 27;
//check expectedResult is equal to actualResult
assertEquals(expectedResult, actualResult);
//No checks
//Checks
//Absence of Failure is Success
}
@Test
public void testFor5Elements() {
//Execute the Code
SimpleClass simpleClass = new SimpleClass();
int actualResult = simpleClass.sum( new int[] {2, 6, 8, 15, 18});
//Check the Output
int expectedResult = 49;
//check expectedResult is equal to actualResult
assertEquals(expectedResult, actualResult);
//No checks
//Checks
//Absence of Failure is Success
}
}
```
---
### /testng-basics/src/test/java/com/in28minutes/test/testng/MultipleBrowserTest.java
```java
package com.in28minutes.test.testng;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
public class MultipleBrowserTest {
@Parameters("browser")
@Test
public void runInBrowser(String browser) {
System.out.println(browser);
}
}
```
---
### /web-driver-1-basics/src/test/java/com/in28minutes/webdriver/basics/AbstractChromeWebDriverTest.java
```java
package com.in28minutes.webdriver.basics;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import io.github.bonigarcia.wdm.WebDriverManager;
public abstract class AbstractChromeWebDriverTest {
protected WebDriver driver;
public AbstractChromeWebDriverTest() {
super();
}
@BeforeTest
public void beforeTest() {
//Download the web driver executable
WebDriverManager.chromedriver().setup();
//Create a instance of your web driver - chrome
driver = new ChromeDriver();
}
@AfterTest
public void afterTest() {
driver.quit();
}
public void sleep(int seconds) {
try {
Thread.sleep(seconds * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
```
---
### /web-driver-1-basics/src/test/java/com/in28minutes/webdriver/basics/form/FormElementCheckBoxTest.java
```java
package com.in28minutes.webdriver.basics.form;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertTrue;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.testng.annotations.Test;
import com.in28minutes.webdriver.basics.AbstractChromeWebDriverTest;
public class FormElementCheckBoxTest extends AbstractChromeWebDriverTest {
@Test
public void readFromACheckBox() {
driver.get("http://localhost:8080/pages/forms.html");
WebElement checkboxElement1 = driver.findElement(By.name("checkboxElement1"));
System.out.println(checkboxElement1.isSelected());//false
assertFalse(checkboxElement1.isSelected());
WebElement checkboxElement2 = driver.findElement(By.name("checkboxElement2"));
System.out.println(checkboxElement2.isSelected());//true
assertTrue(checkboxElement2.isSelected());
}
@Test
public void setAValueIntoCheckBoxElement1() {
driver.get("http://localhost:8080/pages/forms.html");
WebElement checkboxElement1 = driver.findElement(By.name("checkboxElement1"));
sleep(4);
checkboxElement1.click();
sleep(4);
WebElement checkboxElement3 = driver.findElement(By.name("checkboxElement3"));
sleep(4);
checkboxElement3.click();
sleep(4);
}
@Test
public void checkACheckBox() {
driver.get("http://localhost:8080/pages/forms.html");
checkACheckBox("checkboxElement1");
sleep(2);
checkACheckBox("checkboxElement2");
sleep(2);
checkACheckBox("checkboxElement3");
checkACheckBox("inlineCheckboxElement1");
checkACheckBox("inlineCheckboxElement2");
checkACheckBox("inlineCheckboxElement3");
sleep(4);
}
@Test
public void unCheckACheckBox() {
driver.get("http://localhost:8080/pages/forms.html");
unCheckACheckBox("checkboxElement1");
sleep(2);
unCheckACheckBox("checkboxElement2");
sleep(2);
unCheckACheckBox("checkboxElement3");
unCheckACheckBox("inlineCheckboxElement1");
unCheckACheckBox("inlineCheckboxElement2");
unCheckACheckBox("inlineCheckboxElement3");
sleep(4);
}
private void checkACheckBox(String checkboxName) {
WebElement checkboxElement1 = driver.findElement(By.name(checkboxName));
boolean currentValue = checkboxElement1.isSelected();
if(currentValue==false) {
checkboxElement1.click();
}
}
private void unCheckACheckBox(String checkboxName) {
WebElement checkboxElement1 = driver.findElement(By.name(checkboxName));
boolean currentValue = checkboxElement1.isSelected();
if(currentValue==true) {
checkboxElement1.click();
}
}
}
```
---
### /web-driver-1-basics/src/test/java/com/in28minutes/webdriver/basics/form/FormElementRadioButtonTest.java
```java
package com.in28minutes.webdriver.basics.form;
import java.util.List;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.testng.annotations.Test;
import com.in28minutes.webdriver.basics.AbstractChromeWebDriverTest;
public class FormElementRadioButtonTest extends AbstractChromeWebDriverTest {
@Test
public void readFromARadioButton() {
driver.get("http://localhost:8080/pages/forms.html");
List<WebElement> options = driver.findElements(By.name("optionsRadios"));
for (WebElement option : options) {
System.out.println(option.getAttribute("value") + " " + option.isSelected());
}
// option1 false
// option2 false
// option3 true
}
@Test
public void readFromARadioButtonWithAFrameworkMethod() {
driver.get("http://localhost:8080/pages/forms.html");
System.out.println(getSelectedRadioButtonValue("optionsRadios"));// option3
System.out.println(getSelectedRadioButtonValue("optionsRadiosInline"));
}
@Test
public void setValueForRadioButton() {
driver.get("http://localhost:8080/pages/forms.html");
List<WebElement> options = driver.findElements(By.name("optionsRadios"));
sleep(4);
for (WebElement option : options) {
if (option.getAttribute("value").equals("option2")) {
option.click();
}
}
sleep(4);
}
@Test
public void setValueForRadioButtonWithAFrameworkMethod() {
driver.get("http://localhost:8080/pages/forms.html");
sleep(4);
setRadioButtonToValue("optionsRadios", "option2");
sleep(4);
setRadioButtonToValue("optionsRadiosInline", "inline-option1");
}
private void setRadioButtonToValue(String radioButtonName, String valueToSelect) {
List<WebElement> options = driver.findElements(By.name(radioButtonName));
for (WebElement option : options) {
if (option.getAttribute("value").equals(valueToSelect)) {
option.click();
}
}
}
private String getSelectedRadioButtonValue(String name) {
List<WebElement> options = driver.findElements(By.name(name));
for (WebElement option : options) {
if (option.isSelected()) {
return option.getAttribute("value");
}
}
return null;
}
@Test
public void setValueForRadioButtonWithAFrameworkMethod_UsingCSS() {
driver.get("http://localhost:8080/pages/forms.html");
sleep(4);
setRadioButtonToValueUsingCSS("optionsRadios", "option2");
sleep(4);
setRadioButtonToValueUsingCSS("optionsRadiosInline", "inline-option1");
sleep(4);
}
private void setRadioButtonToValueUsingCSS(String radioButtonName, String valueToSelect) {
String cssSelector = "input[name='" + radioButtonName + "'][value='" + valueToSelect + "']";
WebElement option = driver.findElement(By.cssSelector(cssSelector));
option.click();
}
@Test
public void setValueForRadioButtonWithAFrameworkMethod_UsingXPath() {
driver.get("http://localhost:8080/pages/forms.html");
sleep(4);
setRadioButtonToValueUsingXPath("optionsRadios", "option2");
sleep(4);
setRadioButtonToValueUsingXPath("optionsRadiosInline", "inline-option1");
sleep(4);
}
private void setRadioButtonToValueUsingXPath(String radioButtonName, String valueToSelect) {
String cssSelector = "//input[@name='" + radioButtonName + "'][@value='" + valueToSelect + "']";
WebElement option = driver.findElement(By.xpath(cssSelector));
option.click();
}
}
```
---
### /web-driver-1-basics/src/test/java/com/in28minutes/webdriver/basics/form/FormElementSelectTest.java
```java
package com.in28minutes.webdriver.basics.form;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.Select;
import org.testng.annotations.Test;
import com.in28minutes.webdriver.basics.AbstractChromeWebDriverTest;
public class FormElementSelectTest extends AbstractChromeWebDriverTest {
@Test
public void readValueOfSelectBox() {
driver.get("http://localhost:8080/pages/forms.html");
WebElement selectElement = driver.findElement(By.id("selectElement1"));
Select select = new Select(selectElement);
System.out.println(select.isMultiple());
System.out.println(select.getFirstSelectedOption().getText());
}
@Test
public void readValueFromMultiSelectBox() {
driver.get("http://localhost:8080/pages/forms.html");
WebElement selectElement = driver.findElement(By.id("multiSelectElement"));
Select select = new Select(selectElement);
System.out.println(select.isMultiple());//true
System.out.println(select.getFirstSelectedOption().getText());//One
for (WebElement element : select.getAllSelectedOptions()) {
System.out.println(element.getText());//One,Three
}
}
@Test
public void setValuesIntoSelectBox() {
driver.get("http://localhost:8080/pages/forms.html");
WebElement selectElement = driver.findElement(By.id("selectElement1"));
sleep(5);
Select select = new Select(selectElement);
select.selectByValue("2");
sleep(5);
select.selectByVisibleText("Five");
sleep(5);
select.selectByIndex(3);
sleep(5);
System.out.println(select.isMultiple());
System.out.println(select.getFirstSelectedOption().getText());
}
@Test
public void setValuesIntoMultiSelectBox() {
driver.get("http://localhost:8080/pages/forms.html");
WebElement selectElement = driver.findElement(By.id("multiSelectElement"));
sleep(5);
Select select = new Select(selectElement);
select.deselectAll();
sleep(3);
select.selectByValue("2");
sleep(3);
select.selectByVisibleText("Five");
sleep(3);
select.selectByIndex(3);
sleep(3);
select.deselectByVisibleText("Four");
sleep(3);
System.out.println(select.isMultiple());
System.out.println(select.getFirstSelectedOption().getText());
}
}
```
---
### /web-driver-1-basics/src/test/java/com/in28minutes/webdriver/basics/form/FormElementTextTest.java
```java
package com.in28minutes.webdriver.basics.form;
import static org.testng.Assert.assertEquals;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.testng.annotations.Test;
import com.in28minutes.webdriver.basics.AbstractChromeWebDriverTest;
public class FormElementTextTest extends AbstractChromeWebDriverTest {
@Test
public void readFromATextElement() {
driver.get("http://localhost:8080/pages/forms.html");
assertEquals(
driver.findElement(By.id("textElement")).getAttribute("value"),
"in28minutes");
}
@Test
public void setASpecificValueIntoTextElement() {
driver.get("http://localhost:8080/pages/forms.html");
WebElement textElement = driver.findElement(By.id("textElement"));
sleep(4);
textElement.clear();
textElement.sendKeys("NewValue");
sleep(4);
}
@Test
public void writeAndReadAValueFromTextArea() {
driver.get("http://localhost:8080/pages/forms.html");
WebElement textArea = driver.findElement(By.id("textAreaElement"));
assertEquals(textArea.getAttribute("value"),"");
sleep(4);
textArea.clear();
textArea.sendKeys("FirstLine");
textArea.sendKeys("\n");
textArea.sendKeys("SecondLine");
sleep(4);
System.out.println(textArea.getAttribute("value"));
assertEquals(textArea.getAttribute("value"),"FirstLine\nSecondLine");
}
}
```
---
### /web-driver-1-basics/src/test/java/com/in28minutes/webdriver/basics/WebDriverBasicsLocatorsPerformanceTest.java
```java
package com.in28minutes.webdriver.basics;
import static org.testng.Assert.assertEquals;
import java.util.List;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.testng.annotations.Test;
public class WebDriverBasicsLocatorsPerformanceTest extends AbstractChromeWebDriverTest{
@Test
public void testCssSelectorForMultipleTableTd() {
driver.get("http://localhost:8080/pages/tables.html");
WebElement browserRow1 = driver.findElement(
By.cssSelector("#dataTables-example > tbody > tr:nth-child(1) > td:nth-child(2)"));
WebElement browserRow2 = driver.findElement(
By.cssSelector("#dataTables-example > tbody > tr:nth-child(2) > td:nth-child(2)"));
WebElement browserRow3 = driver.findElement(
By.cssSelector("#dataTables-example > tbody > tr:nth-child(3) > td:nth-child(2)"));
assertEquals(browserRow1.getText(), "Firefox 1.0");
assertEquals(browserRow2.getText(), "Firefox 1.5");
assertEquals(browserRow3.getText(), "Firefox 2.0");
}
@Test
public void testCssSelectorForMultipleTableTd_MorePerformance() {
driver.get("http://localhost:8080/pages/tables.html");
WebElement tableTbody = driver.findElement(
By.cssSelector("#dataTables-example > tbody"));
WebElement browserRow1 =
tableTbody.findElement(By.cssSelector("tr:nth-child(1) > td:nth-child(2)"));
WebElement browserRow2 =
tableTbody.findElement(By.cssSelector("tr:nth-child(2) > td:nth-child(2)"));
WebElement browserRow3 =
tableTbody.findElement(By.cssSelector("tr:nth-child(3) > td:nth-child(2)"));
assertEquals(browserRow1.getText(), "Firefox 1.0");
assertEquals(browserRow2.getText(), "Firefox 1.5");
assertEquals(browserRow3.getText(), "Firefox 2.0");
}
}
```
---
### /web-driver-1-basics/src/test/java/com/in28minutes/webdriver/basics/WebDriverBasicsLocatorsWithClassTest.java
```java
package com.in28minutes.webdriver.basics;
import static org.testng.Assert.assertEquals;
import java.util.List;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.testng.annotations.Test;
public class WebDriverBasicsLocatorsWithClassTest extends AbstractChromeWebDriverTest{
@Test
public void testTitle() {
driver.get("http://localhost:8080/pages/index.html");
WebElement title = driver.findElement(By.className("navbar-brand"));
assertEquals(title.getText(), "SB Admin v2.0");
}
//huge
@Test
public void testHugeTextElements() {
driver.get("http://localhost:8080/pages/index.html");
List<WebElement> hugeElements = driver.findElements(By.className("huge"));
for(WebElement element: hugeElements) {
System.out.println(element.getText());
}
}
}
```
---
### /web-driver-1-basics/src/test/java/com/in28minutes/webdriver/basics/WebDriverBasicsLocatorsWithCSSSelectorTest.java
```java
package com.in28minutes.webdriver.basics;
import static org.testng.Assert.assertEquals;
import java.util.List;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.testng.annotations.Test;
public class WebDriverBasicsLocatorsWithCSSSelectorTest extends AbstractChromeWebDriverTest {
@Test
public void testCssSelectorForaTableTd() {
driver.get("http://localhost:8080/pages/tables.html");
WebElement browserRow1 = driver
.findElement(By.cssSelector("#dataTables-example > tbody > tr:nth-child(1) > td:nth-child(2)"));
assertEquals(browserRow1.getText(), "Firefox 1.0");
}
// $$("#dataTables-example > thead > tr > th:nth-child(2)")
// [th.sorting]0: th.sortinglength: 1__proto__: Array(0)
// $$("#dataTables-example > tbody > tr.gradeU.odd > td.sorting_1")
// [td.sorting_1]
@Test
public void testCssSelectorForSortingAndCheckingFirstRow() {
driver.get("http://localhost:8080/pages/tables.html");
/*
* <tr class="gradeA odd" role="row"> <td class="sorting_1">Gecko</td>
* <td>Firefox 1.0</td> <td>Win 98+ / OSX.2+</td> <td class="center">1.7</td>
* <td class="center">A</td> </tr>
*
*
* <tr class="gradeU odd" role="row"> <td class="">Other browsers</td> <td
* class="sorting_1">All others</td> <td>-</td> <td class="center">-</td> <td
* class="center">U</td> </tr>
*/
// #dataTables-example > tbody > tr:nth-child(1) > td:nth-child(2)
// #dataTables-example > tbody > tr.gradeU.odd > td.sorting_1
WebElement headerBrowser = driver
.findElement(By.cssSelector("#dataTables-example > thead > tr > th:nth-child(2)"));
headerBrowser.click();
WebElement element = driver
.findElement(By.cssSelector("#dataTables-example > tbody > tr.gradeU.odd > td.sorting_1"));
assertEquals(element.getText(), "All others");
}
}
```
---
### /web-driver-1-basics/src/test/java/com/in28minutes/webdriver/basics/WebDriverBasicsLocatorsWithIdTest.java
```java
package com.in28minutes.webdriver.basics;
import static org.testng.Assert.assertEquals;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import io.github.bonigarcia.wdm.WebDriverManager;
public class WebDriverBasicsLocatorsWithIdTest extends AbstractChromeWebDriverTest{
@Test
public void testTitle() {
//get the http://localhost:8080/login
driver.get("http://localhost:8080/login");
//assert the title
assertEquals("First Web Application",
driver.getTitle());//First Web Application
}
@Test
public void testGetInformationAboutName() {
driver.get("http://localhost:8080/login");
WebElement nameElement = driver.findElement(By.id("name"));
System.out.println(nameElement.getTagName());//input
System.out.println(nameElement.getAttribute("type"));//text
System.out.println(nameElement.getAttribute("value"));//EMPTY
}
@Test
public void testGetInformationAboutPassword() {
driver.get("http://localhost:8080/login");
WebElement nameElement = driver.findElement(By.id("password"));
System.out.println(nameElement.getTagName());//input
System.out.println(nameElement.getAttribute("type"));//password
System.out.println(nameElement.getAttribute("value"));//EMPTY
}
@Test
public void testGetInformationAboutSubmitButton() {
driver.get("http://localhost:8080/login");
WebElement nameElement = driver.findElement(By.id("submit"));
System.out.println(nameElement.getTagName());//input
System.out.println(nameElement.getAttribute("type"));//submit
System.out.println(nameElement.getAttribute("value"));//EMPTY
}
}
```
---
### /web-driver-1-basics/src/test/java/com/in28minutes/webdriver/basics/WebDriverBasicsLocatorsWithLinkTextTest.java
```java
package com.in28minutes.webdriver.basics;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.testng.annotations.Test;
public class WebDriverBasicsLocatorsWithLinkTextTest extends AbstractChromeWebDriverTest {
@Test
public void getIn28MinuteLinkAndClickIt() {
driver.get("http://localhost:8080/login");
WebElement link = driver.findElement(By.linkText("in28Minutes"));
System.out.println(link.getAttribute("href"));//http://www.in28minutes.com/
link.click();
System.out.println(driver.getCurrentUrl());// http://www.in28minutes.com/
}
@Test
public void getTableLinkAndClickIt() {
driver.get("http://localhost:8080/pages/index.html");
WebElement link = driver.findElement(By.linkText("Tables"));
System.out.println(link.getAttribute("href"));
link.click();
System.out.println(driver.getCurrentUrl());
}
@Test
public void getSBAdminLinkAndClickIt() {
driver.get("http://localhost:8080/pages/index.html");
WebElement link = driver.findElement(By.partialLinkText("SB Admin"));
System.out.println(link.getAttribute("href"));
link.click();
System.out.println(driver.getCurrentUrl());
}
}
```
---
### /web-driver-1-basics/src/test/java/com/in28minutes/webdriver/basics/WebDriverBasicsLocatorsWithNameTest.java
```java
package com.in28minutes.webdriver.basics;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.testng.annotations.Ignore;
import org.testng.annotations.Test;
public class WebDriverBasicsLocatorsWithNameTest extends AbstractChromeWebDriverTest {
@Test
public void testGetInformationAboutEmail() {
driver.get("http://localhost:8080/pages/login.html");
WebElement nameElement = driver.findElement(By.name("email"));
System.out.println(nameElement.getTagName());//input
System.out.println(nameElement.getAttribute("class"));//form-control
System.out.println(nameElement.getAttribute("placeholder"));//E-mail
System.out.println(nameElement.getAttribute("value"));//EMPTY
}
@Test
public void testGetInformationAboutPassword() {
driver.get("http://localhost:8080/pages/login.html");
WebElement nameElement = driver.findElement(By.name("password"));
System.out.println(nameElement.getTagName());//input
System.out.println(nameElement.getAttribute("class"));//form-control
System.out.println(nameElement.getAttribute("placeholder"));//Password
System.out.println(nameElement.getAttribute("value"));//EMPTY
}
@Test
public void testGetInformationAboutCheckbox() {
driver.get("http://localhost:8080/pages/login.html");
WebElement nameElement = driver.findElement(By.name("remember"));
System.out.println(nameElement.getTagName());//input
System.out.println(nameElement.getAttribute("class"));//
System.out.println(nameElement.getAttribute("value"));//Remember Me
System.out.println(nameElement.getAttribute("type"));//checkbox
}
@Test
@Ignore
public void testGetInformationAboutSubmitButton() {
driver.get("http://localhost:8080/pages/login.html");
WebElement nameElement = driver.findElement(By.id("submit"));
System.out.println(nameElement.getTagName());//input
System.out.println(nameElement.getAttribute("type"));//submit
System.out.println(nameElement.getAttribute("value"));//EMPTY
}
//FAILED: testGetInformationAboutSubmitButton
//org.openqa.selenium.NoSuchElementException:
//no such element: Unable to locate element:
//{"method":"id","selector":"submit"}
}
```
---
### /web-driver-1-basics/src/test/java/com/in28minutes/webdriver/basics/WebDriverBasicsLocatorsWithTagTest.java
```java
package com.in28minutes.webdriver.basics;
import java.util.List;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.testng.annotations.Test;
public class WebDriverBasicsLocatorsWithTagTest extends AbstractChromeWebDriverTest {
@Test
public void getDetailsAboutLoginButton() {
driver.get("http://localhost:8080/pages/login.html");
WebElement linkElement = driver.findElement(By.tagName("a"));
System.out.println(linkElement.getText());//Login
System.out.println(linkElement.getAttribute("class"));//btn btn-lg btn-success btn-block
System.out.println(linkElement.getAttribute("href"));//http://localhost:8080/pages/index.html
}
@Test
public void getDetailsAboutInputTags_FindElementWillReturnFirstElement() {
driver.get("http://localhost:8080/pages/login.html");
WebElement linkElement = driver.findElement(By.tagName("input"));
System.out.println(linkElement.getAttribute("class"));//form-control
System.out.println(linkElement.getAttribute("placeholder"));//E-mail
}
@Test
public void getDetailsAboutInputTags_FindAllElements() {
driver.get("http://localhost:8080/pages/login.html");
List<WebElement> elements = driver.findElements(By.tagName("input"));
for(WebElement element:elements) {
System.out.println(element.getAttribute("class"));
System.out.println(element.getAttribute("placeholder"));
}
}
@Test
public void getDetailsAboutInputTags_FindAllElements_Login() {
driver.get("http://localhost:8080/login");
List<WebElement> elements = driver.findElements(By.tagName("input"));
for(WebElement element:elements) {
System.out.println(element.getAttribute("type"));
System.out.println(element.getAttribute("name"));
sleep(3);
}
}
}
```
---
### /web-driver-1-basics/src/test/java/com/in28minutes/webdriver/basics/WebDriverBasicsLocatorsWithXPathSelectorTest.java
```java
package com.in28minutes.webdriver.basics;
import static org.testng.Assert.assertEquals;
import java.util.List;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.testng.annotations.Test;
public class WebDriverBasicsLocatorsWithXPathSelectorTest extends AbstractChromeWebDriverTest{
@Test
public void testXpathSelectorForaTableTd() {
driver.get("http://localhost:8080/pages/tables.html");
//$x("//*[@id='dataTables-example']/tbody/tr[1]/td[2]")
WebElement browserRow1 = driver.findElement(By.xpath("//*[@id='dataTables-example']/tbody/tr[1]/td[2]"));
assertEquals(browserRow1.getText(), "Firefox 1.0");
}
// $$("#dataTables-example > thead > tr > th:nth-child(2)")
// [th.sorting]0: th.sortinglength: 1__proto__: Array(0)
// $$("#dataTables-example > tbody > tr.gradeU.odd > td.sorting_1")
// [td.sorting_1]
@Test
public void testXpathSelectorForSortingAndCheckingFirstRow() {
// $x("//*[@id='dataTables-example']/thead/tr/th[2]")
// [th.sorting]0: th.sortinglength: 1__proto__: Array(0)
// $x("//*[@id='dataTables-example']/tbody/tr[1]/td[2]")
// [td]
driver.get("http://localhost:8080/pages/tables.html");
WebElement headerBrowser = driver.findElement
(By.xpath(
"//*[@id='dataTables-example']/thead/tr/th[2]"));
headerBrowser.click();
WebElement element = driver.findElement
(By.xpath(
"//*[@id='dataTables-example']/tbody/tr[1]/td[2]"));
assertEquals(element.getText(), "All others");
}
}
```
---
### /web-driver-1-basics/src/test/java/com/in28minutes/webdriver/login/FirstWebApplicationLoginTest.java
```java
package com.in28minutes.webdriver.login;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.testng.annotations.Test;
import com.in28minutes.webdriver.basics.AbstractChromeWebDriverTest;
public class FirstWebApplicationLoginTest extends AbstractChromeWebDriverTest{
@Test
public void login() {
driver.get("http://localhost:8080/login");
sleep(5);
WebElement nameElement = driver.findElement(By.name("name"));
nameElement.sendKeys("in28minutes");
sleep(2);
WebElement passwordElement = driver.findElement(By.id("password"));
passwordElement.sendKeys("dummy");
sleep(2);
WebElement submitElement = driver.findElement(By.id("submit"));
submitElement.click();
sleep(2);
WebElement welcomeMessageElement =
driver.findElement(By.id("welcome-message"));
//Welcome in28minutes!! Click here to manage your todo's.
System.out.println(welcomeMessageElement.getText());
}
}
```
---
### /web-driver-1-basics/src/test/java/com/in28minutes/webdriver/login/StaticLoginTest.java
```java
package com.in28minutes.webdriver.login;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.testng.annotations.Test;
import com.in28minutes.webdriver.basics.AbstractChromeWebDriverTest;
public class StaticLoginTest extends AbstractChromeWebDriverTest{
@Test
public void login() {
driver.get("http://localhost:8080/pages/login.html");
sleep(5);
WebElement emailElement = driver.findElement(By.name("email"));
emailElement.sendKeys("in28minutes@gmail.com");
sleep(2);
WebElement passwordElement = driver.findElement(By.name("password"));
passwordElement.sendKeys("dummy");
sleep(2);
WebElement loginElement = driver.findElement(By.tagName("a"));
loginElement.click();
sleep(2);
//http://localhost:8080/pages/index.html
System.out.println(driver.getCurrentUrl());
}
}
```
---
### /web-driver-2-more-scenarios/src/test/java/com/in28minutes/webdriver/basics/AbstractChromeWebDriverTest.java
```java
package com.in28minutes.webdriver.basics;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import io.github.bonigarcia.wdm.WebDriverManager;
public abstract class AbstractChromeWebDriverTest {
protected WebDriver driver;
public AbstractChromeWebDriverTest() {
super();
}
@BeforeTest
public void beforeTest() {
//Download the web driver executable
WebDriverManager.chromedriver().setup();
//Create a instance of your web driver - chrome
driver = new ChromeDriver();
}
@AfterTest
public void afterTest() {
driver.quit();
}
public void sleep(int seconds) {
try {
Thread.sleep(seconds * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
```
---
### /web-driver-2-more-scenarios/src/test/java/com/in28minutes/webdriver/scenarios/ActionsBasicTest.java
```java
package com.in28minutes.webdriver.scenarios;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Actions;
import org.testng.annotations.Test;
import com.in28minutes.webdriver.basics.AbstractChromeWebDriverTest;
public class ActionsBasicTest extends AbstractChromeWebDriverTest {
@Test
public void testBasicActions() {
driver.get("http://localhost:8080/pages/forms.html");
WebElement element = driver.findElement(By.id("textElement"));
WebElement tablesLink = driver.findElement(By.linkText("Tables"));
//element.sendKeys("abc");
//tablesLink.click();
Actions actions = new Actions(driver);
actions.sendKeys(element, "Dummy Text").perform();
sleep(5);
actions.click(tablesLink).perform();
sleep(5);
}
@Test
public void testBasicActions_Combine() {
driver.get("http://localhost:8080/pages/forms.html");
WebElement element = driver.findElement(By.id("textElement"));
WebElement tablesLink = driver.findElement(By.linkText("Tables"));
Actions actions = new Actions(driver);
actions
.sendKeys(element, "Dummy Text")
.click(tablesLink)
.perform();
sleep(5);
}
@Test
public void testBasicDragAndDrop() {
driver.get("http://localhost:8080/pages/sortable.html");
WebElement htmlElement = driver.findElement(By.id("html"));
Actions actions = new Actions(driver);
actions
.dragAndDropBy(htmlElement, 50, 200)
.perform();
sleep(5);
}
@Test
public void testBasicDragAndDrop_Complicated() {
driver.get("http://localhost:8080/pages/sortable.html");
WebElement htmlElement = driver.findElement(By.id("html"));
Actions actions = new Actions(driver);
actions
.clickAndHold(htmlElement)
.moveByOffset(50, 200)
.release()
.perform();
sleep(5);
}
}
```
---
### /web-driver-2-more-scenarios/src/test/java/com/in28minutes/webdriver/scenarios/CheckElementStylesTest.java
```java
package com.in28minutes.webdriver.scenarios;
import static org.testng.Assert.assertFalse;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.testng.annotations.Test;
import com.in28minutes.webdriver.basics.AbstractChromeWebDriverTest;
public class CheckElementStylesTest extends AbstractChromeWebDriverTest {
@Test
public void getCSSStylesForErrorElement() {
driver.get("http://localhost:8080/pages/forms.html");
WebElement errorField = driver.findElement(By.id("inputError"));
System.out.println(errorField.getCssValue("color"));// rgba(85, 85, 85, 1)
System.out.println(errorField.getCssValue("display"));// block
System.out.println(errorField.getCssValue("border-color"));// rgb(169, 68, 66)
System.out.println(errorField.getCssValue("height"));// 34px
System.out.println(errorField.getCssValue("font-size"));// 14px
System.out.println(errorField.getCssValue("background-color"));// rgba(255, 255, 255, 1)
System.out.println(errorField.getCssValue("border"));// 1px solid rgb(169, 68, 66)
}
@Test
public void getCSSStylesForSuccessElement() {
driver.get("http://localhost:8080/pages/forms.html");
WebElement errorField = driver.findElement(By.id("inputSuccess"));
System.out.println(errorField.getCssValue("color"));// rgba(85, 85, 85, 1)
System.out.println(errorField.getCssValue("display"));// block
System.out.println(errorField.getCssValue("border-color"));// rgb(60, 118, 61)
System.out.println(errorField.getCssValue("height"));// 34px
System.out.println(errorField.getCssValue("font-size"));// 14px
System.out.println(errorField.getCssValue("background-color"));// rgba(255, 255, 255, 1)
System.out.println(errorField.getCssValue("border"));// 1px solid rgb(60, 118, 61)
}
@Test
public void checkIfAnElementIsEnabled() {
driver.get("http://localhost:8080/pages/forms.html");
WebElement errorField = driver.findElement(By.id("disabledInput"));
assertFalse(errorField.isEnabled());
System.out.println(errorField.isEnabled());//false
}
@Test
public void exploreWebElementInterface() {
driver.get("http://localhost:8080/pages/forms.html");
WebElement errorField = driver.findElement(By.id("disabledInput"));
System.out.println(errorField.getAttribute("placeholder"));//Disabled input
System.out.println(errorField.getLocation());//(740, 311)
System.out.println(errorField.getSize());//(414, 34)
WebElement textElement = driver.findElement(By.id("textElement"));
System.out.println(textElement.getLocation());//(297, 242)
System.out.println(textElement.getSize());//(414, 34)
WebElement textAreaElement = driver.findElement(By.id("textAreaElement"));
System.out.println(textAreaElement.getLocation());//(297, 549)
System.out.println(textAreaElement.getSize());//(414, 74)
WebElement inputWarning = driver.findElement(By.id("inputWarning"));
System.out.println(inputWarning.getLocation());//(740, 666)
System.out.println(inputWarning.getSize());//(414, 34)
//findElements, findElement
}
}
```
---
### /web-driver-2-more-scenarios/src/test/java/com/in28minutes/webdriver/scenarios/FramesTest.java
```java
package com.in28minutes.webdriver.scenarios;
import org.openqa.selenium.By;
import org.testng.annotations.Test;
import com.in28minutes.webdriver.basics.AbstractChromeWebDriverTest;
public class FramesTest extends AbstractChromeWebDriverTest {
@Test
public void testFrames() {
driver.get("http://localhost:8080/pages/frames-example.html");
driver.switchTo().frame(0);
System.out.println(
"0 - " + driver.findElement(By.tagName("h1")).getText()
);//0 - Frames Example Left
//org.openqa.selenium.NoSuchFrameException: no such frame
//driver.switchTo().frame(1);
driver.switchTo().parentFrame();
driver.switchTo().frame(1);
System.out.println(
"1 - " + driver.findElement(By.tagName("h1")).getText()
);//1 - Frames Example Right
}
}
```
---
### /web-driver-2-more-scenarios/src/test/java/com/in28minutes/webdriver/scenarios/framework/TableReader.java
```java
package com.in28minutes.webdriver.scenarios.framework;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
public class TableReader {
private WebDriver driver;
private String id;
private WebElement tbody;
public TableReader(WebDriver driver, String id) {
this.driver = driver;
this.id = id;
tbody = driver.findElement(By.cssSelector("#"
+ id
+ " > tbody"));
}
public String getData(int row, int col) {
return tbody.findElement(By.cssSelector("tr:nth-child("
+ row
+ ") > td:nth-child("
+ col
+ ")")).getText();
}
}
```
---
### /web-driver-2-more-scenarios/src/test/java/com/in28minutes/webdriver/scenarios/JavaScriptAlertTest.java
```java
package com.in28minutes.webdriver.scenarios;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.testng.annotations.Test;
import com.in28minutes.webdriver.basics.AbstractChromeWebDriverTest;
public class JavaScriptAlertTest extends AbstractChromeWebDriverTest {
@Test
public void testForAlert() {
driver.get("http://localhost:8080/pages/notifications.html");
driver.findElement(By.id("alertButton")).click();
//org.openqa.selenium.UnhandledAlertException:
//unexpected alert open: {Alert text : Enter Something}
//driver.findElement(By.id("modalButton")).click();
Alert alertQuestion = driver.switchTo().alert();
alertQuestion.sendKeys("Some Message");
alertQuestion.accept();
Alert alertMessage = driver.switchTo().alert();
System.out.println(alertMessage.getText());
alertMessage.accept();
}
}
```
---
### /web-driver-2-more-scenarios/src/test/java/com/in28minutes/webdriver/scenarios/NewWindowTest.java
```java
package com.in28minutes.webdriver.scenarios;
import org.openqa.selenium.By;
import org.testng.annotations.Test;
import com.in28minutes.webdriver.basics.AbstractChromeWebDriverTest;
public class NewWindowTest extends AbstractChromeWebDriverTest {
@Test
public void testForWindows() {
driver.get("http://localhost:8080/pages/notifications.html");
// 0 - [CDwindow-C62544C6B928D4C97EE4F2E54D9B7FE2]
System.out.println("0 - " + driver.getWindowHandles());
driver.findElement(By.id("newPageButton")).click();
// Window Handle
// 1 - CDwindow-C62544C6B928D4C97EE4F2E54D9B7FE2
System.out.println("1 - " + driver.getWindowHandle());
// 2 - [CDwindow-C62544C6B928D4C97EE4F2E54D9B7FE2,
// CDwindow-F3E3A57A563CF50F3A063A72C4B23768]
System.out.println("2 - " + driver.getWindowHandles());
}
@Test
public void findWindowHandleOfSecondWindow() {
driver.get("http://localhost:8080/pages/notifications.html");
String firstWindowHandle = driver.getWindowHandle();
System.out.println(firstWindowHandle);
driver.findElement(By.id("newPageButton")).click();
String secondWindowHandle = findSecondWindowHandle(firstWindowHandle);
System.out.println(secondWindowHandle);
}
private String findSecondWindowHandle(String firstWindowHandle) {
for (String handle : driver.getWindowHandles()) {
if (!firstWindowHandle.equals(handle)) {
return handle;
}
}
return null;
}
@Test
public void switchToSecondWindow() {
driver.get("http://localhost:8080/pages/notifications.html");
String firstWindowHandle = driver.getWindowHandle();
System.out.println(firstWindowHandle);
driver.findElement(By.id("newPageButton")).click();
String secondWindowHandle = findSecondWindowHandle(firstWindowHandle);
System.out.println(secondWindowHandle);
System.out.println(driver.findElement(By.tagName("h1")).getText());// Notifications
driver.switchTo().window(secondWindowHandle);
System.out.println(driver.findElement(By.tagName("h1")).getText());// Forms
driver.switchTo().window(firstWindowHandle);
System.out.println(driver.findElement(By.tagName("h1")).getText());// Notifications
System.out.println(driver.getCurrentUrl());// http://localhost:8080/pages/notifications.html
driver.close();
// org.openqa.selenium.NoSuchWindowException: no such window: target window
// already closed
// System.out.println(driver.getCurrentUrl());
driver.switchTo().window(secondWindowHandle);
System.out.println(driver.getCurrentUrl());// http://localhost:8080/pages/forms.html
}
}
```
---
### /web-driver-2-more-scenarios/src/test/java/com/in28minutes/webdriver/scenarios/PlayingWithModalWindowAndWaitsTest.java
```java
package com.in28minutes.webdriver.scenarios;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.ElementNotVisibleException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.annotations.Ignore;
import org.testng.annotations.Test;
import com.in28minutes.webdriver.basics.AbstractChromeWebDriverTest;
import io.github.bonigarcia.wdm.WebDriverManager;
public class PlayingWithModalWindowAndWaitsTest extends AbstractChromeWebDriverTest {
@Test(expectedExceptions = ElementNotVisibleException.class)
public void playingWithModalWindows_expectingAException() {
driver.get("http://localhost:8080/pages/notifications.html");
// Button id - modalButton
// Modal Wdw id - myModal, myModalLabel, myModalBody, myModalCloseButton
driver.findElement(By.id("modalButton")).click();
// org.openqa.selenium.ElementNotVisibleException: element not visible
driver.findElement(By.id("myModalCloseButton")).click();
}
@Test
public void playingWithModalWindows_FixingWithSleep() {
driver.get("http://localhost:8080/pages/notifications.html");
// Button id - modalButton
// Modal Wdw id - myModal, myModalLabel, myModalBody, myModalCloseButton
driver.findElement(By.id("modalButton")).click();
sleep(1);
System.out.println(driver.findElement(By.id("myModalLabel")).getText());// Modal title
driver.findElement(By.id("myModalCloseButton")).click();
// sleep(10);
}
@Test
@Ignore("implicit wait fails on Chrome")
// https://github.com/SeleniumHQ/selenium-google-code-issue-archive/issues/711
public void playingWithModalWindows_implicitWait() {
driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);
driver.get("http://localhost:8080/pages/notifications.html");
// Button id - modalButton
// Modal Wdw id - myModal, myModalLabel, myModalBody, myModalCloseButton
driver.findElement(By.id("modalButton")).click();
// sleep(1);
System.out.println(driver.findElement(By.id("myModalLabel")).getText());// Modal title
driver.findElement(By.id("myModalCloseButton")).click();
// sleep(10);
}
@Test
public void playingWithModalWindows_ExplicitWait() {
driver.get("http://localhost:8080/pages/notifications.html");
// Button id - modalButton
// Modal Wdw id - myModal, myModalLabel, myModalBody, myModalCloseButton
driver.findElement(By.id("modalButton")).click();
// sleep(10);
// Max - 10
// Wait for myModalLabel to load
WebDriverWait webDriverWait = new WebDriverWait(driver, 10);
webDriverWait.withMessage("Waited for 10 Seconds but still myModalLabel not available");
WebElement modalLabel =
webDriverWait.until(
ExpectedConditions.visibilityOf(
driver.findElement(By.id("myModalLabel"))
)
);// By.id("myModalLabel")
System.out.println(modalLabel.getText());// Modal title
driver.findElement(By.id("myModalCloseButton")).click();
// sleep(10);
}
}
```
---
### /web-driver-2-more-scenarios/src/test/java/com/in28minutes/webdriver/scenarios/PlayingWithScreenWindowTest.java
```java
package com.in28minutes.webdriver.scenarios;
import org.openqa.selenium.By;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.Point;
import org.openqa.selenium.WebElement;
import org.testng.annotations.Test;
import com.in28minutes.webdriver.basics.AbstractChromeWebDriverTest;
public class PlayingWithScreenWindowTest extends AbstractChromeWebDriverTest {
@Test
public void playingWithWindows() {
driver.get("http://localhost:8080/pages/forms.html");
System.out.println(driver.manage().window().getPosition());//(22, 22)
System.out.println(driver.manage().window().getSize());//(1200, 752)
sleep(3);
//failed to change window state to normal, current state is maximized
driver.manage().window().setPosition(new Point(200,200));
sleep(3);
driver.manage().window().setSize(new Dimension(200,200));
sleep(3);
driver.manage().window().maximize();
sleep(3);
driver.manage().window().fullscreen();
sleep(3);
}
@Test
public void backForwardAndNavigation() {
driver.get("http://localhost:8080/pages/forms.html");
sleep(3);
driver.get("http://localhost:8080/pages/tables.html");
sleep(3);
driver.get("http://localhost:8080/pages/login.html");
sleep(3);
driver.get("http://localhost:8080/pages/index.html");
sleep(3);
driver.navigate().back();
sleep(3);
driver.navigate().back();
sleep(3);
driver.navigate().back();
sleep(3);
driver.navigate().forward();
sleep(3);
driver.navigate().refresh();
sleep(3);
driver.navigate().back();
sleep(3);
}
}
```
---
### /web-driver-2-more-scenarios/src/test/java/com/in28minutes/webdriver/scenarios/ReadTablesTest.java
```java
package com.in28minutes.webdriver.scenarios;
import java.io.IOException;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebElement;
import org.testng.annotations.Test;
import com.in28minutes.webdriver.basics.AbstractChromeWebDriverTest;
import com.in28minutes.webdriver.scenarios.framework.TableReader;
public class ReadTablesTest extends AbstractChromeWebDriverTest {
@Test
public void testReadingOfTables() throws IOException {
driver.get("http://localhost:8080/pages/tables.html");
TableReader reader = new TableReader(driver, "dataTables-example");
System.out.println(reader.getData(1,2));
System.out.println(reader.getData(2,2));
System.out.println(reader.getData(5,4));
System.out.println(reader.getData(6,3));
TableReader reader2 = new TableReader(driver, "dataTables-example-2");
System.out.println(reader2.getData(1, 2));
//1,2
//2,3
//WebElement tbody = driver.findElement(By.cssSelector("#dataTables-example > tbody"));
//String t12 = tbody.findElement(By.cssSelector("tr:nth-child(1) > td:nth-child(2)")).getText();
//String t22 = tbody.findElement(By.cssSelector("tr:nth-child(2) > td:nth-child(2)")).getText();
//System.out.println(t12);
//System.out.println(t22);
//#dataTables-example > tbody > tr:nth-child(1) > td:nth-child(2)
//#dataTables-example > tbody > tr:nth-child(2) > td:nth-child(2)
//#dataTables-example > tbody > tr:nth-child(1) > td:nth-child(3)
}
}
```
---
### /web-driver-2-more-scenarios/src/test/java/com/in28minutes/webdriver/scenarios/RunJavaScriptTest.java
```java
package com.in28minutes.webdriver.scenarios;
import java.io.IOException;
import org.openqa.selenium.JavascriptExecutor;
import org.testng.annotations.Test;
import com.in28minutes.webdriver.basics.AbstractChromeWebDriverTest;
public class RunJavaScriptTest extends AbstractChromeWebDriverTest {
@Test
public void testRunningOfJavaScript() throws IOException {
driver.get("http://localhost:8080/pages/tables.html");
JavascriptExecutor js = (JavascriptExecutor)driver;
String title = (String)js.executeScript("return document.title;");
sleep(3);
js.executeScript("window.scrollBy(0,200)");
sleep(3);
js.executeScript("window.scrollBy(0,200)");
sleep(3);
js.executeScript("window.scrollBy(0,200)");
sleep(3);
System.out.println(title);
}
}
```
---
### /web-driver-2-more-scenarios/src/test/java/com/in28minutes/webdriver/scenarios/TakesScreenshotTest.java
```java
package com.in28minutes.webdriver.scenarios;
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.By;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.testng.annotations.Test;
import com.in28minutes.webdriver.basics.AbstractChromeWebDriverTest;
public class TakesScreenshotTest extends AbstractChromeWebDriverTest {
@Test
public void testFrames() throws IOException {
driver.get("http://localhost:8080/pages/frames-example.html");
//Operations
File screenshot = ((TakesScreenshot)driver)
.getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(screenshot,
new File("./target/" + driver + "-screenshot.png"));
}
}
```
---
### /web-driver-3-cross-browser-framework/src/test/java/com/in28minutes/selenium/crossbrowser/CrossBrowserBasicsTest.java
```java
package com.in28minutes.selenium.crossbrowser;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.safari.SafariDriver;
import org.testng.annotations.Ignore;
import org.testng.annotations.Test;
import io.github.bonigarcia.wdm.WebDriverManager;
public class CrossBrowserBasicsTest {
@Test
public void chromeBrowser() {
// Chrome
// Chrome Web Driver EXE
WebDriverManager.chromedriver().setup();
// WebDriver Interface - Create an instance of the web driver of the browser
WebDriver driver = new ChromeDriver();
// Launch a web page
driver.get("http://localhost:8080/pages/tables.html");
sleep(5);
driver.quit();
}
@Test
public void firefoxBrowser() {
// Firefox
// Firefox Web Driver EXE
WebDriverManager.firefoxdriver().setup();
// WebDriver Interface - Create an instance of the web driver of the browser
WebDriver driver = new FirefoxDriver();
// Launch a web page
driver.get("http://localhost:8080/pages/tables.html");
sleep(5);
driver.quit();
}
@Test
public void safariBrowser() {
// Safari
// Make sure you set Develop | Allow Remote Automation option from Safari's main
// menu
// Could not create a session: You must enable the 'Allow Remote Automation'
// option in Safari's Develop menu to control Safari via WebDriver.
// Safari Web Driver EXE
//WebDriverManager.safaridriver().setup();
// WebDriver Interface - Create an instance of the web driver of the browser
WebDriver driver = new SafariDriver();
// Launch a web page
driver.get("http://localhost:8080/pages/tables.html");
sleep(5);
driver.quit();
}
@Test
@Ignore
public void ieBrowser() {
WebDriverManager.iedriver().setup();
// WebDriver Interface - Create an instance of the web driver of the browser
WebDriver driver = new InternetExplorerDriver();
// Launch a web page
driver.get("http://localhost:8080/pages/tables.html");
sleep(5);
driver.quit();
}
@Test
@Ignore
public void edgeBrowser() {
WebDriverManager.edgedriver().setup();
// WebDriver Interface - Create an instance of the web driver of the browser
WebDriver driver = new EdgeDriver();
// Launch a web page
driver.get("http://localhost:8080/pages/tables.html");
sleep(5);
driver.quit();
}
private void sleep(int i) {
try {
Thread.sleep(i * 1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
```
---
### /web-driver-3-cross-browser-framework/src/test/java/com/in28minutes/selenium/crossbrowser/framework/CrossBrowserFrameworkTest.java
```java
package com.in28minutes.selenium.crossbrowser.framework;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Optional;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
import io.github.bonigarcia.wdm.WebDriverManager;
public class CrossBrowserFrameworkTest {
WebDriver driver = null;
@Parameters("browser")
@BeforeTest
public void before(@Optional("chrome") String browser) {
if(browser.equals("chrome")) {
WebDriverManager.chromedriver().setup();
driver = new ChromeDriver();
} else if(browser.equals("firefox")){
WebDriverManager.firefoxdriver().setup();
driver = new FirefoxDriver();
} else {
throw new RuntimeException("Does not support browser + " + browser);
}
}
@Test
public void launchTablesPage() {
// Launch a web page
driver.get("http://localhost:8080/pages/tables.html");
}
@Test
public void launchIndexPage() {
// Launch a web page
driver.get("http://localhost:8080/pages/index.html");
}
@AfterTest
public void afterTest() {
driver.quit();
}
}
```
---
### /web-driver-3-cross-browser-framework/src/test/java/com/in28minutes/selenium/crossbrowser/HeadlessBrowserBasicsTest.java
```java
package com.in28minutes.selenium.crossbrowser;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxOptions;
import org.openqa.selenium.phantomjs.PhantomJSDriver;
import org.testng.annotations.Test;
import io.github.bonigarcia.wdm.WebDriverManager;
public class HeadlessBrowserBasicsTest {
@Test
public void chromeBrowser() {
// Chrome
// Chrome Web Driver EXE
WebDriverManager.chromedriver().setup();
// WebDriver Interface - Create an instance of the web driver of the browser
WebDriver driver = new ChromeDriver();
// Launch a web page
driver.get("http://localhost:8080/pages/tables.html");
sleep(5);
driver.quit();
}
@Test
public void chromeBrowserHeadlessBrowsing() {
// Chrome
// Chrome Web Driver EXE
WebDriverManager.chromedriver().setup();
ChromeOptions options = new ChromeOptions();
options.setHeadless(true);
// WebDriver Interface - Create an instance of the web driver of the browser
WebDriver driver = new ChromeDriver(options);
// Launch a web page
driver.get("http://localhost:8080/pages/tables.html");
sleep(5);
driver.quit();
}
@Test
public void firefoxBrowser() {
// Firefox
// Firefox Web Driver EXE
WebDriverManager.firefoxdriver().setup();
// WebDriver Interface - Create an instance of the web driver of the browser
WebDriver driver = new FirefoxDriver();
// Launch a web page
driver.get("http://localhost:8080/pages/tables.html");
sleep(5);
driver.quit();
}
@Test
public void firefoxBrowserHeadlessBrowsing() {
// Firefox
// Firefox Web Driver EXE
WebDriverManager.firefoxdriver().setup();
FirefoxOptions options = new FirefoxOptions();
options.setHeadless(true);
// WebDriver Interface - Create an instance of the web driver of the browser
WebDriver driver = new FirefoxDriver(options);
// Launch a web page
driver.get("http://localhost:8080/pages/tables.html");
sleep(5);
driver.quit();
}
@Test
public void phanthomJS() {
WebDriverManager.phantomjs().setup();
WebDriver driver = new PhantomJSDriver();
// Launch a web page
driver.get("http://localhost:8080/pages/tables.html");
sleep(5);
driver.quit();
}
private void sleep(int i) {
try {
Thread.sleep(i * 1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
```
---
### /web-driver-4-data-driven-tests/src/test/java/com/in28minutes/datadriventests/ExcelReadUtil.java
```java
package com.in28minutes.datadriventests;
import java.io.File;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
public class ExcelReadUtil {
public static String[][] readExcelInto2DArray(String excelFilePath,
String sheetName, int totalCols) {
File file = new File(excelFilePath);
String[][] tabArray = null;
try {
OPCPackage opcPackage = OPCPackage.open(file.getAbsolutePath());
Workbook wb = WorkbookFactory.create(opcPackage);
Sheet sheet = wb.getSheet(sheetName);
int totalRows = sheet.getLastRowNum() + 1;
tabArray = new String[totalRows][totalCols];
for (int i = 0; i < totalRows; i++) {
for (int j = 0; j < totalCols; j++) {
Cell cell = sheet.getRow(i).getCell(j);
//System.out.println(cell + " " + i + " " + j);
if (cell == null)
continue;
switch (cell.getCellType()) {
case Cell.CELL_TYPE_BOOLEAN:
tabArray[i][j] = String.valueOf(cell.getBooleanCellValue());
break;
case Cell.CELL_TYPE_NUMERIC:
tabArray[i][j] = String.valueOf(cell.getNumericCellValue());
break;
case Cell.CELL_TYPE_STRING:
tabArray[i][j] = cell.getStringCellValue();
break;
default:
tabArray[i][j] = "";
break;
}
}
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
return tabArray;
}
}
```
---
### /web-driver-4-data-driven-tests/src/test/java/com/in28minutes/datadriventests/LoginDataProviderCompleteCsvTest.java
```java
package com.in28minutes.datadriventests;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
import java.io.FileReader;
import java.io.IOException;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import com.opencsv.CSVReader;
import io.github.bonigarcia.wdm.WebDriverManager;
public class LoginDataProviderCompleteCsvTest {
//Data Provider public java.util.List com.in28minutes.datadriventests.
//LoginDataProviderCompleteCsvTest.userIdsAndPasswordsCSVDataProvider()
//must return either Object[][] or Object[] or Iterator<Object[]>
//or Iterator<Object>, not interface java.util.List
// Create the Data Provider and give the data provider a name
@DataProvider(name = "user-ids-passwords-csv-data-provider")
public Iterator<String[]> userIdsAndPasswordsCSVDataProvider() {
return readFromCSVFile("./src/test/resources/login-data.csv").iterator();
}
// Use the data provider
@Test(dataProvider = "user-ids-passwords-csv-data-provider")
public void testLoginForAllScenarios(String userId, String password, String isLoginExpectedToBeSuccessfulString) {
boolean isLoginExpectedToBeSuccessful = Boolean.valueOf(isLoginExpectedToBeSuccessfulString);
WebDriverManager.chromedriver().setup();
WebDriver driver = new ChromeDriver();
driver.get("http://localhost:8080/login");
driver.findElement(By.id("name")).sendKeys(userId);
// driver.findElement(By.id("name")).sendKeys("in28minutes");
WebElement passwordElement = driver.findElement(By.id("password"));
passwordElement.sendKeys(password);
passwordElement.submit();
// driver.findElement(By.id("submit")).click();
if (isLoginExpectedToBeSuccessful) {
String welcomeMessageText = driver.findElement(By.id("welcome-message")).getText();
assertTrue(welcomeMessageText.contains("Welcome " + userId));
} else {
String errorMessageText = driver.findElement(By.id("error-message")).getText();
assertEquals(errorMessageText, "Invalid Credentials");
}
driver.quit();
}
@Test
public void testReadingDataFromCSV() throws IOException {
List<String[]> data = readFromCSVFile("./src/test/resources/login-data.csv");
for (String[] row : data) {
System.out.println(Arrays.toString(row));
}
}
private List<String[]> readFromCSVFile(String csvFilePath) {
try {
CSVReader reader = new CSVReader(new FileReader(csvFilePath));
List<String[]> data = reader.readAll();
return data;
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
```
---
### /web-driver-4-data-driven-tests/src/test/java/com/in28minutes/datadriventests/LoginDataProviderCompleteExcelTest.java
```java
package com.in28minutes.datadriventests;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
import java.util.Arrays;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import io.github.bonigarcia.wdm.WebDriverManager;
public class LoginDataProviderCompleteExcelTest {
//Create the Data Provider and give the data provider a name
@DataProvider(name="user-ids-passwords-excel-data-provider")
public String[][] userIdsAndPasswordsDataProvider() {
return ExcelReadUtil.readExcelInto2DArray(
"./src/test/resources/login-data.xlsx", "Sheet1", 3);
}
//Use the data provider
@Test(dataProvider="user-ids-passwords-excel-data-provider")
public void testLoginForAllScenarios(String userId,
String password, String isLoginExpectedToBeSuccessfulString) {
boolean isLoginExpectedToBeSuccessful =
Boolean.valueOf(isLoginExpectedToBeSuccessfulString);
WebDriverManager.chromedriver().setup();
WebDriver driver = new ChromeDriver();
driver.get("http://localhost:8080/login");
driver.findElement(By.id("name")).sendKeys(userId);
//driver.findElement(By.id("name")).sendKeys("in28minutes");
WebElement passwordElement = driver.findElement(By.id("password"));
passwordElement.sendKeys(password);
passwordElement.submit();
// driver.findElement(By.id("submit")).click();
if(isLoginExpectedToBeSuccessful) {
String welcomeMessageText = driver.findElement(By.id("welcome-message")).getText();
assertTrue(welcomeMessageText.contains("Welcome " + userId));
} else {
String errorMessageText = driver.findElement(By.id("error-message")).getText();
assertEquals(errorMessageText,"Invalid Credentials");
}
driver.quit();
}
@Test
public void readFromExcel() {
//[[in28minutes, dummy, true], [adam, adam, false],
//[adam, adam@123, true], [eve, eve, false]]
String[][] data = ExcelReadUtil.readExcelInto2DArray(
"./src/test/resources/login-data.xlsx", "Sheet1", 3);
System.out.println(Arrays.deepToString(data));
}
}
```
---
### /web-driver-4-data-driven-tests/src/test/java/com/in28minutes/datadriventests/LoginDataProviderCompleteTest.java
```java
package com.in28minutes.datadriventests;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import io.github.bonigarcia.wdm.WebDriverManager;
public class LoginDataProviderCompleteTest {
//Create the Data Provider and give the data provider a name
@DataProvider(name="user-ids-passwords-data-provider")
public Object[][] userIdsAndPasswordsDataProvider() {
return new Object[][]{
{"in28minutes","dummy", true},
{"adam","adam", false},
{"adam","adam@123", true},
{"eve","eve",false},
{"eve","eve@123", true},
};
}
//Use the data provider
@Test(dataProvider="user-ids-passwords-data-provider")
public void testLoginForAllScenarios(String userId,
String password, boolean isLoginExpectedToBeSuccessful) {
WebDriverManager.chromedriver().setup();
WebDriver driver = new ChromeDriver();
driver.get("http://localhost:8080/login");
driver.findElement(By.id("name")).sendKeys(userId);
//driver.findElement(By.id("name")).sendKeys("in28minutes");
WebElement passwordElement = driver.findElement(By.id("password"));
passwordElement.sendKeys(password);
passwordElement.submit();
// driver.findElement(By.id("submit")).click();
if(isLoginExpectedToBeSuccessful) {
String welcomeMessageText = driver.findElement(By.id("welcome-message")).getText();
assertTrue(welcomeMessageText.contains("Welcome " + userId));
} else {
String errorMessageText = driver.findElement(By.id("error-message")).getText();
assertEquals(errorMessageText,"Invalid Credentials");
}
driver.quit();
}
}
```
---
### /web-driver-4-data-driven-tests/src/test/java/com/in28minutes/datadriventests/SuccessfulLoginBasicTest.java
```java
package com.in28minutes.datadriventests;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.Test;
import io.github.bonigarcia.wdm.WebDriverManager;
public class SuccessfulLoginBasicTest {
@Test
public void testLoginWithIn28Minutes() {
WebDriverManager.chromedriver().setup();
WebDriver driver = new ChromeDriver();
driver.get("http://localhost:8080/login");
driver.findElement(By.id("name")).sendKeys("in28minutes");
WebElement passwordElement = driver.findElement(By.id("password"));
passwordElement.sendKeys("dummy");
passwordElement.submit();
// driver.findElement(By.id("submit")).click();
// welcome-message
System.out.println(driver.findElement(By.id("welcome-message")).getText());
driver.quit();
}
}
```
---
### /web-driver-4-data-driven-tests/src/test/java/com/in28minutes/datadriventests/UnSuccessfulLoginBasicTest.java
```java
package com.in28minutes.datadriventests;
import static org.testng.Assert.assertEquals;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.Test;
import io.github.bonigarcia.wdm.WebDriverManager;
public class UnSuccessfulLoginBasicTest {
@Test
public void testUnsuccessfulLoginWithIn28Minutes() {
WebDriverManager.chromedriver().setup();
WebDriver driver = new ChromeDriver();
driver.get("http://localhost:8080/login");
driver.findElement(By.id("name")).sendKeys("in28minutes");
WebElement passwordElement = driver.findElement(By.id("password"));
passwordElement.sendKeys("");
passwordElement.submit();
// driver.findElement(By.id("submit")).click();
// welcome-message
String errorMessageText = driver.findElement(By.id("error-message")).getText();
System.out.println(errorMessageText);
assertEquals(errorMessageText,"Invalid Credentials");
driver.quit();
}
}
```
---
### /web-driver-4-data-driven-tests/src/test/java/com/in28minutes/datadriventests/UnSuccessfulLoginDataDrivenBasicTest.java
```java
package com.in28minutes.datadriventests;
import static org.testng.Assert.assertEquals;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import io.github.bonigarcia.wdm.WebDriverManager;
public class UnSuccessfulLoginDataDrivenBasicTest {
//Create the Data Provider and give the data provider a name
@DataProvider(name="user-ids-data-provider")
public String[] userIdsDataProvider() {
return new String[]{"in28minutes","adam","eve"};
}
//Use the data provider
@Test(dataProvider="user-ids-data-provider")
public void testUnsuccessfulLoginWithIn28Minutes(String userId) {
WebDriverManager.chromedriver().setup();
WebDriver driver = new ChromeDriver();
driver.get("http://localhost:8080/login");
driver.findElement(By.id("name")).sendKeys(userId);
//driver.findElement(By.id("name")).sendKeys("in28minutes");
WebElement passwordElement = driver.findElement(By.id("password"));
passwordElement.sendKeys("");
passwordElement.submit();
// driver.findElement(By.id("submit")).click();
// welcome-message
String errorMessageText = driver.findElement(By.id("error-message")).getText();
System.out.println(errorMessageText);
assertEquals(errorMessageText,"Invalid Credentials");
driver.quit();
}
}
```
---
### /web-driver-4-data-driven-tests/src/test/java/com/in28minutes/datadriventests/UnSuccessfulLoginDataDrivenLevel1Test.java
```java
package com.in28minutes.datadriventests;
import static org.testng.Assert.assertEquals;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import io.github.bonigarcia.wdm.WebDriverManager;
public class UnSuccessfulLoginDataDrivenLevel1Test {
//Create the Data Provider and give the data provider a name
@DataProvider(name="user-ids-passwords-data-provider")
public String[][] userIdsAndPasswordsDataProvider() {
return new String[][]{
{"in28minutes","in28minutes"},
{"adam","adam"},
{"eve","eve"},
};
}
//Use the data provider
@Test(dataProvider="user-ids-passwords-data-provider")
public void testUnsuccessfulLoginWithIn28Minutes(String userId, String password) {
WebDriverManager.chromedriver().setup();
WebDriver driver = new ChromeDriver();
driver.get("http://localhost:8080/login");
driver.findElement(By.id("name")).sendKeys(userId);
//driver.findElement(By.id("name")).sendKeys("in28minutes");
WebElement passwordElement = driver.findElement(By.id("password"));
passwordElement.sendKeys(password);
passwordElement.submit();
// driver.findElement(By.id("submit")).click();
// welcome-message
String errorMessageText = driver.findElement(By.id("error-message")).getText();
System.out.println(errorMessageText);
assertEquals(errorMessageText,"Invalid Credentials");
driver.quit();
}
}
```
---
### /web-driver-4-data-driven-tests/src/test/resources/login-data.csv
```
in28minutes,dummy,true
adam,adam,false
adam,adam@123,true
eve,eve,false
eve,eve@123,true
in28minutes,eve@123,false
```
---
### /web-driver-5-page-object-model/src/test/java/com/in28minutes/pageobjects/updatetodo/ListTodoPage.java
```java
package com.in28minutes.pageobjects.updatetodo;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
public class ListTodoPage {
private WebDriver driver;
public ListTodoPage(WebDriver driver) {
super();
this.driver = driver;
}
//get description for id
//desc- + id
public String getDescription(String id) {
return driver.findElement(By.id("desc-" + id)).getText();
}
//get target date for id
public String getTargetDate(String id) {
return driver.findElement(By.id("targetdate-" + id)).getText();
}
//click update for a id
public void clickUpdateFor(String id) {
driver.findElement(By.id("update-" + id)).click();
}
//delete a id
}
```
---
### /web-driver-5-page-object-model/src/test/java/com/in28minutes/pageobjects/updatetodo/LoginPage.java
```java
package com.in28minutes.pageobjects.updatetodo;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
public class LoginPage {
private WebDriver driver;
public LoginPage(WebDriver driver) {
super();
driver.get("http://localhost:8080/login");
this.driver = driver;
}
//Name Text Box
@FindBy(id="name")
WebElement name;
//Password Text Box
@FindBy(id="password")
WebElement password;
//Submit Button
@FindBy(id="submit")
WebElement submitButton;
//enterName
public void enterName(String nameToEnter) {
name.sendKeys(nameToEnter);
}
//enterPassword
public void enterPassword(String passwordToEnter) {
password.sendKeys(passwordToEnter);
}
//submit
public void submit() {
submitButton.submit();
}
public void login(String name, String password) {
enterName(name);
enterPassword(password);
submit();
}
}
```
---
### /web-driver-5-page-object-model/src/test/java/com/in28minutes/pageobjects/updatetodo/TodoPage.java
```java
package com.in28minutes.pageobjects.updatetodo;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
public class TodoPage {
private WebDriver driver;
public TodoPage(WebDriver driver) {
super();
this.driver = driver;
}
@FindBy(id="desc")
private WebElement description;
@FindBy(id="targetDate")
private WebElement targetDate;
@FindBy(id="save")
private WebElement saveButton;
public void enterDescription(String desc) {
description.clear();
description.sendKeys(desc);
}
public void enterTargetDate(String date) {
targetDate.clear();
targetDate.sendKeys(date);
}
public void submit() {
saveButton.submit();
}
public void enterDetailsAndSubmit(String desc,String targetDate) {
enterDescription(desc);
enterTargetDate(targetDate);
submit();
}
}
```
---
### /web-driver-5-page-object-model/src/test/java/com/in28minutes/pageobjects/updatetodo/UpdateTodoBasicTest.java
```java
package com.in28minutes.pageobjects.updatetodo;
import static org.testng.Assert.assertEquals;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.PageFactory;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import io.github.bonigarcia.wdm.WebDriverManager;
public class UpdateTodoBasicTest {
WebDriver driver;
@BeforeTest
public void beforeTest() {
WebDriverManager.chromedriver().setup();
driver = new ChromeDriver();
}
@Test
public void loginPageObject() {
driver.get("http://localhost:8080/login");
LoginPage page = PageFactory.initElements(driver, LoginPage.class);
//driver.findElement(By.id("name")).getAttribute("type")
System.out.println(page.name.getAttribute("type"));//text
//driver.findElement(By.id("password")).getAttribute("type")
System.out.println(page.password.getAttribute("type"));//password
}
@Test
public void updateTodo() {
LoginPage page = PageFactory.initElements(driver, LoginPage.class);
page.login("in28minutes", "dummy");
driver.findElement(By.linkText("Click here")).click();
ListTodoPage listTodoPage = new ListTodoPage(driver);
listTodoPage.clickUpdateFor("10002");
TodoPage todoPage = PageFactory.initElements(driver, TodoPage.class);
todoPage.enterDescription("Become a Tech Guru - 2");
todoPage.enterTargetDate("12/09/2019");
todoPage.submit();
assertEquals(listTodoPage.getDescription("10002"),
"Become a Tech Guru - 2");
assertEquals(listTodoPage.getTargetDate("10002"), "12/09/2019");
}
@AfterTest
public void afterTest() {
driver.quit();
}
}
```
---
### /web-driver-5-page-object-model/src/test/java/com/in28minutes/pageobjects/updatetodo/UpdateTodoBasicTest1BeforePageObjects.java
```java
package com.in28minutes.pageobjects.updatetodo;
import static org.testng.Assert.assertEquals;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import io.github.bonigarcia.wdm.WebDriverManager;
public class UpdateTodoBasicTest1BeforePageObjects {
WebDriver driver;
@BeforeTest
public void beforeTest() {
WebDriverManager.chromedriver().setup();
driver = new ChromeDriver();
}
@Test
public void updateTodo() {
driver.get("http://localhost:8080/login");
// LoginPage page = PageFactory.initElements(driver, LoginPage.class);
driver.findElement(By.id("name")).sendKeys("in28minutes");
driver.findElement(By.id("password")).sendKeys("dummy");
driver.findElement(By.id("submit")).submit();
//Click here - Link Text - click
driver.findElement(By.linkText("Click here")).click();
//id update-10002 click
driver.findElement(By.id("update-10002")).click();
//id desc
WebElement desc = driver.findElement(By.id("desc"));
desc.clear();
desc.sendKeys("Become a Tech Guru - 2");
//id targetDate
WebElement targetDate = driver.findElement(By.id("targetDate"));
targetDate.clear();
targetDate.sendKeys("12/09/2019");
//save submit
driver.findElement(By.id("save")).submit();
//check desc-10002
String updatedDesc = driver.findElement(By.id("desc-10002")).getText();
//check targetdate-10002
String updatedTargetDate = driver.findElement(By.id("targetdate-10002")).getText();
//Become a Tech Guru - 2
//12/09/2019
assertEquals(updatedDesc, "Become a Tech Guru - 2");
assertEquals(updatedTargetDate, "12/09/2019");
}
@AfterTest
public void afterTest() {
driver.quit();
}
}
```
---
### /web-driver-5-page-object-model/src/test/java/com/in28minutes/pageobjects/updatetodo/UpdateTodoBasicTest2AfterLoginPage.java
```java
package com.in28minutes.pageobjects.updatetodo;
import static org.testng.Assert.assertEquals;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.PageFactory;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import io.github.bonigarcia.wdm.WebDriverManager;
public class UpdateTodoBasicTest2AfterLoginPage {
WebDriver driver;
@BeforeTest
public void beforeTest() {
WebDriverManager.chromedriver().setup();
driver = new ChromeDriver();
}
@Test
public void loginPageObject() {
driver.get("http://localhost:8080/login");
LoginPage page = PageFactory.initElements(driver, LoginPage.class);
//driver.findElement(By.id("name")).getAttribute("type")
System.out.println(page.name.getAttribute("type"));//text
//driver.findElement(By.id("password")).getAttribute("type")
System.out.println(page.password.getAttribute("type"));//password
}
@Test
public void updateTodo() {
driver.get("http://localhost:8080/login");
LoginPage page = PageFactory.initElements(driver, LoginPage.class);
page.login("in28minutes", "dummy");
//page.enterName("in28minutes");
//page.enterPassword("dummy");
//page.submit();
//page.name.sendKeys("in28minutes");
//page.password.sendKeys("dummy");
//page.submitButton.submit();
//Click here - Link Text - click
driver.findElement(By.linkText("Click here")).click();
//id update-10002 click
driver.findElement(By.id("update-10002")).click();
//id desc
WebElement desc = driver.findElement(By.id("desc"));
desc.clear();
desc.sendKeys("Become a Tech Guru - 2");
//id targetDate
WebElement targetDate = driver.findElement(By.id("targetDate"));
targetDate.clear();
targetDate.sendKeys("12/09/2019");
//save submit
driver.findElement(By.id("save")).submit();
//check desc-10002
String updatedDesc = driver.findElement(By.id("desc-10002")).getText();
//check targetdate-10002
String updatedTargetDate = driver.findElement(By.id("targetdate-10002")).getText();
//Become a Tech Guru - 2
//12/09/2019
assertEquals(updatedDesc, "Become a Tech Guru - 2");
assertEquals(updatedTargetDate, "12/09/2019");
}
@AfterTest
public void afterTest() {
driver.quit();
}
}
```
---
### /web-driver-5-page-object-model/src/test/java/com/in28minutes/pageobjects/updatetodo/UpdateTodoBasicTest3AfterListTodoPage.java
```java
package com.in28minutes.pageobjects.updatetodo;
import static org.testng.Assert.assertEquals;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.PageFactory;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import io.github.bonigarcia.wdm.WebDriverManager;
public class UpdateTodoBasicTest3AfterListTodoPage {
WebDriver driver;
@BeforeTest
public void beforeTest() {
WebDriverManager.chromedriver().setup();
driver = new ChromeDriver();
}
@Test
public void loginPageObject() {
driver.get("http://localhost:8080/login");
LoginPage page = PageFactory.initElements(driver, LoginPage.class);
//driver.findElement(By.id("name")).getAttribute("type")
System.out.println(page.name.getAttribute("type"));//text
//driver.findElement(By.id("password")).getAttribute("type")
System.out.println(page.password.getAttribute("type"));//password
}
@Test
public void updateTodo() {
driver.get("http://localhost:8080/login");
LoginPage page = PageFactory.initElements(driver, LoginPage.class);
page.login("in28minutes", "dummy");
//Click here - Link Text - click
driver.findElement(By.linkText("Click here")).click();
//id update-10002 click
driver.findElement(By.id("update-10002")).click();
TodoPage todoPage = PageFactory.initElements(driver, TodoPage.class);
todoPage.enterDescription("Become a Tech Guru - 2");
todoPage.enterTargetDate("12/09/2019");
todoPage.submit();
//check desc-10002
String updatedDesc = driver.findElement(By.id("desc-10002")).getText();
//check targetdate-10002
String updatedTargetDate = driver.findElement(By.id("targetdate-10002")).getText();
//Become a Tech Guru - 2
//12/09/2019
assertEquals(updatedDesc, "Become a Tech Guru - 2");
assertEquals(updatedTargetDate, "12/09/2019");
}
@AfterTest
public void afterTest() {
driver.quit();
}
}
```
---
### /web-driver-5-page-object-model/src/test/java/com/in28minutes/pageobjects/updatetodo/UpdateTodoBasicTest5AfterExercises.java
```java
package com.in28minutes.pageobjects.updatetodo;
import static org.testng.Assert.assertEquals;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.PageFactory;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import io.github.bonigarcia.wdm.WebDriverManager;
public class UpdateTodoBasicTest5AfterExercises {
WebDriver driver;
@BeforeTest
public void beforeTest() {
WebDriverManager.chromedriver().setup();
driver = new ChromeDriver();
}
@Test
public void loginPageObject() {
driver.get("http://localhost:8080/login");
LoginPage page = PageFactory.initElements(driver, LoginPage.class);
// driver.findElement(By.id("name")).getAttribute("type")
System.out.println(page.name.getAttribute("type"));// text
// driver.findElement(By.id("password")).getAttribute("type")
System.out.println(page.password.getAttribute("type"));// password
}
@Test
public void updateTodo() {
LoginPage page = PageFactory.initElements(driver, LoginPage.class);
page.login("in28minutes", "dummy");
new WelcomePage(driver).clickTodosLink();
ListTodoPage listTodoPage = new ListTodoPage(driver);
listTodoPage.clickUpdateFor("10002");
TodoPage todoPage = PageFactory.initElements(driver, TodoPage.class);
todoPage.enterDetailsAndSubmit("Become a Tech Guru - 2", "12/09/2019");
assertEquals(listTodoPage.getDescription("10002"), "Become a Tech Guru - 2");
assertEquals(listTodoPage.getTargetDate("10002"), "12/09/2019");
}
@AfterTest
public void afterTest() {
driver.quit();
}
}
```
---
### /web-driver-5-page-object-model/src/test/java/com/in28minutes/pageobjects/updatetodo/WelcomePage.java
```java
package com.in28minutes.pageobjects.updatetodo;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
public class WelcomePage {
private WebDriver driver;
public WelcomePage(WebDriver driver) {
super();
this.driver = driver;
}
public void clickTodosLink() {
driver.findElement(By.linkText("Click here")).click();
}
}
```
---
### /web-driver-6-stand-alone-and-grid/src/test/java/com/in28minutes/SeleniumHubTest.java
```java
package com.in28minutes;
import java.net.MalformedURLException;
import java.net.URL;
import org.openqa.selenium.Platform;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.testng.annotations.Test;
import io.github.bonigarcia.wdm.WebDriverManager;
public class SeleniumHubTest {
//selenium-standalone start -- -role hub
//Nodes should register to http://192.168.8.69:4444/grid/register/
//Clients should connect to http://192.168.8.69:4444/wd/hub
//selenium-standalone start -- -role node -hub http://192.168.8.69:4444/grid/register/
//selenium-standalone start -- -role node -port 5556 -hub http://192.168.8.69:4444/grid/register/
@Test(threadPoolSize=2, invocationCount=4)
public void hub_chrome() throws MalformedURLException, InterruptedException {
DesiredCapabilities capabilites = new DesiredCapabilities();
//chrome, firefox, htmlunit, internet explorer, iphone, opera
capabilites.setBrowserName("chrome");
//capabilites.setPlatform(Platform.EL_CAPITAN);
//WebDriverManager.chromedriver().setup();
//WebDriver driver = new ChromeDriver();
WebDriver remoteDriver = new RemoteWebDriver(
new URL("http://localhost:4444/wd/hub"), capabilites);
//RemoteWebDriver
// Location of Standaloneserver
// Which Browser? Which OS? => Capabilities
remoteDriver.get("http://localhost:8080/pages/index.html");
System.out.println(remoteDriver.getCurrentUrl());
System.out.println(remoteDriver.getTitle());
Thread.sleep(10000);
remoteDriver.quit();
}
@Test(threadPoolSize=2, invocationCount=4)
public void hub_firefox() throws MalformedURLException, InterruptedException {
DesiredCapabilities capabilites = new DesiredCapabilities();
//chrome, firefox, htmlunit, internet explorer, iphone, opera
capabilites.setBrowserName("firefox");
//WebDriverManager.chromedriver().setup();
//WebDriver driver = new ChromeDriver();
WebDriver remoteDriver = new RemoteWebDriver(
new URL("http://localhost:4444/wd/hub"), capabilites);
//RemoteWebDriver
// Location of Standaloneserver
// Which Browser? Which OS? => Capabilities
remoteDriver.get("http://localhost:8080/pages/index.html");
System.out.println(remoteDriver.getCurrentUrl());
System.out.println(remoteDriver.getTitle());
Thread.sleep(10000);
remoteDriver.quit();
}
}
```
---
### /web-driver-6-stand-alone-and-grid/src/test/java/com/in28minutes/SeleniumStandAloneTest.java
```java
package com.in28minutes;
import java.net.MalformedURLException;
import java.net.URL;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.testng.annotations.Test;
import io.github.bonigarcia.wdm.WebDriverManager;
public class SeleniumStandAloneTest {
@Test
public void basic() {
WebDriverManager.chromedriver().setup();
WebDriver driver = new ChromeDriver();
driver.get("http://localhost:8080/pages/index.html");
System.out.println(driver.getCurrentUrl());
System.out.println(driver.getTitle());
driver.quit();
}
@Test
public void standalone() throws MalformedURLException, InterruptedException {
DesiredCapabilities capabilites = new DesiredCapabilities();
//chrome, firefox, htmlunit, internet explorer, iphone, opera
capabilites.setBrowserName("chrome");
//WebDriverManager.chromedriver().setup();
//WebDriver driver = new ChromeDriver();
WebDriver remoteDriver = new RemoteWebDriver(
new URL("http://localhost:4444/wd/hub"), capabilites);
//RemoteWebDriver
// Location of Standaloneserver
// Which Browser? Which OS? => Capabilities
remoteDriver.get("http://localhost:8080/pages/index.html");
System.out.println(remoteDriver.getCurrentUrl());
System.out.println(remoteDriver.getTitle());
Thread.sleep(15000);
remoteDriver.quit();
}
}
```
---
================================================
FILE: html-basics/1-first-html.html
================================================
<html>
<head>
<title>Learn Selenium and HTML</title>
</head>
<body>
This is the body of the page.
</body>
</html>
================================================
FILE: html-basics/2-second-html.html
================================================
<html>
<head>
<title>Learn Selenium and HTML - 2</title>
</head>
<body>
<h1>Learning Automation Testing with Selenium and HTML</h1>
I want to learn
<ul>
<li>HTML</li>
<li>CSS</li>
<li>XPath</li>
<li>CSS Selectors</li>
<li>Selenium</li>
</ul>
<ol>
<li>HTML</li>
<li>CSS</li>
<li>XPath</li>
<li>CSS Selectors</li>
<li>Selenium</li>
</ol>
<p >Learning HTML and Selenium is awesome. The following steps are involved</p>
<h2>HTML</h2>
<p>First step is to learn HTML</p>
<h2>CSS</h2>
<p>Second step is to learn CSS</p>
<p>This is the body of the page.</p>
<p>Paragraph 2</p>
<p>Paragraph 3</p>
<div>Division 1</div>
<div>Division 2</div>
<div>Division 3</div>
<p>
<b>Paragraph which will be displayed in bold.</b>
</p>
<p>
<i>Paragraph which will be displayed in italicized.</i>
</p>
<hr/>
<blockquote>Ranga says - You become a great automation tester by learning atleast for an hour every day</blockquote>
<hr/>
<p>
Line1. <br/>
Line2. <br/>
Line3.
</p>
<hr/>
<abc>fkjsaklfjalk</abc>
<def>fkjsaklfjalk</def>
<efg/>
</body>
</html>
================================================
FILE: html-basics/3-tables.html
================================================
<html>
<head>
<title>Learn Tables in HTML</title>
</head>
<body>
<table border="1">
<thead>
<tr>
<td>Football Player</td>
<td>Goals</td>
<td>Country</td>
</tr>
</thead>
<tbody>
<tr>
<td>Ronaldo</td>
<td>10</td>
<td>Portugal</td>
</tr>
<tr>
<td>Messi</td>
<td>10</td>
<td>Argentina</td>
</tr>
<tr>
<td>Player Name</td>
<td>6</td>
<td>Europe</td>
</tr>
<tr>
<td>Player Name 2</td>
<td>3</td>
<td>Europe</td>
</tr>
<tr>
<td>Player Name 3</td>
<td>4</td>
<td>Europe</td>
</tr>
</tbody>
</table>
<!-- Comment
table
thead
tr
td
td
tbody
tr
td
td
tr
td
td
Football Player Goals
Ronaldo 10
Messi 10
-->
</body>
</html>
================================================
FILE: html-basics/4-miscellaneous.html
================================================
<html>
<head>
<title>Learn a few things in HTML</title>
</head>
<body>
<ol>
<li><a href="1-first-html.html">First HTML Page</a> </li>
<li><a href="http://www.in28minutes.com/">Go to in28minutes</a></li>
<li><a target="_blank" href="2-second-html.html"> Second HTML Page</a></li>
</ol>
<img border="1" src="https://avatars3.githubusercontent.com/u/14139137?s=460&v=4"/>
<img src="in28minutes-logo.png"/>
<br/>
<iframe src="http://www.in28minutes.com" height="400px" width="1000px">
IFrame is Not Supported</iframe>
</body>
</html>
================================================
FILE: html-basics/5-nesting-and-more.html
================================================
<html>
<head>
<title>Learn Selenium and HTML 5</title>
</head>
<body>
<div>
<p align="right"> The great thing about HTML is that its simple to learn.
<a href="1-first-html.html">This is the first page we have created</a>
</p>
<p> This is the second thing we have learnt - <a href="2-second-html.html">Here is the link to it</a> </p>
</div>
</body>
</html>
================================================
FILE: html-basics/6-form.html
================================================
<html>
<head>
<title>Learn Forms in HTML </title>
</head>
<body>
Let's get some data from the user:
<ul>
<li>Text</li>
<li>Lot of Text - in multiple lines</li>
<li>Select among options</li>
<li>Yes or No</li>
<li>Click a Button</li>
</ul>
<form method="post" action="accept-information.do">
<label>First Name</label>
<input type="text" name="first-name" size="15" maxlength="20" value="Ranga"/>
<label>Password</label>
<input type="password" name="password"/>
<label>Upload Profile Picture</label>
<input type="file" name="profile-picture"/>
<label>Age</label>
<input type="number" name="age" value="20"/>
<label>Describe Yourselves</label>
<textarea name="description" rows="5" cols="100"></textarea>
<br/>
<label>What do you want to learn?</label>
<input type="radio" name="what-to-learn" value="HTML">HTML
<input type="radio" name="what-to-learn" value="CSS" checked>CSS
<input type="radio" name="what-to-learn" value="AUT">Automation Testing
<input type="radio" name="what-to-learn" value="JAVA">Java
<BR/>
<label>How do you want to Learn?</label>
<select name="how-to-learn" multiple>
<option value="online">Online</option>
<option value="books">Books</option>
<option value="college" selected>College</option>
<option value="other">Other</option>
</select>
<BR/>
<input type="checkbox" name="drive" checked/>
<label>Do You Know to Drive?</label>
<input type="submit"/>
</form>
</body>
</html>
================================================
FILE: html-basics/7-form-with-css.html
================================================
<html>
<head>
<title>Learn Forms in HTML with CSS</title>
<!-- CSS Selectors -->
<style type="text/css">
label {
font-size: 16px;
color: #111111;
}
input, textarea, select {
background-color: antiquewhite;
}
fieldset {
border: 0px;
padding: 20px;
background-color: #EEFFFF;
}
ul {
background-color: #EEFFEE;
}
li {
color: #666666;
}
</style>
</head>
<body>
Let's get some data from the user:
<ul>
<li>Text</li>
<li>Lot of Text - in multiple lines</li>
<li>Select among options</li>
<li>Yes or No</li>
<li>Click a Button</li>
</ul>
<form method="post" action="accept-information.do">
<fieldset>
<label >First Name</label>
<input type="text" name="first-name" size="15" maxlength="20" value="Ranga"/>
<label>Password</label>
<input type="password" name="password"/>
</fieldset>
<!--style="font-size: 25px"-->
<fieldset>
<label >Upload Profile Picture</label>
<input type="file" name="profile-picture"/>
</fieldset>
<fieldset>
<label>Age</label>
<input type="number" name="age" value="20"/>
<label>Describe Yourselves</label>
<textarea name="description" rows="5" cols="100"></textarea>
</fieldset>
<fieldset>
<label>W
gitextract_p7fzfj5_/
├── .gitignore
├── README.md
├── code.md
├── html-basics/
│ ├── 1-first-html.html
│ ├── 2-second-html.html
│ ├── 3-tables.html
│ ├── 4-miscellaneous.html
│ ├── 5-nesting-and-more.html
│ ├── 6-form.html
│ ├── 7-form-with-css.html
│ ├── 8-form-with-external-css.html
│ ├── 9-id-and-class.html
│ └── style.css
├── java-selenium-code.md
├── junit-basics/
│ ├── pom.xml
│ └── src/
│ └── test/
│ └── java/
│ └── com/
│ ├── example/
│ │ └── tests/
│ │ ├── FacebookLogin.java
│ │ ├── FacebookLoginDummy.java
│ │ └── GoogleSearchForIn28minutes.java
│ └── in28minutes/
│ └── tests/
│ ├── FirstJUnitTest.java
│ └── FirstSeleniumJUnitTest.java
├── selenium-ide/
│ ├── FirstKatalonStudioProject.html
│ ├── FirstKatalonStudioProject_files/
│ │ └── css
│ └── FirstSeleniumIDEProject.side
├── testng-basics/
│ ├── pom.xml
│ ├── src/
│ │ └── test/
│ │ └── java/
│ │ └── com/
│ │ ├── example/
│ │ │ └── tests/
│ │ │ ├── FacebookLogin.java
│ │ │ └── GoogleSearchForIn28minutes.java
│ │ └── in28minutes/
│ │ └── test/
│ │ └── testng/
│ │ ├── FirstSeleniumTestNgTest.java
│ │ ├── FirstTestngTest.java
│ │ └── MultipleBrowserTest.java
│ └── testng.xml
├── todo-web-application/
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── in28minutes/
│ │ │ └── springboot/
│ │ │ └── web/
│ │ │ ├── SpringBootFirstWebApplication.java
│ │ │ ├── controller/
│ │ │ │ ├── ErrorController.java
│ │ │ │ ├── FileUploadController.java
│ │ │ │ ├── LoginController.java
│ │ │ │ ├── LogoutController.java
│ │ │ │ ├── TodoController.java
│ │ │ │ └── WelcomeController.java
│ │ │ ├── model/
│ │ │ │ └── Todo.java
│ │ │ └── service/
│ │ │ ├── LoginService.java
│ │ │ ├── TodoRepository.java
│ │ │ └── TodoService.java
│ │ ├── resources/
│ │ │ ├── application.properties
│ │ │ ├── data.sql
│ │ │ └── static/
│ │ │ ├── .gitignore
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── bower.json
│ │ │ ├── data/
│ │ │ │ ├── flot-data.js
│ │ │ │ └── morris-data.js
│ │ │ ├── dist/
│ │ │ │ ├── css/
│ │ │ │ │ └── sb-admin-2.css
│ │ │ │ └── js/
│ │ │ │ └── sb-admin-2.js
│ │ │ ├── gulpfile.js
│ │ │ ├── index.html
│ │ │ ├── js/
│ │ │ │ └── sb-admin-2.js
│ │ │ ├── less/
│ │ │ │ ├── mixins.less
│ │ │ │ ├── sb-admin-2.less
│ │ │ │ └── variables.less
│ │ │ ├── package.json
│ │ │ ├── pages/
│ │ │ │ ├── blank.html
│ │ │ │ ├── buttons.html
│ │ │ │ ├── file-upload.html
│ │ │ │ ├── flot.html
│ │ │ │ ├── forms.html
│ │ │ │ ├── frames-example-left.html
│ │ │ │ ├── frames-example-right.html
│ │ │ │ ├── frames-example.html
│ │ │ │ ├── grid.html
│ │ │ │ ├── icons.html
│ │ │ │ ├── index.html
│ │ │ │ ├── login.html
│ │ │ │ ├── morris.html
│ │ │ │ ├── notifications.html
│ │ │ │ ├── panels-wells.html
│ │ │ │ ├── sortable.html
│ │ │ │ ├── tables.html
│ │ │ │ └── typography.html
│ │ │ └── vendor/
│ │ │ ├── bootstrap/
│ │ │ │ ├── css/
│ │ │ │ │ └── bootstrap.css
│ │ │ │ └── js/
│ │ │ │ └── bootstrap.js
│ │ │ ├── bootstrap-social/
│ │ │ │ ├── bootstrap-social.css
│ │ │ │ ├── bootstrap-social.less
│ │ │ │ └── bootstrap-social.scss
│ │ │ ├── datatables/
│ │ │ │ ├── css/
│ │ │ │ │ ├── dataTables.bootstrap.css
│ │ │ │ │ ├── dataTables.bootstrap4.css
│ │ │ │ │ ├── dataTables.foundation.css
│ │ │ │ │ ├── dataTables.jqueryui.css
│ │ │ │ │ ├── dataTables.material.css
│ │ │ │ │ ├── dataTables.semanticui.css
│ │ │ │ │ ├── dataTables.uikit.css
│ │ │ │ │ ├── jquery.dataTables.css
│ │ │ │ │ └── jquery.dataTables_themeroller.css
│ │ │ │ ├── images/
│ │ │ │ │ └── Sorting icons.psd
│ │ │ │ └── js/
│ │ │ │ ├── dataTables.bootstrap.js
│ │ │ │ ├── dataTables.bootstrap4.js
│ │ │ │ ├── dataTables.foundation.js
│ │ │ │ ├── dataTables.jqueryui.js
│ │ │ │ ├── dataTables.material.js
│ │ │ │ ├── dataTables.semanticui.js
│ │ │ │ ├── dataTables.uikit.js
│ │ │ │ ├── jquery.dataTables.js
│ │ │ │ └── jquery.js
│ │ │ ├── datatables-plugins/
│ │ │ │ ├── dataTables.bootstrap.css
│ │ │ │ ├── dataTables.bootstrap.js
│ │ │ │ └── index.html
│ │ │ ├── datatables-responsive/
│ │ │ │ ├── dataTables.responsive.css
│ │ │ │ ├── dataTables.responsive.js
│ │ │ │ └── dataTables.responsive.scss
│ │ │ ├── flot/
│ │ │ │ ├── excanvas.js
│ │ │ │ ├── jquery.colorhelpers.js
│ │ │ │ ├── jquery.flot.canvas.js
│ │ │ │ ├── jquery.flot.categories.js
│ │ │ │ ├── jquery.flot.crosshair.js
│ │ │ │ ├── jquery.flot.errorbars.js
│ │ │ │ ├── jquery.flot.fillbetween.js
│ │ │ │ ├── jquery.flot.image.js
│ │ │ │ ├── jquery.flot.js
│ │ │ │ ├── jquery.flot.navigate.js
│ │ │ │ ├── jquery.flot.pie.js
│ │ │ │ ├── jquery.flot.resize.js
│ │ │ │ ├── jquery.flot.selection.js
│ │ │ │ ├── jquery.flot.stack.js
│ │ │ │ ├── jquery.flot.symbol.js
│ │ │ │ ├── jquery.flot.threshold.js
│ │ │ │ ├── jquery.flot.time.js
│ │ │ │ └── jquery.js
│ │ │ ├── flot-tooltip/
│ │ │ │ ├── jquery.flot.tooltip.js
│ │ │ │ └── jquery.flot.tooltip.source.js
│ │ │ ├── font-awesome/
│ │ │ │ ├── HELP-US-OUT.txt
│ │ │ │ ├── css/
│ │ │ │ │ └── font-awesome.css
│ │ │ │ ├── fonts/
│ │ │ │ │ └── FontAwesome.otf
│ │ │ │ ├── less/
│ │ │ │ │ ├── animated.less
│ │ │ │ │ ├── bordered-pulled.less
│ │ │ │ │ ├── core.less
│ │ │ │ │ ├── extras.less
│ │ │ │ │ ├── fixed-width.less
│ │ │ │ │ ├── font-awesome.less
│ │ │ │ │ ├── icons.less
│ │ │ │ │ ├── larger.less
│ │ │ │ │ ├── list.less
│ │ │ │ │ ├── mixins.less
│ │ │ │ │ ├── path.less
│ │ │ │ │ ├── rotated-flipped.less
│ │ │ │ │ ├── screen-reader.less
│ │ │ │ │ ├── spinning.less
│ │ │ │ │ ├── stacked.less
│ │ │ │ │ └── variables.less
│ │ │ │ └── scss/
│ │ │ │ ├── _animated.scss
│ │ │ │ ├── _bordered-pulled.scss
│ │ │ │ ├── _core.scss
│ │ │ │ ├── _extras.scss
│ │ │ │ ├── _fixed-width.scss
│ │ │ │ ├── _icons.scss
│ │ │ │ ├── _larger.scss
│ │ │ │ ├── _list.scss
│ │ │ │ ├── _mixins.scss
│ │ │ │ ├── _path.scss
│ │ │ │ ├── _rotated-flipped.scss
│ │ │ │ ├── _screen-reader.scss
│ │ │ │ ├── _spinning.scss
│ │ │ │ ├── _stacked.scss
│ │ │ │ ├── _variables.scss
│ │ │ │ └── font-awesome.scss
│ │ │ ├── jquery/
│ │ │ │ └── jquery.js
│ │ │ ├── metisMenu/
│ │ │ │ ├── metisMenu.css
│ │ │ │ └── metisMenu.js
│ │ │ ├── morrisjs/
│ │ │ │ ├── morris.css
│ │ │ │ └── morris.js
│ │ │ └── raphael/
│ │ │ └── raphael.js
│ │ └── webapp/
│ │ └── WEB-INF/
│ │ └── jsp/
│ │ ├── common/
│ │ │ ├── footer.jspf
│ │ │ ├── header.jspf
│ │ │ └── navigation.jspf
│ │ ├── error.jsp
│ │ ├── file-upload-successful.jsp
│ │ ├── list-todos.jsp
│ │ ├── login.jsp
│ │ ├── todo.jsp
│ │ └── welcome.jsp
│ └── test/
│ └── java/
│ └── com/
│ └── in28minutes/
│ └── springboot/
│ └── web/
│ └── SpringBootFirstWebApplicationTests.java
├── web-driver-1-basics/
│ ├── pom.xml
│ └── src/
│ └── test/
│ └── java/
│ └── com/
│ └── in28minutes/
│ └── webdriver/
│ ├── basics/
│ │ ├── AbstractChromeWebDriverTest.java
│ │ ├── WebDriverBasicsLocatorsPerformanceTest.java
│ │ ├── WebDriverBasicsLocatorsWithCSSSelectorTest.java
│ │ ├── WebDriverBasicsLocatorsWithClassTest.java
│ │ ├── WebDriverBasicsLocatorsWithIdTest.java
│ │ ├── WebDriverBasicsLocatorsWithLinkTextTest.java
│ │ ├── WebDriverBasicsLocatorsWithNameTest.java
│ │ ├── WebDriverBasicsLocatorsWithTagTest.java
│ │ ├── WebDriverBasicsLocatorsWithXPathSelectorTest.java
│ │ └── form/
│ │ ├── FormElementCheckBoxTest.java
│ │ ├── FormElementRadioButtonTest.java
│ │ ├── FormElementSelectTest.java
│ │ └── FormElementTextTest.java
│ └── login/
│ ├── FirstWebApplicationLoginTest.java
│ └── StaticLoginTest.java
├── web-driver-2-more-scenarios/
│ ├── pom.xml
│ ├── src/
│ │ └── test/
│ │ └── java/
│ │ └── com/
│ │ └── in28minutes/
│ │ └── webdriver/
│ │ ├── basics/
│ │ │ └── AbstractChromeWebDriverTest.java
│ │ └── scenarios/
│ │ ├── ActionsBasicTest.java
│ │ ├── CheckElementStylesTest.java
│ │ ├── FramesTest.java
│ │ ├── JavaScriptAlertTest.java
│ │ ├── NewWindowTest.java
│ │ ├── PlayingWithModalWindowAndWaitsTest.java
│ │ ├── PlayingWithScreenWindowTest.java
│ │ ├── ReadTablesTest.java
│ │ ├── RunJavaScriptTest.java
│ │ ├── TakesScreenshotTest.java
│ │ └── framework/
│ │ └── TableReader.java
│ └── testng.xml
├── web-driver-3-cross-browser-framework/
│ ├── pom.xml
│ ├── src/
│ │ └── test/
│ │ └── java/
│ │ └── com/
│ │ └── in28minutes/
│ │ └── selenium/
│ │ └── crossbrowser/
│ │ ├── CrossBrowserBasicsTest.java
│ │ ├── HeadlessBrowserBasicsTest.java
│ │ └── framework/
│ │ └── CrossBrowserFrameworkTest.java
│ └── testng.xml
├── web-driver-4-data-driven-tests/
│ ├── pom.xml
│ └── src/
│ └── test/
│ ├── java/
│ │ └── com/
│ │ └── in28minutes/
│ │ └── datadriventests/
│ │ ├── ExcelReadUtil.java
│ │ ├── LoginDataProviderCompleteCSVTest.java
│ │ ├── LoginDataProviderCompleteExcelTest.java
│ │ ├── LoginDataProviderCompleteTest.java
│ │ ├── SuccessfulLoginBasicTest.java
│ │ ├── UnSuccessfulLoginBasicTest.java
│ │ ├── UnSuccessfulLoginDataDrivenBasicTest.java
│ │ └── UnSuccessfulLoginDataDrivenLevel1Test.java
│ └── resources/
│ ├── login-data.csv
│ └── login-data.xlsx
├── web-driver-5-page-object-model/
│ ├── pom.xml
│ └── src/
│ └── test/
│ └── java/
│ └── com/
│ └── in28minutes/
│ └── pageobjects/
│ └── updatetodo/
│ ├── ListTodoPage.java
│ ├── LoginPage.java
│ ├── TodoPage.java
│ ├── UpdateTodoBasicTest.java
│ ├── UpdateTodoBasicTest1BeforePageObjects.java
│ ├── UpdateTodoBasicTest2AfterLoginPage.java
│ ├── UpdateTodoBasicTest3AfterListTodoPage.java
│ ├── UpdateTodoBasicTest5AfterExercises.java
│ └── WelcomePage.java
└── web-driver-6-stand-alone-and-grid/
├── pom.xml
└── src/
└── test/
└── java/
└── com/
└── in28minutes/
├── SeleniumHubTest.java
└── SeleniumStandAloneTest.java
SYMBOL INDEX (755 symbols across 99 files)
FILE: junit-basics/src/test/java/com/example/tests/FacebookLogin.java
class FacebookLogin (line 20) | public class FacebookLogin {
method setUp (line 26) | @Before
method testFacebookLogin (line 35) | @Test
method tearDown (line 46) | @After
method isElementPresent (line 55) | private boolean isElementPresent(By by) {
method isAlertPresent (line 64) | private boolean isAlertPresent() {
method closeAlertAndGetItsText (line 73) | private String closeAlertAndGetItsText() {
FILE: junit-basics/src/test/java/com/example/tests/FacebookLoginDummy.java
class FacebookLoginDummy (line 22) | public class FacebookLoginDummy {
method setUp (line 28) | @Before
method testFacebookLogin (line 39) | @Test
method tearDown (line 53) | @After
method isElementPresent (line 62) | private boolean isElementPresent(By by) {
method isAlertPresent (line 71) | private boolean isAlertPresent() {
method closeAlertAndGetItsText (line 80) | private String closeAlertAndGetItsText() {
FILE: junit-basics/src/test/java/com/example/tests/GoogleSearchForIn28minutes.java
class GoogleSearchForIn28minutes (line 20) | public class GoogleSearchForIn28minutes {
method setUp (line 26) | @Before
method testGoogleSearchForIn28minutes (line 36) | @Test
method tearDown (line 45) | @After
method isElementPresent (line 54) | private boolean isElementPresent(By by) {
method isAlertPresent (line 63) | private boolean isAlertPresent() {
method closeAlertAndGetItsText (line 72) | private String closeAlertAndGetItsText() {
FILE: junit-basics/src/test/java/com/in28minutes/tests/FirstJUnitTest.java
class SimpleClass (line 7) | class SimpleClass {
method sum (line 8) | public int sum(int[] numbers) {
class FirstJUnitTest (line 19) | public class FirstJUnitTest {
method test (line 21) | @Test
method testFor0Elements (line 41) | @Test
method testFor2Elements (line 61) | @Test
method testFor5Elements (line 81) | @Test
FILE: junit-basics/src/test/java/com/in28minutes/tests/FirstSeleniumJUnitTest.java
class FirstSeleniumJUnitTest (line 14) | public class FirstSeleniumJUnitTest {
method before (line 18) | @Before
method testGoogleDotCom (line 32) | @Test
method testFacebookDotCom (line 53) | @Test
method testSomeErrorScenarioCom (line 67) | @Test
method after (line 82) | @After
FILE: testng-basics/src/test/java/com/example/tests/FacebookLogin.java
class FacebookLogin (line 15) | public class FacebookLogin {
method setUp (line 21) | @BeforeClass(alwaysRun = true)
method testFacebookLogin (line 29) | @Test
method tearDown (line 40) | @AfterClass(alwaysRun = true)
method isElementPresent (line 49) | private boolean isElementPresent(By by) {
method isAlertPresent (line 58) | private boolean isAlertPresent() {
method closeAlertAndGetItsText (line 67) | private String closeAlertAndGetItsText() {
FILE: testng-basics/src/test/java/com/example/tests/GoogleSearchForIn28minutes.java
class GoogleSearchForIn28minutes (line 20) | public class GoogleSearchForIn28minutes {
method setUp (line 26) | @BeforeClass(alwaysRun = true)
method testGoogleSearchForIn28minutes (line 34) | @Test
method tearDown (line 43) | @AfterClass(alwaysRun = true)
method isElementPresent (line 52) | private boolean isElementPresent(By by) {
method isAlertPresent (line 61) | private boolean isAlertPresent() {
method closeAlertAndGetItsText (line 70) | private String closeAlertAndGetItsText() {
FILE: testng-basics/src/test/java/com/in28minutes/test/testng/FirstSeleniumTestNgTest.java
class FirstSeleniumTestNgTest (line 14) | public class FirstSeleniumTestNgTest {
method before (line 18) | @BeforeTest
method testGoogleDotCom (line 32) | @Test
method testFacebookDotCom (line 53) | @Test
method testSomeErrorScenarioCom (line 67) | @Test
method after (line 82) | @AfterTest
FILE: testng-basics/src/test/java/com/in28minutes/test/testng/FirstTestngTest.java
class SimpleClass (line 7) | class SimpleClass {
method sum (line 8) | public int sum(int[] numbers) {
class FirstTestngTest (line 19) | public class FirstTestngTest {
method test (line 21) | @Test
method testFor0Elements (line 41) | @Test
method testFor2Elements (line 61) | @Test
method testFor5Elements (line 81) | @Test
FILE: testng-basics/src/test/java/com/in28minutes/test/testng/MultipleBrowserTest.java
class MultipleBrowserTest (line 6) | public class MultipleBrowserTest {
method runInBrowser (line 8) | @Parameters("browser")
FILE: todo-web-application/src/main/java/com/in28minutes/springboot/web/SpringBootFirstWebApplication.java
class SpringBootFirstWebApplication (line 7) | @SpringBootApplication
method main (line 11) | public static void main(String[] args) {
FILE: todo-web-application/src/main/java/com/in28minutes/springboot/web/controller/ErrorController.java
class ErrorController (line 10) | @Controller("error")
method handleException (line 13) | @ExceptionHandler(Exception.class)
FILE: todo-web-application/src/main/java/com/in28minutes/springboot/web/controller/FileUploadController.java
class FileUploadController (line 11) | @Controller
method uploadFile (line 15) | @RequestMapping(value = "/fileupload", method = RequestMethod.POST)
FILE: todo-web-application/src/main/java/com/in28minutes/springboot/web/controller/LoginController.java
class LoginController (line 13) | @Controller
method rootPage (line 20) | @RequestMapping(value="/", method = RequestMethod.GET)
method showLoginPage (line 25) | @RequestMapping(value="/login", method = RequestMethod.GET)
method showWelcomePage (line 32) | @RequestMapping(value="/login", method = RequestMethod.POST)
FILE: todo-web-application/src/main/java/com/in28minutes/springboot/web/controller/LogoutController.java
class LogoutController (line 9) | @Controller
method logOut (line 11) | @RequestMapping(value = "/logout", method = RequestMethod.GET)
FILE: todo-web-application/src/main/java/com/in28minutes/springboot/web/controller/TodoController.java
class TodoController (line 23) | @Controller
method initBinder (line 30) | @InitBinder
method showTodos (line 37) | @RequestMapping(value = "/list-todos", method = RequestMethod.GET)
method getLoggedInUserName (line 48) | private String getLoggedInUserName(ModelMap model) {
method showAddTodoPage (line 52) | @RequestMapping(value = "/add-todo", method = RequestMethod.GET)
method deleteTodo (line 58) | @RequestMapping(value = "/delete-todo", method = RequestMethod.GET)
method showUpdateTodoPage (line 68) | @RequestMapping(value = "/update-todo", method = RequestMethod.GET)
method updateTodo (line 76) | @RequestMapping(value = "/update-todo", method = RequestMethod.POST)
method addTodo (line 91) | @RequestMapping(value = "/add-todo", method = RequestMethod.POST)
FILE: todo-web-application/src/main/java/com/in28minutes/springboot/web/controller/WelcomeController.java
class WelcomeController (line 9) | @Controller
method showWelcomePage (line 13) | @RequestMapping(value = "/welcome", method = RequestMethod.GET)
FILE: todo-web-application/src/main/java/com/in28minutes/springboot/web/model/Todo.java
class Todo (line 10) | @Entity
method Todo (line 25) | public Todo() {
method Todo (line 29) | public Todo(int id, String user, String desc, Date targetDate,
method getId (line 39) | public int getId() {
method setId (line 43) | public void setId(int id) {
method getUser (line 47) | public String getUser() {
method setUser (line 51) | public void setUser(String user) {
method getDesc (line 55) | public String getDesc() {
method setDesc (line 59) | public void setDesc(String desc) {
method getTargetDate (line 63) | public Date getTargetDate() {
method setTargetDate (line 67) | public void setTargetDate(Date targetDate) {
method isDone (line 71) | public boolean isDone() {
method setDone (line 75) | public void setDone(boolean isDone) {
method hashCode (line 79) | @Override
method equals (line 87) | @Override
method toString (line 105) | @Override
FILE: todo-web-application/src/main/java/com/in28minutes/springboot/web/service/LoginService.java
class LoginService (line 5) | @Service
method validateUser (line 8) | public boolean validateUser(String userid, String password) {
FILE: todo-web-application/src/main/java/com/in28minutes/springboot/web/service/TodoRepository.java
type TodoRepository (line 9) | public interface TodoRepository extends JpaRepository<Todo, Integer>{
method findByUserOrderByTargetDateAsc (line 10) | List<Todo> findByUserOrderByTargetDateAsc(String user);
FILE: todo-web-application/src/main/java/com/in28minutes/springboot/web/service/TodoService.java
class TodoService (line 12) | @Service
method retrieveTodos (line 25) | public List<Todo> retrieveTodos(String user) {
method retrieveTodo (line 35) | public Todo retrieveTodo(int id) {
method updateTodo (line 44) | public void updateTodo(Todo todo){
method addTodo (line 49) | public void addTodo(String name, String desc, Date targetDate,
method deleteTodo (line 54) | public void deleteTodo(int id) {
FILE: todo-web-application/src/main/resources/static/data/flot-data.js
function plot (line 7) | function plot() {
function euroFormatter (line 1052) | function euroFormatter(v, axis) {
function doPlot (line 1056) | function doPlot(position) {
function getRandomData (line 1117) | function getRandomData() {
FILE: todo-web-application/src/main/resources/static/vendor/bootstrap/js/bootstrap.js
function transitionEnd (line 34) | function transitionEnd() {
function removeElement (line 126) | function removeElement() {
function Plugin (line 142) | function Plugin(option) {
function Plugin (line 251) | function Plugin(option) {
function Plugin (line 475) | function Plugin(option) {
function getTargetFromTrigger (line 695) | function getTargetFromTrigger($trigger) {
function Plugin (line 707) | function Plugin(option) {
function getParent (line 774) | function getParent($this) {
function clearMenus (line 787) | function clearMenus(e) {
function Plugin (line 880) | function Plugin(option) {
function Plugin (line 1208) | function Plugin(option, _relatedTarget) {
function complete (line 1574) | function complete() {
function Plugin (line 1750) | function Plugin(option) {
function Plugin (line 1859) | function Plugin(option) {
function ScrollSpy (line 1902) | function ScrollSpy(element, options) {
function Plugin (line 2022) | function Plugin(option) {
function next (line 2131) | function next() {
function Plugin (line 2177) | function Plugin(option) {
function Plugin (line 2334) | function Plugin(option) {
FILE: todo-web-application/src/main/resources/static/vendor/datatables/js/jquery.dataTables.js
function _fnHungarianMap (line 1650) | function _fnHungarianMap ( o )
function _fnCamelToHungarian (line 1688) | function _fnCamelToHungarian ( src, user, force )
function _fnLanguageCompat (line 1727) | function _fnLanguageCompat( lang )
function _fnCompatOpts (line 1779) | function _fnCompatOpts ( init )
function _fnCompatCols (line 1820) | function _fnCompatCols ( init )
function _fnBrowserDetect (line 1840) | function _fnBrowserDetect( settings )
function _fnReduce (line 1920) | function _fnReduce ( that, fn, init, start, end, inc )
function _fnAddColumn (line 1954) | function _fnAddColumn( oSettings, nTh )
function _fnColumnOptions (line 1986) | function _fnColumnOptions( oSettings, iCol, oOptions )
function _fnAdjustColumnSizing (line 2114) | function _fnAdjustColumnSizing ( settings )
function _fnVisibleToColumnIndex (line 2146) | function _fnVisibleToColumnIndex( oSettings, iMatch )
function _fnColumnIndexToVisible (line 2164) | function _fnColumnIndexToVisible( oSettings, iMatch )
function _fnVisbleColumns (line 2179) | function _fnVisbleColumns( oSettings )
function _fnGetColumns (line 2202) | function _fnGetColumns( oSettings, sParam )
function _fnColumnTypes (line 2221) | function _fnColumnTypes ( settings )
function _fnApplyColumnDefs (line 2292) | function _fnApplyColumnDefs( oSettings, aoColDefs, aoCols, fn )
function _fnAddData (line 2372) | function _fnAddData ( oSettings, aDataIn, nTr, anTds )
function _fnAddTr (line 2422) | function _fnAddTr( settings, trs )
function _fnNodeToDataIndex (line 2445) | function _fnNodeToDataIndex( oSettings, n )
function _fnNodeToColumnIndex (line 2459) | function _fnNodeToColumnIndex( oSettings, iRow, n )
function _fnGetCellData (line 2474) | function _fnGetCellData( settings, rowIdx, colIdx, type )
function _fnSetCellData (line 2522) | function _fnSetCellData( settings, rowIdx, colIdx, val )
function _fnSplitObjNotation (line 2544) | function _fnSplitObjNotation( str )
function _fnGetObjectDataFn (line 2559) | function _fnGetObjectDataFn( mSource )
function _fnSetObjectDataFn (line 2684) | function _fnSetObjectDataFn( mSource )
function _fnGetDataMaster (line 2803) | function _fnGetDataMaster ( settings )
function _fnClearTable (line 2814) | function _fnClearTable( settings )
function _fnDeleteIndex (line 2830) | function _fnDeleteIndex( a, iTarget, splice )
function _fnInvalidate (line 2869) | function _fnInvalidate( settings, rowIdx, src, colIdx )
function _fnGetRowElements (line 2947) | function _fnGetRowElements( settings, row, colIdx, d )
function _fnCreateTr (line 3056) | function _fnCreateTr ( oSettings, iRow, nTrIn, anTds )
function _fnRowAttributes (line 3140) | function _fnRowAttributes( settings, row )
function _fnBuildHead (line 3180) | function _fnBuildHead( oSettings )
function _fnDrawHead (line 3266) | function _fnDrawHead( oSettings, aoSource, bIncludeHidden )
function _fnDraw (line 3364) | function _fnDraw( oSettings )
function _fnReDraw (line 3505) | function _fnReDraw( settings, holdPosition )
function _fnAddOptionsHtml (line 3543) | function _fnAddOptionsHtml ( oSettings )
function _fnDetectHeader (line 3699) | function _fnDetectHeader ( aLayout, nThead )
function _fnGetUniqueThs (line 3774) | function _fnGetUniqueThs ( oSettings, nHeader, aLayout )
function _fnBuildAjax (line 3811) | function _fnBuildAjax( oSettings, data, fn )
function _fnAjaxUpdate (line 3944) | function _fnAjaxUpdate( settings )
function _fnAjaxParameters (line 3975) | function _fnAjaxParameters( settings )
function _fnAjaxUpdateDraw (line 4083) | function _fnAjaxUpdateDraw ( settings, json )
function _fnAjaxDataSrc (line 4133) | function _fnAjaxDataSrc ( oSettings, json )
function _fnFeatureHtmlFilter (line 4156) | function _fnFeatureHtmlFilter ( settings )
function _fnFilterComplete (line 4244) | function _fnFilterComplete ( oSettings, oInput, iForce )
function _fnFilterCustom (line 4297) | function _fnFilterCustom( settings )
function _fnFilterColumn (line 4334) | function _fnFilterColumn ( settings, searchStr, colIdx, regex, smart, ca...
function _fnFilter (line 4364) | function _fnFilter( settings, input, force, regex, smart, caseInsensitive )
function _fnFilterCreateSearch (line 4416) | function _fnFilterCreateSearch( search, regex, smart, caseInsensitive )
function _fnFilterData (line 4458) | function _fnFilterData ( settings )
function _fnSearchToCamel (line 4531) | function _fnSearchToCamel ( obj )
function _fnSearchToHung (line 4550) | function _fnSearchToHung ( obj )
function _fnFeatureHtmlInfo (line 4566) | function _fnFeatureHtmlInfo ( settings )
function _fnUpdateInfo (line 4600) | function _fnUpdateInfo ( settings )
function _fnInfoMacros (line 4638) | function _fnInfoMacros ( settings, str )
function _fnInitialise (line 4665) | function _fnInitialise ( settings )
function _fnInitComplete (line 4749) | function _fnInitComplete ( settings, json )
function _fnLengthChange (line 4764) | function _fnLengthChange ( settings, val )
function _fnFeatureHtmlLength (line 4782) | function _fnFeatureHtmlLength ( settings )
function _fnFeatureHtmlPaginate (line 4843) | function _fnFeatureHtmlPaginate ( settings )
function _fnPageChange (line 4904) | function _fnPageChange ( settings, action, redraw )
function _fnFeatureHtmlProcessing (line 4977) | function _fnFeatureHtmlProcessing ( settings )
function _fnProcessingDisplay (line 4994) | function _fnProcessingDisplay ( settings, show )
function _fnFeatureHtmlTable (line 5009) | function _fnFeatureHtmlTable ( settings )
function _fnScrollDraw (line 5167) | function _fnScrollDraw ( settings )
function _fnApplyToChildren (line 5446) | function _fnApplyToChildren( fn, an1, an2 )
function _fnCalculateColumnWidths (line 5485) | function _fnCalculateColumnWidths ( oSettings )
function _fnConvertToWidth (line 5723) | function _fnConvertToWidth ( width, parent )
function _fnGetWidestNode (line 5747) | function _fnGetWidestNode( settings, colIdx )
function _fnGetMaxLenString (line 5768) | function _fnGetMaxLenString( settings, colIdx )
function _fnStringToCss (line 5793) | function _fnStringToCss( s )
function _fnSortFlatten (line 5813) | function _fnSortFlatten ( settings )
function _fnSort (line 5885) | function _fnSort ( oSettings )
function _fnSortAria (line 6011) | function _fnSortAria ( settings )
function _fnSortListener (line 6066) | function _fnSortListener ( settings, colIdx, append, callback )
function _fnSortAttachListener (line 6150) | function _fnSortAttachListener ( settings, attachTo, colIdx, callback )
function _fnSortingClasses (line 6188) | function _fnSortingClasses( settings )
function _fnSortData (line 6221) | function _fnSortData( settings, idx )
function _fnSaveState (line 6264) | function _fnSaveState ( settings )
function _fnLoadState (line 6299) | function _fnLoadState ( settings, oInit )
function _fnSettingsFromNode (line 6386) | function _fnSettingsFromNode ( table )
function _fnLog (line 6405) | function _fnLog( settings, level, msg, tn )
function _fnMap (line 6448) | function _fnMap( ret, src, name, mappedName )
function _fnExtend (line 6490) | function _fnExtend( out, extender, breakRefs )
function _fnBindAction (line 6526) | function _fnBindAction( n, oData, fn )
function _fnCallbackReg (line 6555) | function _fnCallbackReg( oSettings, sStore, fn, sName )
function _fnCallbackFire (line 6581) | function _fnCallbackFire( settings, callbackArr, eventName, args )
function _fnLengthOverflow (line 6603) | function _fnLengthOverflow ( settings )
function _fnRenderer (line 6628) | function _fnRenderer( settings, type )
function _fnDataSource (line 6657) | function _fnDataSource ( settings )
function _numbers (line 14444) | function _numbers ( page, pages ) {
function _addNumericSort (line 14731) | function _addNumericSort ( decimalPlace ) {
function _fnExternApiFunc (line 14979) | function _fnExternApiFunc (fn)
FILE: todo-web-application/src/main/resources/static/vendor/datatables/js/jquery.js
function s (line 2) | function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"funct...
function fa (line 2) | function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.node...
function ga (line 2) | function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLengt...
function ha (line 2) | function ha(a){return a[u]=!0,a}
function ia (line 2) | function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){re...
function ja (line 2) | function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[...
function ka (line 2) | function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sou...
function la (line 2) | function la(a){return function(b){var c=b.nodeName.toLowerCase();return"...
function ma (line 2) | function ma(a){return function(b){var c=b.nodeName.toLowerCase();return(...
function na (line 2) | function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,...
function oa (line 2) | function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}
function pa (line 2) | function pa(){}
function qa (line 2) | function qa(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}
function ra (line 2) | function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.firs...
function sa (line 2) | function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e-...
function ta (line 2) | function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}
function ua (line 2) | function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(...
function va (line 2) | function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)...
function wa (line 2) | function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.r...
function xa (line 2) | function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var...
function z (line 2) | function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){retur...
function F (line 2) | function F(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}
function H (line 2) | function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!...
function J (line 2) | function J(){d.addEventListener?(d.removeEventListener("DOMContentLoaded...
function K (line 2) | function K(){(d.addEventListener||"load"===a.event.type||"complete"===d....
function P (line 2) | function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace...
function Q (line 2) | function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&...
function R (line 3) | function R(a,b,d,e){if(M(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cach...
function S (line 3) | function S(a,b,c){if(M(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.ex...
function X (line 3) | function X(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:functi...
function ca (line 3) | function ca(a){var b=ba.split("|"),c=a.createDocumentFragment();if(c.cre...
function ea (line 3) | function ea(a,b){var c,d,e=0,f="undefined"!=typeof a.getElementsByTagNam...
function fa (line 3) | function fa(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval"...
function ia (line 3) | function ia(a){Z.test(a.type)&&(a.defaultChecked=a.checked)}
function ja (line 3) | function ja(a,b,c,d,e){for(var f,g,h,i,j,k,m,o=a.length,p=ca(b),q=[],r=0...
function pa (line 3) | function pa(){return!0}
function qa (line 3) | function qa(){return!1}
function ra (line 3) | function ra(){try{return d.activeElement}catch(a){}}
function sa (line 3) | function sa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof...
function Ca (line 3) | function Ca(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeTyp...
function Da (line 3) | function Da(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}
function Ea (line 3) | function Ea(a){var b=ya.exec(a.type);return b?a.type=b[1]:a.removeAttrib...
function Fa (line 3) | function Fa(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a)...
function Ga (line 3) | function Ga(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCas...
function Ha (line 3) | function Ha(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-...
function Ia (line 3) | function Ia(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)...
function La (line 3) | function La(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[...
function Ma (line 3) | function Ma(a){var b=d,c=Ka[a];return c||(c=La(a,b),"none"!==c&&c||(Ja=(...
function k (line 3) | function k(){var k,l,m=d.documentElement;m.appendChild(i),j.style.cssTex...
function Ua (line 3) | function Ua(a,b){return{get:function(){return a()?void delete this.get:(...
function bb (line 3) | function bb(a){if(a in ab)return a;var b=a.charAt(0).toUpperCase()+a.sli...
function cb (line 3) | function cb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.styl...
function db (line 3) | function db(a,b,c){var d=Ya.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[...
function eb (line 3) | function eb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===...
function fb (line 3) | function fb(b,c,e){var f=!0,g="width"===c?b.offsetWidth:b.offsetHeight,h...
function gb (line 4) | function gb(a,b,c,d,e){return new gb.prototype.init(a,b,c,d,e)}
function lb (line 4) | function lb(){return a.setTimeout(function(){hb=void 0}),hb=n.now()}
function mb (line 4) | function mb(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=V[e],d[...
function nb (line 4) | function nb(a,b,c){for(var d,e=(qb.tweeners[b]||[]).concat(qb.tweeners["...
function ob (line 4) | function ob(a,b,c){var d,e,f,g,h,i,j,k,m=this,o={},p=a.style,q=a.nodeTyp...
function pb (line 4) | function pb(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a...
function qb (line 4) | function qb(a,b,c){var d,e,f=0,g=qb.prefilters.length,h=n.Deferred().alw...
function Bb (line 4) | function Bb(a){return n.attr(a,"class")||""}
function Sb (line 4) | function Sb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var ...
function Tb (line 4) | function Tb(a,b,c,d){var e={},f=a===Ob;function g(h){var i;return e[h]=!...
function Ub (line 4) | function Ub(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(d in b)voi...
function Vb (line 4) | function Vb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[...
function Wb (line 4) | function Wb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])fo...
function y (line 4) | function y(b,c,d,e){var k,s,t,v,x,y=c;2!==u&&(u=2,h&&a.clearTimeout(h),j...
function Xb (line 4) | function Xb(a){return a.style&&a.style.display||n.css(a,"display")}
function Yb (line 4) | function Yb(a){while(a&&1===a.nodeType){if("none"===Xb(a)||"hidden"===a....
function cc (line 4) | function cc(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||$b....
function gc (line 4) | function gc(){try{return new a.XMLHttpRequest}catch(b){}}
function hc (line 4) | function hc(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(...
function lc (line 4) | function lc(a){return n.isWindow(a)?a:9===a.nodeType?a.defaultView||a.pa...
FILE: todo-web-application/src/main/resources/static/vendor/flot-tooltip/jquery.flot.tooltip.js
function mouseMove (line 120) | function mouseMove(e){
function plotclick (line 130) | function plotclick(event, pos, item) {
function plothover (line 146) | function plothover(event, pos, item) {
FILE: todo-web-application/src/main/resources/static/vendor/flot-tooltip/jquery.flot.tooltip.source.js
function mouseMove (line 109) | function mouseMove(e){
function plotclick (line 119) | function plotclick(event, pos, item) {
function plothover (line 135) | function plothover(event, pos, item) {
FILE: todo-web-application/src/main/resources/static/vendor/flot/excanvas.js
function getContext (line 59) | function getContext() {
function bind (line 82) | function bind(f, obj, var_args) {
function encodeHtmlAttribute (line 89) | function encodeHtmlAttribute(s) {
function addNamespace (line 93) | function addNamespace(doc, prefix, urn) {
function addNamespacesAndStylesheet (line 99) | function addNamespacesAndStylesheet(doc) {
function onPropertyChange (line 178) | function onPropertyChange(e) {
function onResize (line 196) | function onResize(e) {
function createMatrixIdentity (line 214) | function createMatrixIdentity() {
function matrixMultiply (line 222) | function matrixMultiply(m1, m2) {
function copyState (line 239) | function copyState(o1, o2) {
function getRgbHslContent (line 394) | function getRgbHslContent(styleString) {
function percent (line 405) | function percent(s) {
function clamp (line 409) | function clamp(v, min, max) {
function hslToRgb (line 413) | function hslToRgb(parts){
function hueToRgb (line 435) | function hueToRgb(m1, m2, h) {
function processStyle (line 453) | function processStyle(styleString) {
function processFontStyle (line 496) | function processFontStyle(styleString) {
function getComputedStyle (line 518) | function getComputedStyle(style, element) {
function buildStyle (line 550) | function buildStyle(style) {
function processLineCap (line 560) | function processLineCap(lineCap) {
function CanvasRenderingContext2D_ (line 570) | function CanvasRenderingContext2D_(canvasElement) {
function bezierCurveTo (line 649) | function bezierCurveTo(self, cp1, cp2, p) {
function appendStroke (line 978) | function appendStroke(ctx, lineStr) {
function appendFill (line 1001) | function appendFill(ctx, lineStr, min, max) {
function getCoords (line 1112) | function getCoords(ctx, aX, aY) {
function matrixIsFinite (line 1135) | function matrixIsFinite(m) {
function setM (line 1141) | function setM(ctx, m, updateLineScale) {
function CanvasGradient_ (line 1344) | function CanvasGradient_(aType) {
function CanvasPattern_ (line 1362) | function CanvasPattern_(image, repetition) {
function throwException (line 1384) | function throwException(s) {
function assertImageIsValid (line 1388) | function assertImageIsValid(img) {
function DOMException_ (line 1397) | function DOMException_(s) {
FILE: todo-web-application/src/main/resources/static/vendor/flot/jquery.colorhelpers.js
function clamp (line 55) | function clamp(min, value, max) {
FILE: todo-web-application/src/main/resources/static/vendor/flot/jquery.flot.canvas.js
function init (line 42) | function init(plot, classes) {
FILE: todo-web-application/src/main/resources/static/vendor/flot/jquery.flot.categories.js
function processRawData (line 56) | function processRawData(plot, series, data, datapoints) {
function getNextIndex (line 97) | function getNextIndex(categories) {
function categoriesTickGenerator (line 107) | function categoriesTickGenerator(axis) {
function setupCategoriesForAxis (line 120) | function setupCategoriesForAxis(series, axis, datapoints) {
function transformPointsOnAxis (line 146) | function transformPointsOnAxis(datapoints, axis, categories) {
function processDatapoints (line 174) | function processDatapoints(plot, series, datapoints) {
function init (line 179) | function init(plot) {
FILE: todo-web-application/src/main/resources/static/vendor/flot/jquery.flot.crosshair.js
function init (line 70) | function init(plot) {
FILE: todo-web-application/src/main/resources/static/vendor/flot/jquery.flot.errorbars.js
function processRawData (line 76) | function processRawData(plot, series, data, datapoints){
function parseErrors (line 107) | function parseErrors(series, i){
function drawSeriesErrors (line 162) | function drawSeriesErrors(plot, ctx, s){
function drawError (line 275) | function drawError(ctx,err,x,y,upper,lower,drawUpper,drawLower,radius,of...
function drawPath (line 322) | function drawPath(ctx, pts){
function draw (line 330) | function draw(plot, ctx){
function init (line 342) | function init(plot) {
FILE: todo-web-application/src/main/resources/static/vendor/flot/jquery.flot.fillbetween.js
function init (line 40) | function init( plot ) {
FILE: todo-web-application/src/main/resources/static/vendor/flot/jquery.flot.image.js
function drawSeries (line 118) | function drawSeries(plot, ctx, series) {
function processRawData (line 216) | function processRawData(plot, series, data, datapoints) {
function init (line 230) | function init(plot) {
FILE: todo-web-application/src/main/resources/static/vendor/flot/jquery.flot.js
function clamp (line 32) | function clamp(min,value,max){return value<min?min:value>max?max:value}
function Canvas (line 67) | function Canvas(cls, container) {
function Plot (line 508) | function Plot(placeholder, data_, options_, plugins) {
function floorInBase (line 3164) | function floorInBase(n, base) {
FILE: todo-web-application/src/main/resources/static/vendor/flot/jquery.flot.navigate.js
function e (line 90) | function e(h){var k,j=this,l=h.data||{};if(l.elem)j=h.dragTarget=l.elem,...
function f (line 90) | function f(b,c,d){b.type=c;var e=a.event.dispatch.call(d,b);return e===!...
function g (line 90) | function g(a){return Math.pow(a,2)}
function h (line 90) | function h(){return d.dragging===!1}
function i (line 90) | function i(a,b){a&&(a.unselectable=b?"off":"on",a.onselectstart=function...
function e (line 103) | function e(a){var b=a||window.event,c=[].slice.call(arguments,1),f=0,e=0...
function init (line 126) | function init(plot) {
FILE: todo-web-application/src/main/resources/static/vendor/flot/jquery.flot.pie.js
function init (line 68) | function init(plot) {
FILE: todo-web-application/src/main/resources/static/vendor/flot/jquery.flot.resize.js
function a (line 22) | function a(e,n,a){var r=$(this),s=r.data(m)||{};s.w=n!==t?n:r.width();s....
function h (line 22) | function h(t){if(r===true){r=t||1}for(var s=i.length-1;s>=0;s--){var l=$...
function init (line 27) | function init(plot) {
FILE: todo-web-application/src/main/resources/static/vendor/flot/jquery.flot.selection.js
function init (line 82) | function init(plot) {
FILE: todo-web-application/src/main/resources/static/vendor/flot/jquery.flot.stack.js
function init (line 43) | function init(plot) {
FILE: todo-web-application/src/main/resources/static/vendor/flot/jquery.flot.symbol.js
function processRawData (line 17) | function processRawData(plot, series, datapoints) {
function init (line 62) | function init(plot) {
FILE: todo-web-application/src/main/resources/static/vendor/flot/jquery.flot.threshold.js
function init (line 50) | function init(plot) {
FILE: todo-web-application/src/main/resources/static/vendor/flot/jquery.flot.time.js
function floorInBase (line 24) | function floorInBase(n, base) {
function formatDate (line 31) | function formatDate(d, fmt, monthNames, dayNames) {
function makeUtcWrapper (line 111) | function makeUtcWrapper(d) {
function dateGenerator (line 145) | function dateGenerator(ts, opts) {
function init (line 197) | function init(plot) {
FILE: todo-web-application/src/main/resources/static/vendor/flot/jquery.js
function createOptions (line 911) | function createOptions( options ) {
function dataAttr (line 1801) | function dataAttr( elem, key, data ) {
function isEmptyDataObject (line 1833) | function isEmptyDataObject( obj ) {
function returnFalse (line 3274) | function returnFalse() {
function returnTrue (line 3277) | function returnTrue() {
function Sizzle (line 3880) | function Sizzle( selector, context, results, seed ) {
function createInputPseudo (line 3949) | function createInputPseudo( type ) {
function createButtonPseudo (line 3957) | function createButtonPseudo( type ) {
function createPositionalPseudo (line 3965) | function createPositionalPseudo( fn ) {
function siblingCheck (line 4560) | function siblingCheck( a, b, ret ) {
function tokenize (line 4683) | function tokenize( selector, parseOnly ) {
function addCombinator (line 4746) | function addCombinator( matcher, combinator, base ) {
function elementMatcher (line 4798) | function elementMatcher( matchers ) {
function condense (line 4812) | function condense( unmatched, map, filter, context, xml ) {
function setMatcher (line 4833) | function setMatcher( preFilter, selector, matcher, postFilter, postFinde...
function matcherFromTokens (line 4926) | function matcherFromTokens( tokens ) {
function matcherFromGroupMatchers (line 4978) | function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
function multipleContexts (line 5102) | function multipleContexts( selector, contexts, results ) {
function select (line 5111) | function select( selector, context, results, seed, xml ) {
function setFilters (line 5338) | function setFilters() {}
function isDisconnected (line 5504) | function isDisconnected( node ) {
function sibling (line 5508) | function sibling( cur, dir ) {
function winnow (line 5616) | function winnow( elements, qualifier, keep ) {
function createSafeFragment (line 5649) | function createSafeFragment( document ) {
function findOrAppend (line 6033) | function findOrAppend( elem, tag ) {
function cloneCopyEvent (line 6037) | function cloneCopyEvent( src, dest ) {
function cloneFixAttributes (line 6065) | function cloneFixAttributes( src, dest ) {
function getAll (line 6208) | function getAll( elem ) {
function fixDefaultChecked (line 6221) | function fixDefaultChecked( elem ) {
function jQuerySub (line 6517) | function jQuerySub( selector, context ) {
function vendorPropName (line 6563) | function vendorPropName( style, name ) {
function isHidden (line 6585) | function isHidden( elem, el ) {
function showHide (line 6590) | function showHide( elements, show ) {
function setPositiveNumber (line 6900) | function setPositiveNumber( elem, value, subtract ) {
function augmentWidthOrHeight (line 6907) | function augmentWidthOrHeight( elem, name, extra, isBorderBox ) {
function getWidthOrHeight (line 6949) | function getWidthOrHeight( elem, name, extra ) {
function css_defaultDisplay (line 6992) | function css_defaultDisplay( nodeName ) {
function buildParams (line 7246) | function buildParams( prefix, obj, traditional, add ) {
function addToPrefiltersOrTransports (line 7335) | function addToPrefiltersOrTransports( structure ) {
function inspectPrefiltersOrTransports (line 7369) | function inspectPrefiltersOrTransports( structure, options, originalOpti...
function ajaxExtend (line 7411) | function ajaxExtend( target, src ) {
function done (line 7722) | function done( status, nativeStatusText, responses, headers ) {
function ajaxHandleResponses (line 8015) | function ajaxHandleResponses( s, jqXHR, responses ) {
function ajaxConvert (line 8077) | function ajaxConvert( s, response ) {
function createStandardXHR (line 8344) | function createStandardXHR() {
function createActiveXHR (line 8350) | function createActiveXHR() {
function createFxNow (line 8604) | function createFxNow() {
function createTweens (line 8611) | function createTweens( animation, props ) {
function Animation (line 8626) | function Animation( elem, properties, options ) {
function propFilter (line 8724) | function propFilter( props, specialEasing ) {
function defaultPrefilter (line 8791) | function defaultPrefilter( elem, props, opts ) {
function Tween (line 8915) | function Tween( elem, options, prop, end, easing ) {
function genFx (line 9099) | function genFx( type, includeWidth ) {
function getWindow (line 9405) | function getWindow( elem ) {
FILE: todo-web-application/src/main/resources/static/vendor/jquery/jquery.js
function DOMEval (line 77) | function DOMEval( code, doc ) {
function isArrayLike (line 528) | function isArrayLike( obj ) {
function Sizzle (line 760) | function Sizzle( selector, context, results, seed ) {
function createCache (line 899) | function createCache() {
function markFunction (line 917) | function markFunction( fn ) {
function assert (line 926) | function assert( fn ) {
function addHandle (line 948) | function addHandle( attrs, handler ) {
function siblingCheck (line 963) | function siblingCheck( a, b ) {
function createInputPseudo (line 989) | function createInputPseudo( type ) {
function createButtonPseudo (line 1000) | function createButtonPseudo( type ) {
function createDisabledPseudo (line 1011) | function createDisabledPseudo( disabled ) {
function createPositionalPseudo (line 1039) | function createPositionalPseudo( fn ) {
function testContext (line 1062) | function testContext( context ) {
function setFilters (line 2118) | function setFilters() {}
function toSelector (line 2189) | function toSelector( tokens ) {
function addCombinator (line 2199) | function addCombinator( matcher, combinator, base ) {
function elementMatcher (line 2261) | function elementMatcher( matchers ) {
function multipleContexts (line 2275) | function multipleContexts( selector, contexts, results ) {
function condense (line 2284) | function condense( unmatched, map, filter, context, xml ) {
function setMatcher (line 2305) | function setMatcher( preFilter, selector, matcher, postFilter, postFinde...
function matcherFromTokens (line 2398) | function matcherFromTokens( tokens ) {
function matcherFromGroupMatchers (line 2456) | function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
function winnow (line 2798) | function winnow( elements, qualifier, not ) {
function sibling (line 3094) | function sibling( cur, dir ) {
function createOptions (line 3170) | function createOptions( options ) {
function Identity (line 3395) | function Identity( v ) {
function Thrower (line 3398) | function Thrower( ex ) {
function adoptValue (line 3402) | function adoptValue( value, resolve, reject ) {
function resolve (line 3494) | function resolve( depth, deferred, handler, special ) {
function completed (line 3860) | function completed() {
function Data (line 3959) | function Data() {
function dataAttr (line 4128) | function dataAttr( elem, key, data ) {
function adjustCSS (line 4448) | function adjustCSS( elem, prop, valueParts, tween ) {
function getDefaultDisplay (line 4513) | function getDefaultDisplay( elem ) {
function showHide (line 4536) | function showHide( elements, show ) {
function getAll (line 4637) | function getAll( context, tag ) {
function setGlobalEval (line 4654) | function setGlobalEval( elems, refElements ) {
function buildFragment (line 4670) | function buildFragment( elems, context, scripts, selection, ignored ) {
function returnTrue (line 4793) | function returnTrue() {
function returnFalse (line 4797) | function returnFalse() {
function safeActiveElement (line 4803) | function safeActiveElement() {
function on (line 4809) | function on( elem, types, selector, data, fn, one ) {
function manipulationTarget (line 5518) | function manipulationTarget( elem, content ) {
function disableScript (line 5529) | function disableScript( elem ) {
function restoreScript (line 5533) | function restoreScript( elem ) {
function cloneCopyEvent (line 5545) | function cloneCopyEvent( src, dest ) {
function fixInput (line 5580) | function fixInput( src, dest ) {
function domManip (line 5593) | function domManip( collection, args, callback, ignored ) {
function remove (line 5683) | function remove( elem, selector, keepData ) {
function computeStyleTests (line 5976) | function computeStyleTests() {
function curCSS (line 6050) | function curCSS( elem, name, computed ) {
function addGetHookIf (line 6097) | function addGetHookIf( conditionFn, hookFn ) {
function vendorPropName (line 6133) | function vendorPropName( name ) {
function setPositiveNumber (line 6152) | function setPositiveNumber( elem, value, subtract ) {
function augmentWidthOrHeight (line 6164) | function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
function getWidthOrHeight (line 6208) | function getWidthOrHeight( elem, name, extra ) {
function Tween (line 6516) | function Tween( elem, options, prop, end, easing ) {
function raf (line 6639) | function raf() {
function createFxNow (line 6647) | function createFxNow() {
function genFx (line 6655) | function genFx( type, includeWidth ) {
function createTween (line 6675) | function createTween( value, prop, animation ) {
function defaultPrefilter (line 6689) | function defaultPrefilter( elem, props, opts ) {
function propFilter (line 6860) | function propFilter( props, specialEasing ) {
function Animation (line 6897) | function Animation( elem, properties, options ) {
function getClass (line 7588) | function getClass( elem ) {
function buildParams (line 8213) | function buildParams( prefix, obj, traditional, add ) {
function addToPrefiltersOrTransports (line 8359) | function addToPrefiltersOrTransports( structure ) {
function inspectPrefiltersOrTransports (line 8393) | function inspectPrefiltersOrTransports( structure, options, originalOpti...
function ajaxExtend (line 8422) | function ajaxExtend( target, src ) {
function ajaxHandleResponses (line 8442) | function ajaxHandleResponses( s, jqXHR, responses ) {
function ajaxConvert (line 8500) | function ajaxConvert( s, response, jqXHR, isSuccess ) {
function done (line 9013) | function done( status, nativeStatusText, responses, headers ) {
function getWindow (line 9738) | function getWindow( elem ) {
FILE: todo-web-application/src/main/resources/static/vendor/metisMenu/metisMenu.js
function Plugin (line 17) | function Plugin(element, options) {
FILE: todo-web-application/src/main/resources/static/vendor/morrisjs/morris.js
function ctor (line 13) | function ctor() { this.constructor = child; }
function EventEmitter (line 21) | function EventEmitter() {}
function Grid (line 76) | function Grid(options) {
function Hover (line 655) | function Hover(options) {
function Line (line 718) | function Line(options) {
function Area (line 1289) | function Area(options) {
function Bar (line 1382) | function Bar(options) {
function Donut (line 1641) | function Donut(options) {
function DonutSegment (line 1800) | function DonutSegment(cx, cy, inner, outer, p0, p1, color, backgroundCol...
FILE: todo-web-application/src/main/resources/static/vendor/raphael/raphael.js
function __webpack_require__ (line 25) | function __webpack_require__(moduleId) {
function R (line 128) | function R(first) {
function clone (line 473) | function clone(obj) {
function repush (line 882) | function repush(array, item) {
function cacher (line 887) | function cacher(f, scope, postprocessor) {
function clrToString (line 920) | function clrToString() {
function round (line 1062) | function round(x) { return (x + 0.5) | 0; }
function catmullRom2bezier (line 1096) | function catmullRom2bezier(crp, z) {
function base3 (line 1388) | function base3(t, p1, p2, p3, p4) {
function bezlen (line 1393) | function bezlen(x1, y1, x2, y2, x3, y3, x4, y4, z) {
function getTatLen (line 1412) | function getTatLen(x1, y1, x2, y2, x3, y3, x4, y4, ll) {
function intersect (line 1429) | function intersect(x1, y1, x2, y2, x3, y3, x4, y4) {
function inter (line 1463) | function inter(bez1, bez2) {
function interCount (line 1466) | function interCount(bez1, bez2) {
function interHelper (line 1469) | function interHelper(bez1, bez2, justCount) {
function interPathHelper (line 1554) | function interPathHelper(path1, path2, justCount) {
function Matrix (line 2514) | function Matrix(a, b, c, d, e, f) {
function norm (line 2685) | function norm(a) {
function normalize (line 2688) | function normalize(a) {
function start (line 3275) | function start(e) {
function x_y (line 3752) | function x_y() {
function x_y_w_h (line 3755) | function x_y_w_h() {
function CubicBezierAtTime (line 4338) | function CubicBezierAtTime(t, p1x, p1y, p2x, p2y, duration) {
function Animation (line 4394) | function Animation(anim, ms) {
function runAnimation (line 4449) | function runAnimation(anim, element, percent, status, totalOrigin, times) {
function stopAnimation (line 4870) | function stopAnimation(paper) {
function isLoaded (line 5474) | function isLoaded() {
FILE: todo-web-application/src/test/java/com/in28minutes/springboot/web/SpringBootFirstWebApplicationTests.java
class SpringBootFirstWebApplicationTests (line 8) | @RunWith(SpringRunner.class)
method contextLoads (line 12) | @Test
FILE: web-driver-1-basics/src/test/java/com/in28minutes/webdriver/basics/AbstractChromeWebDriverTest.java
class AbstractChromeWebDriverTest (line 10) | public abstract class AbstractChromeWebDriverTest {
method AbstractChromeWebDriverTest (line 14) | public AbstractChromeWebDriverTest() {
method beforeTest (line 18) | @BeforeTest
method afterTest (line 27) | @AfterTest
method sleep (line 32) | public void sleep(int seconds) {
FILE: web-driver-1-basics/src/test/java/com/in28minutes/webdriver/basics/WebDriverBasicsLocatorsPerformanceTest.java
class WebDriverBasicsLocatorsPerformanceTest (line 11) | public class WebDriverBasicsLocatorsPerformanceTest extends AbstractChro...
method testCssSelectorForMultipleTableTd (line 13) | @Test
method testCssSelectorForMultipleTableTd_MorePerformance (line 27) | @Test
FILE: web-driver-1-basics/src/test/java/com/in28minutes/webdriver/basics/WebDriverBasicsLocatorsWithCSSSelectorTest.java
class WebDriverBasicsLocatorsWithCSSSelectorTest (line 11) | public class WebDriverBasicsLocatorsWithCSSSelectorTest extends Abstract...
method testCssSelectorForaTableTd (line 13) | @Test
method testCssSelectorForSortingAndCheckingFirstRow (line 28) | @Test
FILE: web-driver-1-basics/src/test/java/com/in28minutes/webdriver/basics/WebDriverBasicsLocatorsWithClassTest.java
class WebDriverBasicsLocatorsWithClassTest (line 11) | public class WebDriverBasicsLocatorsWithClassTest extends AbstractChrome...
method testTitle (line 13) | @Test
method testHugeTextElements (line 21) | @Test
FILE: web-driver-1-basics/src/test/java/com/in28minutes/webdriver/basics/WebDriverBasicsLocatorsWithIdTest.java
class WebDriverBasicsLocatorsWithIdTest (line 15) | public class WebDriverBasicsLocatorsWithIdTest extends AbstractChromeWeb...
method testTitle (line 17) | @Test
method testGetInformationAboutName (line 29) | @Test
method testGetInformationAboutPassword (line 38) | @Test
method testGetInformationAboutSubmitButton (line 47) | @Test
FILE: web-driver-1-basics/src/test/java/com/in28minutes/webdriver/basics/WebDriverBasicsLocatorsWithLinkTextTest.java
class WebDriverBasicsLocatorsWithLinkTextTest (line 7) | public class WebDriverBasicsLocatorsWithLinkTextTest extends AbstractChr...
method getIn28MinuteLinkAndClickIt (line 9) | @Test
method getTableLinkAndClickIt (line 18) | @Test
method getSBAdminLinkAndClickIt (line 27) | @Test
FILE: web-driver-1-basics/src/test/java/com/in28minutes/webdriver/basics/WebDriverBasicsLocatorsWithNameTest.java
class WebDriverBasicsLocatorsWithNameTest (line 8) | public class WebDriverBasicsLocatorsWithNameTest extends AbstractChromeW...
method testGetInformationAboutEmail (line 10) | @Test
method testGetInformationAboutPassword (line 20) | @Test
method testGetInformationAboutCheckbox (line 31) | @Test
method testGetInformationAboutSubmitButton (line 41) | @Test
FILE: web-driver-1-basics/src/test/java/com/in28minutes/webdriver/basics/WebDriverBasicsLocatorsWithTagTest.java
class WebDriverBasicsLocatorsWithTagTest (line 9) | public class WebDriverBasicsLocatorsWithTagTest extends AbstractChromeWe...
method getDetailsAboutLoginButton (line 11) | @Test
method getDetailsAboutInputTags_FindElementWillReturnFirstElement (line 20) | @Test
method getDetailsAboutInputTags_FindAllElements (line 28) | @Test
method getDetailsAboutInputTags_FindAllElements_Login (line 40) | @Test
FILE: web-driver-1-basics/src/test/java/com/in28minutes/webdriver/basics/WebDriverBasicsLocatorsWithXPathSelectorTest.java
class WebDriverBasicsLocatorsWithXPathSelectorTest (line 11) | public class WebDriverBasicsLocatorsWithXPathSelectorTest extends Abstra...
method testXpathSelectorForaTableTd (line 13) | @Test
method testXpathSelectorForSortingAndCheckingFirstRow (line 26) | @Test
FILE: web-driver-1-basics/src/test/java/com/in28minutes/webdriver/basics/form/FormElementCheckBoxTest.java
class FormElementCheckBoxTest (line 13) | public class FormElementCheckBoxTest extends AbstractChromeWebDriverTest {
method readFromACheckBox (line 15) | @Test
method setAValueIntoCheckBoxElement1 (line 27) | @Test
method checkACheckBox (line 40) | @Test
method unCheckACheckBox (line 57) | @Test
method checkACheckBox (line 75) | private void checkACheckBox(String checkboxName) {
method unCheckACheckBox (line 85) | private void unCheckACheckBox(String checkboxName) {
FILE: web-driver-1-basics/src/test/java/com/in28minutes/webdriver/basics/form/FormElementRadioButtonTest.java
class FormElementRadioButtonTest (line 11) | public class FormElementRadioButtonTest extends AbstractChromeWebDriverT...
method readFromARadioButton (line 13) | @Test
method readFromARadioButtonWithAFrameworkMethod (line 26) | @Test
method setValueForRadioButton (line 34) | @Test
method setValueForRadioButtonWithAFrameworkMethod (line 47) | @Test
method setRadioButtonToValue (line 56) | private void setRadioButtonToValue(String radioButtonName, String valu...
method getSelectedRadioButtonValue (line 65) | private String getSelectedRadioButtonValue(String name) {
method setValueForRadioButtonWithAFrameworkMethod_UsingCSS (line 78) | @Test
method setRadioButtonToValueUsingCSS (line 88) | private void setRadioButtonToValueUsingCSS(String radioButtonName, Str...
method setValueForRadioButtonWithAFrameworkMethod_UsingXPath (line 95) | @Test
method setRadioButtonToValueUsingXPath (line 105) | private void setRadioButtonToValueUsingXPath(String radioButtonName, S...
FILE: web-driver-1-basics/src/test/java/com/in28minutes/webdriver/basics/form/FormElementSelectTest.java
class FormElementSelectTest (line 10) | public class FormElementSelectTest extends AbstractChromeWebDriverTest {
method readValueOfSelectBox (line 12) | @Test
method readValueFromMultiSelectBox (line 21) | @Test
method setValuesIntoSelectBox (line 33) | @Test
method setValuesIntoMultiSelectBox (line 49) | @Test
FILE: web-driver-1-basics/src/test/java/com/in28minutes/webdriver/basics/form/FormElementTextTest.java
class FormElementTextTest (line 11) | public class FormElementTextTest extends AbstractChromeWebDriverTest {
method readFromATextElement (line 13) | @Test
method setASpecificValueIntoTextElement (line 21) | @Test
method writeAndReadAValueFromTextArea (line 31) | @Test
FILE: web-driver-1-basics/src/test/java/com/in28minutes/webdriver/login/FirstWebApplicationLoginTest.java
class FirstWebApplicationLoginTest (line 9) | public class FirstWebApplicationLoginTest extends AbstractChromeWebDrive...
method login (line 11) | @Test
FILE: web-driver-1-basics/src/test/java/com/in28minutes/webdriver/login/StaticLoginTest.java
class StaticLoginTest (line 9) | public class StaticLoginTest extends AbstractChromeWebDriverTest{
method login (line 11) | @Test
FILE: web-driver-2-more-scenarios/src/test/java/com/in28minutes/webdriver/basics/AbstractChromeWebDriverTest.java
class AbstractChromeWebDriverTest (line 12) | public abstract class AbstractChromeWebDriverTest {
method AbstractChromeWebDriverTest (line 16) | public AbstractChromeWebDriverTest() {
method beforeTest (line 20) | @BeforeTest
method afterTest (line 29) | @AfterTest
method sleep (line 34) | public void sleep(int seconds) {
FILE: web-driver-2-more-scenarios/src/test/java/com/in28minutes/webdriver/scenarios/ActionsBasicTest.java
class ActionsBasicTest (line 11) | public class ActionsBasicTest extends AbstractChromeWebDriverTest {
method testBasicActions (line 13) | @Test
method testBasicActions_Combine (line 31) | @Test
method testBasicDragAndDrop (line 45) | @Test
method testBasicDragAndDrop_Complicated (line 58) | @Test
FILE: web-driver-2-more-scenarios/src/test/java/com/in28minutes/webdriver/scenarios/CheckElementStylesTest.java
class CheckElementStylesTest (line 11) | public class CheckElementStylesTest extends AbstractChromeWebDriverTest {
method getCSSStylesForErrorElement (line 13) | @Test
method getCSSStylesForSuccessElement (line 28) | @Test
method checkIfAnElementIsEnabled (line 41) | @Test
method exploreWebElementInterface (line 52) | @Test
FILE: web-driver-2-more-scenarios/src/test/java/com/in28minutes/webdriver/scenarios/FramesTest.java
class FramesTest (line 8) | public class FramesTest extends AbstractChromeWebDriverTest {
method testFrames (line 10) | @Test
FILE: web-driver-2-more-scenarios/src/test/java/com/in28minutes/webdriver/scenarios/JavaScriptAlertTest.java
class JavaScriptAlertTest (line 9) | public class JavaScriptAlertTest extends AbstractChromeWebDriverTest {
method testForAlert (line 11) | @Test
FILE: web-driver-2-more-scenarios/src/test/java/com/in28minutes/webdriver/scenarios/NewWindowTest.java
class NewWindowTest (line 8) | public class NewWindowTest extends AbstractChromeWebDriverTest {
method testForWindows (line 10) | @Test
method findWindowHandleOfSecondWindow (line 29) | @Test
method findSecondWindowHandle (line 45) | private String findSecondWindowHandle(String firstWindowHandle) {
method switchToSecondWindow (line 54) | @Test
FILE: web-driver-2-more-scenarios/src/test/java/com/in28minutes/webdriver/scenarios/PlayingWithModalWindowAndWaitsTest.java
class PlayingWithModalWindowAndWaitsTest (line 19) | public class PlayingWithModalWindowAndWaitsTest extends AbstractChromeWe...
method playingWithModalWindows_expectingAException (line 21) | @Test(expectedExceptions = ElementNotVisibleException.class)
method playingWithModalWindows_FixingWithSleep (line 33) | @Test
method playingWithModalWindows_implicitWait (line 51) | @Test
method playingWithModalWindows_ExplicitWait (line 73) | @Test
FILE: web-driver-2-more-scenarios/src/test/java/com/in28minutes/webdriver/scenarios/PlayingWithScreenWindowTest.java
class PlayingWithScreenWindowTest (line 11) | public class PlayingWithScreenWindowTest extends AbstractChromeWebDriver...
method playingWithWindows (line 13) | @Test
method backForwardAndNavigation (line 32) | @Test
FILE: web-driver-2-more-scenarios/src/test/java/com/in28minutes/webdriver/scenarios/ReadTablesTest.java
class ReadTablesTest (line 13) | public class ReadTablesTest extends AbstractChromeWebDriverTest {
method testReadingOfTables (line 15) | @Test
FILE: web-driver-2-more-scenarios/src/test/java/com/in28minutes/webdriver/scenarios/RunJavaScriptTest.java
class RunJavaScriptTest (line 10) | public class RunJavaScriptTest extends AbstractChromeWebDriverTest {
method testRunningOfJavaScript (line 12) | @Test
FILE: web-driver-2-more-scenarios/src/test/java/com/in28minutes/webdriver/scenarios/TakesScreenshotTest.java
class TakesScreenshotTest (line 14) | public class TakesScreenshotTest extends AbstractChromeWebDriverTest {
method testFrames (line 16) | @Test
FILE: web-driver-2-more-scenarios/src/test/java/com/in28minutes/webdriver/scenarios/framework/TableReader.java
class TableReader (line 7) | public class TableReader {
method TableReader (line 12) | public TableReader(WebDriver driver, String id) {
method getData (line 20) | public String getData(int row, int col) {
FILE: web-driver-3-cross-browser-framework/src/test/java/com/in28minutes/selenium/crossbrowser/CrossBrowserBasicsTest.java
class CrossBrowserBasicsTest (line 14) | public class CrossBrowserBasicsTest {
method chromeBrowser (line 15) | @Test
method firefoxBrowser (line 33) | @Test
method safariBrowser (line 51) | @Test
method ieBrowser (line 74) | @Test
method edgeBrowser (line 92) | @Test
method sleep (line 109) | private void sleep(int i) {
FILE: web-driver-3-cross-browser-framework/src/test/java/com/in28minutes/selenium/crossbrowser/HeadlessBrowserBasicsTest.java
class HeadlessBrowserBasicsTest (line 13) | public class HeadlessBrowserBasicsTest {
method chromeBrowser (line 15) | @Test
method chromeBrowserHeadlessBrowsing (line 33) | @Test
method firefoxBrowser (line 54) | @Test
method firefoxBrowserHeadlessBrowsing (line 73) | @Test
method phanthomJS (line 94) | @Test
method sleep (line 110) | private void sleep(int i) {
FILE: web-driver-3-cross-browser-framework/src/test/java/com/in28minutes/selenium/crossbrowser/framework/CrossBrowserFrameworkTest.java
class CrossBrowserFrameworkTest (line 14) | public class CrossBrowserFrameworkTest {
method before (line 18) | @Parameters("browser")
method launchTablesPage (line 32) | @Test
method launchIndexPage (line 39) | @Test
method afterTest (line 46) | @AfterTest
FILE: web-driver-4-data-driven-tests/src/test/java/com/in28minutes/datadriventests/ExcelReadUtil.java
class ExcelReadUtil (line 10) | public class ExcelReadUtil {
method readExcelInto2DArray (line 11) | public static String[][] readExcelInto2DArray(String excelFilePath,
FILE: web-driver-4-data-driven-tests/src/test/java/com/in28minutes/datadriventests/LoginDataProviderCompleteCSVTest.java
class LoginDataProviderCompleteCsvTest (line 23) | public class LoginDataProviderCompleteCsvTest {
method userIdsAndPasswordsCSVDataProvider (line 31) | @DataProvider(name = "user-ids-passwords-csv-data-provider")
method testLoginForAllScenarios (line 37) | @Test(dataProvider = "user-ids-passwords-csv-data-provider")
method testReadingDataFromCSV (line 63) | @Test
method readFromCSVFile (line 72) | private List<String[]> readFromCSVFile(String csvFilePath) {
FILE: web-driver-4-data-driven-tests/src/test/java/com/in28minutes/datadriventests/LoginDataProviderCompleteExcelTest.java
class LoginDataProviderCompleteExcelTest (line 17) | public class LoginDataProviderCompleteExcelTest {
method userIdsAndPasswordsDataProvider (line 20) | @DataProvider(name="user-ids-passwords-excel-data-provider")
method testLoginForAllScenarios (line 27) | @Test(dataProvider="user-ids-passwords-excel-data-provider")
method readFromExcel (line 55) | @Test
FILE: web-driver-4-data-driven-tests/src/test/java/com/in28minutes/datadriventests/LoginDataProviderCompleteTest.java
class LoginDataProviderCompleteTest (line 15) | public class LoginDataProviderCompleteTest {
method userIdsAndPasswordsDataProvider (line 18) | @DataProvider(name="user-ids-passwords-data-provider")
method testLoginForAllScenarios (line 30) | @Test(dataProvider="user-ids-passwords-data-provider")
FILE: web-driver-4-data-driven-tests/src/test/java/com/in28minutes/datadriventests/SuccessfulLoginBasicTest.java
class SuccessfulLoginBasicTest (line 11) | public class SuccessfulLoginBasicTest {
method testLoginWithIn28Minutes (line 13) | @Test
FILE: web-driver-4-data-driven-tests/src/test/java/com/in28minutes/datadriventests/UnSuccessfulLoginBasicTest.java
class UnSuccessfulLoginBasicTest (line 13) | public class UnSuccessfulLoginBasicTest {
method testUnsuccessfulLoginWithIn28Minutes (line 15) | @Test
FILE: web-driver-4-data-driven-tests/src/test/java/com/in28minutes/datadriventests/UnSuccessfulLoginDataDrivenBasicTest.java
class UnSuccessfulLoginDataDrivenBasicTest (line 14) | public class UnSuccessfulLoginDataDrivenBasicTest {
method userIdsDataProvider (line 17) | @DataProvider(name="user-ids-data-provider")
method testUnsuccessfulLoginWithIn28Minutes (line 23) | @Test(dataProvider="user-ids-data-provider")
FILE: web-driver-4-data-driven-tests/src/test/java/com/in28minutes/datadriventests/UnSuccessfulLoginDataDrivenLevel1Test.java
class UnSuccessfulLoginDataDrivenLevel1Test (line 14) | public class UnSuccessfulLoginDataDrivenLevel1Test {
method userIdsAndPasswordsDataProvider (line 17) | @DataProvider(name="user-ids-passwords-data-provider")
method testUnsuccessfulLoginWithIn28Minutes (line 27) | @Test(dataProvider="user-ids-passwords-data-provider")
FILE: web-driver-5-page-object-model/src/test/java/com/in28minutes/pageobjects/updatetodo/ListTodoPage.java
class ListTodoPage (line 6) | public class ListTodoPage {
method ListTodoPage (line 10) | public ListTodoPage(WebDriver driver) {
method getDescription (line 17) | public String getDescription(String id) {
method getTargetDate (line 22) | public String getTargetDate(String id) {
method clickUpdateFor (line 27) | public void clickUpdateFor(String id) {
FILE: web-driver-5-page-object-model/src/test/java/com/in28minutes/pageobjects/updatetodo/LoginPage.java
class LoginPage (line 7) | public class LoginPage {
method LoginPage (line 11) | public LoginPage(WebDriver driver) {
method enterName (line 30) | public void enterName(String nameToEnter) {
method enterPassword (line 35) | public void enterPassword(String passwordToEnter) {
method submit (line 40) | public void submit() {
method login (line 44) | public void login(String name, String password) {
FILE: web-driver-5-page-object-model/src/test/java/com/in28minutes/pageobjects/updatetodo/TodoPage.java
class TodoPage (line 7) | public class TodoPage {
method TodoPage (line 11) | public TodoPage(WebDriver driver) {
method enterDescription (line 25) | public void enterDescription(String desc) {
method enterTargetDate (line 30) | public void enterTargetDate(String date) {
method submit (line 35) | public void submit() {
method enterDetailsAndSubmit (line 39) | public void enterDetailsAndSubmit(String desc,String targetDate) {
FILE: web-driver-5-page-object-model/src/test/java/com/in28minutes/pageobjects/updatetodo/UpdateTodoBasicTest.java
class UpdateTodoBasicTest (line 16) | public class UpdateTodoBasicTest {
method beforeTest (line 20) | @BeforeTest
method loginPageObject (line 26) | @Test
method updateTodo (line 41) | @Test
method afterTest (line 63) | @AfterTest
FILE: web-driver-5-page-object-model/src/test/java/com/in28minutes/pageobjects/updatetodo/UpdateTodoBasicTest1BeforePageObjects.java
class UpdateTodoBasicTest1BeforePageObjects (line 15) | public class UpdateTodoBasicTest1BeforePageObjects {
method beforeTest (line 19) | @BeforeTest
method updateTodo (line 25) | @Test
method afterTest (line 68) | @AfterTest
FILE: web-driver-5-page-object-model/src/test/java/com/in28minutes/pageobjects/updatetodo/UpdateTodoBasicTest2AfterLoginPage.java
class UpdateTodoBasicTest2AfterLoginPage (line 16) | public class UpdateTodoBasicTest2AfterLoginPage {
method beforeTest (line 20) | @BeforeTest
method loginPageObject (line 26) | @Test
method updateTodo (line 41) | @Test
method afterTest (line 89) | @AfterTest
FILE: web-driver-5-page-object-model/src/test/java/com/in28minutes/pageobjects/updatetodo/UpdateTodoBasicTest3AfterListTodoPage.java
class UpdateTodoBasicTest3AfterListTodoPage (line 16) | public class UpdateTodoBasicTest3AfterListTodoPage {
method beforeTest (line 20) | @BeforeTest
method loginPageObject (line 26) | @Test
method updateTodo (line 41) | @Test
method afterTest (line 73) | @AfterTest
FILE: web-driver-5-page-object-model/src/test/java/com/in28minutes/pageobjects/updatetodo/UpdateTodoBasicTest5AfterExercises.java
class UpdateTodoBasicTest5AfterExercises (line 14) | public class UpdateTodoBasicTest5AfterExercises {
method beforeTest (line 18) | @BeforeTest
method loginPageObject (line 24) | @Test
method updateTodo (line 39) | @Test
method afterTest (line 56) | @AfterTest
FILE: web-driver-5-page-object-model/src/test/java/com/in28minutes/pageobjects/updatetodo/WelcomePage.java
class WelcomePage (line 6) | public class WelcomePage {
method WelcomePage (line 10) | public WelcomePage(WebDriver driver) {
method clickTodosLink (line 15) | public void clickTodosLink() {
FILE: web-driver-6-stand-alone-and-grid/src/test/java/com/in28minutes/SeleniumHubTest.java
class SeleniumHubTest (line 15) | public class SeleniumHubTest {
method hub_chrome (line 26) | @Test(threadPoolSize=2, invocationCount=4)
method hub_firefox (line 51) | @Test(threadPoolSize=2, invocationCount=4)
FILE: web-driver-6-stand-alone-and-grid/src/test/java/com/in28minutes/SeleniumStandAloneTest.java
class SeleniumStandAloneTest (line 14) | public class SeleniumStandAloneTest {
method basic (line 16) | @Test
method standalone (line 26) | @Test
Condensed preview — 237 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,718K chars).
[
{
"path": ".gitignore",
"chars": 352,
"preview": "# Compiled class file\n*.class\n\n# Log file\n*.log\n\n# BlueJ files\n*.ctxt\n\n# Mobile Tools for Java (J2ME)\n.mtj.tmp/\n\n# Packa"
},
{
"path": "README.md",
"chars": 52577,
"preview": "# Learn Automation Testing with Java and Selenium\n\nCourse Link : https://www.udemy.com/course/automation-testing-with-se"
},
{
"path": "code.md",
"chars": 137319,
"preview": "## Complete Code Example\n\n### CSS Selectors from html css basics\n\n```\n $$(\"input\")\n (10) [input#first-name"
},
{
"path": "html-basics/1-first-html.html",
"chars": 150,
"preview": "<html>\n <head>\n <title>Learn Selenium and HTML</title>\n </head>\n \n <body>\n This is the body of"
},
{
"path": "html-basics/2-second-html.html",
"chars": 1645,
"preview": "<html>\n <head>\n <title>Learn Selenium and HTML - 2</title>\n </head>\n \n <body>\n <h1>Learning Au"
},
{
"path": "html-basics/3-tables.html",
"chars": 1568,
"preview": "<html>\n <head>\n <title>Learn Tables in HTML</title>\n </head>\n \n <body>\n \n <table border"
},
{
"path": "html-basics/4-miscellaneous.html",
"chars": 663,
"preview": "<html>\n <head>\n <title>Learn a few things in HTML</title>\n </head>\n \n <body>\n \n <ol>\n "
},
{
"path": "html-basics/5-nesting-and-more.html",
"chars": 502,
"preview": "<html>\n <head>\n <title>Learn Selenium and HTML 5</title>\n </head>\n \n <body>\n <div>\n "
},
{
"path": "html-basics/6-form.html",
"chars": 1976,
"preview": "<html>\n <head>\n <title>Learn Forms in HTML </title>\n </head>\n \n <body>\n Let's get some data fr"
},
{
"path": "html-basics/7-form-with-css.html",
"chars": 3068,
"preview": "<html>\n <head>\n \n <title>Learn Forms in HTML with CSS</title>\n \n <!-- CSS Selectors -->\n "
},
{
"path": "html-basics/8-form-with-external-css.html",
"chars": 4892,
"preview": "<html>\n <head>\n \n <title>Learn Forms in HTML with CSS</title>\n \n <link rel=\"stylesheet\" t"
},
{
"path": "html-basics/9-id-and-class.html",
"chars": 4558,
"preview": "<html>\n <head>\n \n <title>ID and Class in CSS</title>\n \n <!-- CSS Selectors -->\n <s"
},
{
"path": "html-basics/style.css",
"chars": 264,
"preview": "label {\n font-size: 16px;\n color: #111111;\n}\n\ninput, textarea, select {\n background-color: antiquewhite;\n}\n\nfie"
},
{
"path": "java-selenium-code.md",
"chars": 0,
"preview": ""
},
{
"path": "junit-basics/pom.xml",
"chars": 1209,
"preview": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocat"
},
{
"path": "junit-basics/src/test/java/com/example/tests/FacebookLogin.java",
"chars": 2300,
"preview": "package com.example.tests;\n\nimport static org.junit.Assert.fail;\n\nimport java.util.concurrent.TimeUnit;\n\nimport org.juni"
},
{
"path": "junit-basics/src/test/java/com/example/tests/FacebookLoginDummy.java",
"chars": 2339,
"preview": "package com.example.tests;\n\nimport static org.junit.Assert.fail;\n\nimport java.util.concurrent.TimeUnit;\n\nimport org.juni"
},
{
"path": "junit-basics/src/test/java/com/example/tests/GoogleSearchForIn28minutes.java",
"chars": 2225,
"preview": "package com.example.tests;\n\nimport static org.junit.Assert.fail;\n\nimport java.util.concurrent.TimeUnit;\n\nimport org.juni"
},
{
"path": "junit-basics/src/test/java/com/in28minutes/tests/FirstJUnitTest.java",
"chars": 1850,
"preview": "package com.in28minutes.tests;\n\nimport static org.junit.Assert.*;\n\nimport org.junit.Test;\n\nclass SimpleClass {\n\tpublic i"
},
{
"path": "junit-basics/src/test/java/com/in28minutes/tests/FirstSeleniumJUnitTest.java",
"chars": 1866,
"preview": "package com.in28minutes.tests;\n\nimport static org.junit.Assert.assertEquals;\n\nimport org.junit.After;\nimport org.junit.B"
},
{
"path": "selenium-ide/FirstKatalonStudioProject.html",
"chars": 112029,
"preview": "<!DOCTYPE html>\n<!-- saved from url=(0069)chrome-extension://ljdobmomdgdljniojadhoplhkpialdid/panel/index.html# -->\n<htm"
},
{
"path": "selenium-ide/FirstKatalonStudioProject_files/css",
"chars": 11808,
"preview": "/* cyrillic-ext */\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-weight: 400;\n src: local('Roboto'"
},
{
"path": "selenium-ide/FirstSeleniumIDEProject.side",
"chars": 4105,
"preview": "{\n \"id\": \"b68431ba-b034-4fe4-9aae-642e7e125b86\",\n \"version\": \"1.1\",\n \"name\": \"FirstSeleniumIDEProject\",\n \"url\": \"htt"
},
{
"path": "testng-basics/pom.xml",
"chars": 1136,
"preview": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLoca"
},
{
"path": "testng-basics/src/test/java/com/example/tests/FacebookLogin.java",
"chars": 2222,
"preview": "package com.example.tests;\n\nimport java.util.regex.Pattern;\nimport java.util.concurrent.TimeUnit;\nimport org.testng.anno"
},
{
"path": "testng-basics/src/test/java/com/example/tests/GoogleSearchForIn28minutes.java",
"chars": 2318,
"preview": "package com.example.tests;\n\nimport static org.testng.Assert.fail;\n\nimport java.util.concurrent.TimeUnit;\n\nimport org.ope"
},
{
"path": "testng-basics/src/test/java/com/in28minutes/test/testng/FirstSeleniumTestNgTest.java",
"chars": 1942,
"preview": "package com.in28minutes.test.testng;\n\nimport static org.testng.Assert.assertEquals;\n\nimport org.openqa.selenium.WebDrive"
},
{
"path": "testng-basics/src/test/java/com/in28minutes/test/testng/FirstTestngTest.java",
"chars": 1882,
"preview": "package com.in28minutes.test.testng;\n\nimport static org.testng.Assert.assertEquals;\n\nimport org.testng.annotations.Test;"
},
{
"path": "testng-basics/src/test/java/com/in28minutes/test/testng/MultipleBrowserTest.java",
"chars": 266,
"preview": "package com.in28minutes.test.testng;\n\nimport org.testng.annotations.Parameters;\nimport org.testng.annotations.Test;\n\npub"
},
{
"path": "testng-basics/testng.xml",
"chars": 677,
"preview": "<!DOCTYPE suite SYSTEM \"http://testng.org/testng-1.0.dtd\" >\n<suite name=\"First Suite\" verbose=\"1\" thread-count=\"5\">\n\t\n\t<"
},
{
"path": "todo-web-application/pom.xml",
"chars": 2955,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
},
{
"path": "todo-web-application/src/main/java/com/in28minutes/springboot/web/SpringBootFirstWebApplication.java",
"chars": 456,
"preview": "package com.in28minutes.springboot.web;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.b"
},
{
"path": "todo-web-application/src/main/java/com/in28minutes/springboot/web/controller/ErrorController.java",
"chars": 681,
"preview": "package com.in28minutes.springboot.web.controller;\n\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.h"
},
{
"path": "todo-web-application/src/main/java/com/in28minutes/springboot/web/controller/FileUploadController.java",
"chars": 815,
"preview": "package com.in28minutes.springboot.web.controller;\n\nimport org.springframework.stereotype.Controller;\nimport org.springf"
},
{
"path": "todo-web-application/src/main/java/com/in28minutes/springboot/web/controller/LoginController.java",
"chars": 1358,
"preview": "package com.in28minutes.springboot.web.controller;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimpor"
},
{
"path": "todo-web-application/src/main/java/com/in28minutes/springboot/web/controller/LogoutController.java",
"chars": 477,
"preview": "package com.in28minutes.springboot.web.controller;\n\nimport javax.servlet.http.HttpSession;\n\nimport org.springframework.s"
},
{
"path": "todo-web-application/src/main/java/com/in28minutes/springboot/web/controller/TodoController.java",
"chars": 3286,
"preview": "package com.in28minutes.springboot.web.controller;\n\nimport java.text.SimpleDateFormat;\nimport java.util.Date;\n\nimport ja"
},
{
"path": "todo-web-application/src/main/java/com/in28minutes/springboot/web/controller/WelcomeController.java",
"chars": 615,
"preview": "package com.in28minutes.springboot.web.controller;\n\nimport org.springframework.stereotype.Controller;\nimport org.springf"
},
{
"path": "todo-web-application/src/main/java/com/in28minutes/springboot/web/model/Todo.java",
"chars": 2210,
"preview": "package com.in28minutes.springboot.web.model;\n\nimport java.util.Date;\n\nimport javax.persistence.Entity;\nimport javax.per"
},
{
"path": "todo-web-application/src/main/java/com/in28minutes/springboot/web/service/LoginService.java",
"chars": 507,
"preview": "package com.in28minutes.springboot.web.service;\n\nimport org.springframework.stereotype.Service;\n\n@Service\npublic class L"
},
{
"path": "todo-web-application/src/main/java/com/in28minutes/springboot/web/service/TodoRepository.java",
"chars": 525,
"preview": "package com.in28minutes.springboot.web.service;\n\nimport java.util.List;\n\nimport org.springframework.data.jpa.repository."
},
{
"path": "todo-web-application/src/main/java/com/in28minutes/springboot/web/service/TodoService.java",
"chars": 1731,
"preview": "package com.in28minutes.springboot.web.service;\n\nimport java.util.ArrayList;\nimport java.util.Date;\nimport java.util.Ite"
},
{
"path": "todo-web-application/src/main/resources/application.properties",
"chars": 164,
"preview": "spring.mvc.view.prefix=/WEB-INF/jsp/\nspring.mvc.view.suffix=.jsp\nlogging.level.org.springframework.web=INFO\n\nspring.jpa."
},
{
"path": "todo-web-application/src/main/resources/data.sql",
"chars": 457,
"preview": "insert into TODO\nvalues(10001, 'Learn Automation Testing', false, sysdate() + 365, 'in28minutes');\ninsert into TODO\nvalu"
},
{
"path": "todo-web-application/src/main/resources/static/.gitignore",
"chars": 29,
"preview": "node_modules\nbower_components"
},
{
"path": "todo-web-application/src/main/resources/static/LICENSE",
"chars": 1093,
"preview": "The MIT License (MIT)\n\nCopyright (c) 2013-2018 Blackrock Digital LLC\n\nPermission is hereby granted, free of charge, to a"
},
{
"path": "todo-web-application/src/main/resources/static/README.md",
"chars": 2309,
"preview": "# [Start Bootstrap](http://startbootstrap.com/) - [SB Admin 2](http://startbootstrap.com/template-overviews/sb-admin-2/)"
},
{
"path": "todo-web-application/src/main/resources/static/bower.json",
"chars": 1027,
"preview": "{\n \"name\": \"startbootstrap-sb-admin-2\",\n \"homepage\": \"http://startbootstrap.com/template-overviews/sb-admin-2/\",\n \"ve"
},
{
"path": "todo-web-application/src/main/resources/static/data/flot-data.js",
"chars": 38335,
"preview": "//Flot Line Chart\n$(document).ready(function() {\n\n var offset = 0;\n plot();\n\n function plot() {\n var sin"
},
{
"path": "todo-web-application/src/main/resources/static/data/morris-data.js",
"chars": 2536,
"preview": "$(function() {\n\n Morris.Area({\n element: 'morris-area-chart',\n data: [{\n period: '2010 Q1',\n"
},
{
"path": "todo-web-application/src/main/resources/static/dist/css/sb-admin-2.css",
"chars": 8420,
"preview": "/*!\n * Start Bootstrap - SB Admin 2 v3.3.7+1 (http://startbootstrap.com/template-overviews/sb-admin-2)\n * Copyright 2013"
},
{
"path": "todo-web-application/src/main/resources/static/dist/js/sb-admin-2.js",
"chars": 1626,
"preview": "/*!\n * Start Bootstrap - SB Admin 2 v3.3.7+1 (http://startbootstrap.com/template-overviews/sb-admin-2)\n * Copyright 2013"
},
{
"path": "todo-web-application/src/main/resources/static/gulpfile.js",
"chars": 4255,
"preview": "var gulp = require('gulp');\nvar less = require('gulp-less');\nvar browserSync = require('browser-sync').create();\nvar hea"
},
{
"path": "todo-web-application/src/main/resources/static/index.html",
"chars": 290,
"preview": "<!DOCTYPE html>\n<html>\n<head>\n<meta http-equiv=\"refresh\" content=\"0;url=pages/index.html\">\n<title>SB Admin 2</title>\n<sc"
},
{
"path": "todo-web-application/src/main/resources/static/js/sb-admin-2.js",
"chars": 1383,
"preview": "$(function() {\n $('#side-menu').metisMenu();\n});\n\n//Loads the correct sidebar on window load,\n//collapses the sidebar"
},
{
"path": "todo-web-application/src/main/resources/static/less/mixins.less",
"chars": 10,
"preview": "// Mixins\n"
},
{
"path": "todo-web-application/src/main/resources/static/less/sb-admin-2.less",
"chars": 9407,
"preview": "@import \"variables.less\";\n@import \"mixins.less\";\n\n// Global Styles\n\nbody {\n background-color: @gray-lightest;\n}\n\n// W"
},
{
"path": "todo-web-application/src/main/resources/static/less/variables.less",
"chars": 342,
"preview": "// Variables\n\n@gray-darker: lighten(#000, 13.5%);\n@gray-dark: lighten(#000, 20%);\n@gray: lighten(#000, 33.5%);\n@gray-lig"
},
{
"path": "todo-web-application/src/main/resources/static/package.json",
"chars": 666,
"preview": "{\n \"name\": \"startbootstrap-sb-admin-2\",\n \"title\": \"SB Admin 2\",\n \"version\": \"3.3.7+1\",\n \"homepage\": \"http://startboo"
},
{
"path": "todo-web-application/src/main/resources/static/pages/blank.html",
"chars": 19365,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n\n <meta charset=\"utf-8\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE="
},
{
"path": "todo-web-application/src/main/resources/static/pages/buttons.html",
"chars": 32336,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n\n <meta charset=\"utf-8\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE="
},
{
"path": "todo-web-application/src/main/resources/static/pages/file-upload.html",
"chars": 11743,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n\n<meta charset=\"utf-8\">\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n<"
},
{
"path": "todo-web-application/src/main/resources/static/pages/flot.html",
"chars": 24574,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n\n <meta charset=\"utf-8\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE="
},
{
"path": "todo-web-application/src/main/resources/static/pages/forms.html",
"chars": 33168,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n\n <meta charset=\"utf-8\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE="
},
{
"path": "todo-web-application/src/main/resources/static/pages/frames-example-left.html",
"chars": 3095,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n\n <meta charset=\"utf-8\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE="
},
{
"path": "todo-web-application/src/main/resources/static/pages/frames-example-right.html",
"chars": 3072,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n\n <meta charset=\"utf-8\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE="
},
{
"path": "todo-web-application/src/main/resources/static/pages/frames-example.html",
"chars": 167,
"preview": "<frameset cols=\"45%,45%\">\n<frame name=\"leftFrame\" src=\"frames-example-left.html\"></frame>\n<frame name=\"rightFrame\" src=\""
},
{
"path": "todo-web-application/src/main/resources/static/pages/grid.html",
"chars": 35895,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n\n <meta charset=\"utf-8\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE="
},
{
"path": "todo-web-application/src/main/resources/static/pages/icons.html",
"chars": 122479,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n\n <meta charset=\"utf-8\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE="
},
{
"path": "todo-web-application/src/main/resources/static/pages/index.html",
"chars": 52340,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n\n <meta charset=\"utf-8\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE="
},
{
"path": "todo-web-application/src/main/resources/static/pages/login.html",
"chars": 3111,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n\n <meta charset=\"utf-8\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE="
},
{
"path": "todo-web-application/src/main/resources/static/pages/morris.html",
"chars": 22987,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n\n <meta charset=\"utf-8\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE="
},
{
"path": "todo-web-application/src/main/resources/static/pages/notifications.html",
"chars": 18560,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n\n<meta charset=\"utf-8\">\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n<"
},
{
"path": "todo-web-application/src/main/resources/static/pages/panels-wells.html",
"chars": 40274,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n\n <meta charset=\"utf-8\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE="
},
{
"path": "todo-web-application/src/main/resources/static/pages/sortable.html",
"chars": 856,
"preview": "<!doctype html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<title>sortable demo</title>\n<link rel=\"stylesheet\"\n\thref"
},
{
"path": "todo-web-application/src/main/resources/static/pages/tables.html",
"chars": 57333,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n\n <meta charset=\"utf-8\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE="
},
{
"path": "todo-web-application/src/main/resources/static/pages/typography.html",
"chars": 29921,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n\n <meta charset=\"utf-8\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE="
},
{
"path": "todo-web-application/src/main/resources/static/vendor/bootstrap/css/bootstrap.css",
"chars": 146010,
"preview": "/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://gi"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/bootstrap/js/bootstrap.js",
"chars": 69707,
"preview": "/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under the MIT license"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/bootstrap-social/bootstrap-social.css",
"chars": 20453,
"preview": "/*\n * Social Buttons for Bootstrap\n *\n * Copyright 2013-2014 Panayiotis Lipiridis\n * Licensed under the MIT License\n *\n "
},
{
"path": "todo-web-application/src/main/resources/static/vendor/bootstrap-social/bootstrap-social.less",
"chars": 3111,
"preview": "/*\n * Social Buttons for Bootstrap\n *\n * Copyright 2013-2014 Panayiotis Lipiridis\n * Licensed under the MIT License\n *\n "
},
{
"path": "todo-web-application/src/main/resources/static/vendor/bootstrap-social/bootstrap-social.scss",
"chars": 3293,
"preview": "/*\n * Social Buttons for Bootstrap\n *\n * Copyright 2013-2014 Panayiotis Lipiridis\n * Licensed under the MIT License\n *\n "
},
{
"path": "todo-web-application/src/main/resources/static/vendor/datatables/css/dataTables.bootstrap.css",
"chars": 4823,
"preview": "table.dataTable {\n clear: both;\n margin-top: 6px !important;\n margin-bottom: 6px !important;\n max-width: none !impor"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/datatables/css/dataTables.bootstrap4.css",
"chars": 5331,
"preview": "table.dataTable {\n clear: both;\n margin-top: 6px !important;\n margin-bottom: 6px !important;\n max-width: none !impor"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/datatables/css/dataTables.foundation.css",
"chars": 2924,
"preview": "table.dataTable {\n clear: both;\n margin: 0.5em 0 !important;\n max-width: none !important;\n width: 100%;\n}\ntable.data"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/datatables/css/dataTables.jqueryui.css",
"chars": 16019,
"preview": "/*\n * Table styles\n */\ntable.dataTable {\n width: 100%;\n margin: 0 auto;\n clear: both;\n border-collapse: separate;\n "
},
{
"path": "todo-web-application/src/main/resources/static/vendor/datatables/css/dataTables.material.css",
"chars": 2600,
"preview": "div.dataTables_wrapper div.dataTables_filter {\n text-align: right;\n}\ndiv.dataTables_wrapper div.dataTables_filter input"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/datatables/css/dataTables.semanticui.css",
"chars": 2969,
"preview": "/*\n * Styling for DataTables with Semantic UI\n */\ntable.dataTable.table {\n margin: 0;\n}\ntable.dataTable.table thead th,"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/datatables/css/dataTables.uikit.css",
"chars": 3866,
"preview": "table.dataTable {\n clear: both;\n margin-top: 6px !important;\n margin-bottom: 6px !important;\n max-width: none !impor"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/datatables/css/jquery.dataTables.css",
"chars": 15423,
"preview": "/*\n * Table styles\n */\ntable.dataTable {\n width: 100%;\n margin: 0 auto;\n clear: both;\n border-collapse: separate;\n "
},
{
"path": "todo-web-application/src/main/resources/static/vendor/datatables/css/jquery.dataTables_themeroller.css",
"chars": 14229,
"preview": "/*\n * Table styles\n */\ntable.dataTable {\n width: 100%;\n margin: 0 auto;\n clear: both;\n border-collapse: separate;\n "
},
{
"path": "todo-web-application/src/main/resources/static/vendor/datatables/js/dataTables.bootstrap.js",
"chars": 4543,
"preview": "/*! DataTables Bootstrap 3 integration\n * ©2011-2015 SpryMedia Ltd - datatables.net/license\n */\n\n/**\n * DataTables integ"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/datatables/js/dataTables.bootstrap4.js",
"chars": 4619,
"preview": "/*! DataTables Bootstrap 3 integration\n * ©2011-2015 SpryMedia Ltd - datatables.net/license\n */\n\n/**\n * DataTables integ"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/datatables/js/dataTables.foundation.js",
"chars": 4330,
"preview": "/*! DataTables Foundation integration\n * ©2011-2015 SpryMedia Ltd - datatables.net/license\n */\n\n/**\n * DataTables integr"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/datatables/js/dataTables.jqueryui.js",
"chars": 4485,
"preview": "/*! DataTables jQuery UI integration\n * ©2011-2014 SpryMedia Ltd - datatables.net/license\n */\n\n/**\n * DataTables integra"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/datatables/js/dataTables.material.js",
"chars": 4774,
"preview": "/*! DataTables Bootstrap 3 integration\n * ©2011-2015 SpryMedia Ltd - datatables.net/license\n */\n\n/**\n * DataTables integ"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/datatables/js/dataTables.semanticui.js",
"chars": 5056,
"preview": "/*! DataTables Bootstrap 3 integration\n * ©2011-2015 SpryMedia Ltd - datatables.net/license\n */\n\n/**\n * DataTables integ"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/datatables/js/dataTables.uikit.js",
"chars": 4624,
"preview": "/*! DataTables UIkit 3 integration\n */\n\n/**\n * This is a tech preview of UIKit integration with DataTables.\n */\n(functio"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/datatables/js/jquery.dataTables.js",
"chars": 447277,
"preview": "/*! DataTables 1.10.12\n * ©2008-2015 SpryMedia Ltd - datatables.net/license\n */\n\n/**\n * @summary DataTables\n * @desc"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/datatables/js/jquery.js",
"chars": 97361,
"preview": "/*! jQuery v1.12.0 | (c) jQuery Foundation | jquery.org/license */\n!function(a,b){\"object\"==typeof module&&\"object\"==typ"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/datatables-plugins/dataTables.bootstrap.css",
"chars": 7616,
"preview": "div.dataTables_length label {\n\tfont-weight: normal;\n\ttext-align: left;\n\twhite-space: nowrap;\n}\n\ndiv.dataTables_length se"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/datatables-plugins/dataTables.bootstrap.js",
"chars": 4286,
"preview": "/*! DataTables Bootstrap 3 integration\n * ©2011-2014 SpryMedia Ltd - datatables.net/license\n */\n\n/**\n * DataTables integ"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/datatables-plugins/index.html",
"chars": 10303,
"preview": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\n<html>\n\t<head>\n\t\t<meta http-e"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/datatables-responsive/dataTables.responsive.css",
"chars": 3051,
"preview": "table.dataTable.dtr-inline.collapsed > tbody > tr > td:first-child,\ntable.dataTable.dtr-inline.collapsed > tbody > tr > "
},
{
"path": "todo-web-application/src/main/resources/static/vendor/datatables-responsive/dataTables.responsive.js",
"chars": 25098,
"preview": "/*! Responsive 1.0.6\n * 2014-2015 SpryMedia Ltd - datatables.net/license\n */\n\n/**\n * @summary Responsive\n * @descrip"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/datatables-responsive/dataTables.responsive.scss",
"chars": 2187,
"preview": "\n//\n// Mixins\n//\n@mixin control() {\n\tdisplay: block;\n\tposition: absolute;\n\tcolor: white;\n\tborder: 2px solid white;\n\tbord"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/flot/excanvas.js",
"chars": 41943,
"preview": "// Copyright 2006 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use t"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/flot/jquery.colorhelpers.js",
"chars": 6151,
"preview": "/* Plugin for jQuery for working with colors.\n * \n * Version 1.1.\n * \n * Inspiration from jQuery color animation plugin "
},
{
"path": "todo-web-application/src/main/resources/static/vendor/flot/jquery.flot.canvas.js",
"chars": 9599,
"preview": "/* Flot plugin for drawing all elements of a plot on the canvas.\n\nCopyright (c) 2007-2014 IOLA and Ole Laursen.\nLicensed"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/flot/jquery.flot.categories.js",
"chars": 6033,
"preview": "/* Flot plugin for plotting textual data or categories.\n\nCopyright (c) 2007-2014 IOLA and Ole Laursen.\nLicensed under th"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/flot/jquery.flot.crosshair.js",
"chars": 5419,
"preview": "/* Flot plugin for showing crosshairs when the mouse hovers over the plot.\n\nCopyright (c) 2007-2014 IOLA and Ole Laursen"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/flot/jquery.flot.errorbars.js",
"chars": 12614,
"preview": "/* Flot plugin for plotting error bars.\n\nCopyright (c) 2007-2014 IOLA and Ole Laursen.\nLicensed under the MIT license.\n\n"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/flot/jquery.flot.fillbetween.js",
"chars": 5257,
"preview": "/* Flot plugin for computing bottoms for filled line and bar charts.\n\nCopyright (c) 2007-2014 IOLA and Ole Laursen.\nLice"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/flot/jquery.flot.image.js",
"chars": 7360,
"preview": "/* Flot plugin for plotting images.\n\nCopyright (c) 2007-2014 IOLA and Ole Laursen.\nLicensed under the MIT license.\n\nThe "
},
{
"path": "todo-web-application/src/main/resources/static/vendor/flot/jquery.flot.js",
"chars": 122971,
"preview": "/* Javascript plotting library for jQuery, version 0.8.3.\n\nCopyright (c) 2007-2014 IOLA and Ole Laursen.\nLicensed under "
},
{
"path": "todo-web-application/src/main/resources/static/vendor/flot/jquery.flot.navigate.js",
"chars": 14216,
"preview": "/* Flot plugin for adding the ability to pan and zoom the plot.\n\nCopyright (c) 2007-2014 IOLA and Ole Laursen.\nLicensed "
},
{
"path": "todo-web-application/src/main/resources/static/vendor/flot/jquery.flot.pie.js",
"chars": 23809,
"preview": "/* Flot plugin for rendering pie charts.\n\nCopyright (c) 2007-2014 IOLA and Ole Laursen.\nLicensed under the MIT license.\n"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/flot/jquery.flot.resize.js",
"chars": 3314,
"preview": "/* Flot plugin for automatically redrawing plots as the placeholder resizes.\n\nCopyright (c) 2007-2014 IOLA and Ole Laurs"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/flot/jquery.flot.selection.js",
"chars": 13141,
"preview": "/* Flot plugin for selecting regions of a plot.\n\nCopyright (c) 2007-2014 IOLA and Ole Laursen.\nLicensed under the MIT li"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/flot/jquery.flot.stack.js",
"chars": 7090,
"preview": "/* Flot plugin for stacking data sets rather than overlyaing them.\n\nCopyright (c) 2007-2014 IOLA and Ole Laursen.\nLicens"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/flot/jquery.flot.symbol.js",
"chars": 2505,
"preview": "/* Flot plugin that adds some extra symbols for plotting points.\n\nCopyright (c) 2007-2014 IOLA and Ole Laursen.\nLicensed"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/flot/jquery.flot.threshold.js",
"chars": 4480,
"preview": "/* Flot plugin for thresholding data.\n\nCopyright (c) 2007-2014 IOLA and Ole Laursen.\nLicensed under the MIT license.\n\nTh"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/flot/jquery.flot.time.js",
"chars": 11768,
"preview": "/* Pretty handling of time axes.\n\nCopyright (c) 2007-2014 IOLA and Ole Laursen.\nLicensed under the MIT license.\n\nSet axi"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/flot/jquery.js",
"chars": 266057,
"preview": "/*!\n * jQuery JavaScript Library v1.8.3\n * http://jquery.com/\n *\n * Includes Sizzle.js\n * http://sizzlejs.com/\n *\n * Cop"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/flot-tooltip/jquery.flot.tooltip.js",
"chars": 23658,
"preview": "/*\n * jquery.flot.tooltip\n * \n * description: easy-to-use tooltips for Flot charts\n * version: 0.8.7\n * authors: Krzyszt"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/flot-tooltip/jquery.flot.tooltip.source.js",
"chars": 23358,
"preview": "(function ($) {\n // plugin options, default values\n var defaultOptions = {\n tooltip: {\n show: fa"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/font-awesome/HELP-US-OUT.txt",
"chars": 323,
"preview": "I hope you love Font Awesome. If you've found it useful, please do me a favor and check out my latest project,\nFort Awes"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/font-awesome/css/font-awesome.css",
"chars": 35134,
"preview": "/*!\n * Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome\n * License - http://fontawesome.io/lice"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/font-awesome/less/animated.less",
"chars": 713,
"preview": "// Animated Icons\n// --------------------------\n\n.@{fa-css-prefix}-spin {\n -webkit-animation: fa-spin 2s infinite linea"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/font-awesome/less/bordered-pulled.less",
"chars": 585,
"preview": "// Bordered & Pulled\n// -------------------------\n\n.@{fa-css-prefix}-border {\n padding: .2em .25em .15em;\n border: sol"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/font-awesome/less/core.less",
"chars": 452,
"preview": "// Base Class Definition\n// -------------------------\n\n.@{fa-css-prefix} {\n display: inline-block;\n font: normal norma"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/font-awesome/less/extras.less",
"chars": 40,
"preview": "// Extras\n// --------------------------\n"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/font-awesome/less/fixed-width.less",
"chars": 119,
"preview": "// Fixed Width Icons\n// -------------------------\n.@{fa-css-prefix}-fw {\n width: (18em / 14);\n text-align: center;\n}\n"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/font-awesome/less/font-awesome.less",
"chars": 495,
"preview": "/*!\n * Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome\n * License - http://fontawesome.io/lice"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/font-awesome/less/icons.less",
"chars": 46249,
"preview": "/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\n readers do not read off random characters th"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/font-awesome/less/larger.less",
"chars": 370,
"preview": "// Icon Sizes\n// -------------------------\n\n/* makes the font 33% larger relative to the icon container */\n.@{fa-css-pre"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/font-awesome/less/list.less",
"chars": 377,
"preview": "// List Icons\n// -------------------------\n\n.@{fa-css-prefix}-ul {\n padding-left: 0;\n margin-left: @fa-li-width;\n lis"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/font-awesome/less/mixins.less",
"chars": 1603,
"preview": "// Mixins\n// --------------------------\n\n.fa-icon() {\n display: inline-block;\n font: normal normal normal @fa-font-siz"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/font-awesome/less/path.less",
"chars": 771,
"preview": "/* FONT PATH\n * -------------------------- */\n\n@font-face {\n font-family: 'FontAwesome';\n src: url('@{fa-font-path}/fo"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/font-awesome/less/rotated-flipped.less",
"chars": 622,
"preview": "// Rotated & Flipped Icons\n// -------------------------\n\n.@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); }\n.@"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/font-awesome/less/screen-reader.less",
"chars": 118,
"preview": "// Screen Readers\n// -------------------------\n\n.sr-only { .sr-only(); }\n.sr-only-focusable { .sr-only-focusable(); }\n"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/font-awesome/less/spinning.less",
"chars": 582,
"preview": "// Spinning Icons\n// --------------------------\n\n.@{fa-css-prefix}-spin {\n -webkit-animation: fa-spin 2s infinite linea"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/font-awesome/less/stacked.less",
"chars": 476,
"preview": "// Stacked Icons\n// -------------------------\n\n.@{fa-css-prefix}-stack {\n position: relative;\n display: inline-block;\n"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/font-awesome/less/variables.less",
"chars": 20890,
"preview": "// Variables\n// --------------------------\n\n@fa-font-path: \"../fonts\";\n@fa-font-size-base: 14px;\n@fa-line-heigh"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/font-awesome/scss/_animated.scss",
"chars": 715,
"preview": "// Spinning Icons\n// --------------------------\n\n.#{$fa-css-prefix}-spin {\n -webkit-animation: fa-spin 2s infinite line"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/font-awesome/scss/_bordered-pulled.scss",
"chars": 592,
"preview": "// Bordered & Pulled\n// -------------------------\n\n.#{$fa-css-prefix}-border {\n padding: .2em .25em .15em;\n border: so"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/font-awesome/scss/_core.scss",
"chars": 459,
"preview": "// Base Class Definition\n// -------------------------\n\n.#{$fa-css-prefix} {\n display: inline-block;\n font: normal norm"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/font-awesome/scss/_extras.scss",
"chars": 1238,
"preview": "/* EXTRAS\n * -------------------------- */\n\n/* Stacked and layered icon */\n\n/* Animated rotating icon */\n.#{$fa-css-pref"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/font-awesome/scss/_fixed-width.scss",
"chars": 120,
"preview": "// Fixed Width Icons\n// -------------------------\n.#{$fa-css-prefix}-fw {\n width: (18em / 14);\n text-align: center;\n}\n"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/font-awesome/scss/_icons.scss",
"chars": 46979,
"preview": "/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\n readers do not read off random characters th"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/font-awesome/scss/_larger.scss",
"chars": 375,
"preview": "// Icon Sizes\n// -------------------------\n\n/* makes the font 33% larger relative to the icon container */\n.#{$fa-css-pr"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/font-awesome/scss/_list.scss",
"chars": 378,
"preview": "// List Icons\n// -------------------------\n\n.#{$fa-css-prefix}-ul {\n padding-left: 0;\n margin-left: $fa-li-width;\n li"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/font-awesome/scss/_mixins.scss",
"chars": 1637,
"preview": "// Mixins\n// --------------------------\n\n@mixin fa-icon() {\n display: inline-block;\n font: normal normal normal #{$fa-"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/font-awesome/scss/_path.scss",
"chars": 783,
"preview": "/* FONT PATH\n * -------------------------- */\n\n@font-face {\n font-family: 'FontAwesome';\n src: url('#{$fa-font-path}/f"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/font-awesome/scss/_rotated-flipped.scss",
"chars": 672,
"preview": "// Rotated & Flipped Icons\n// -------------------------\n\n.#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, "
},
{
"path": "todo-web-application/src/main/resources/static/vendor/font-awesome/scss/_screen-reader.scss",
"chars": 134,
"preview": "// Screen Readers\n// -------------------------\n\n.sr-only { @include sr-only(); }\n.sr-only-focusable { @include sr-only-f"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/font-awesome/scss/_spinning.scss",
"chars": 583,
"preview": "// Spinning Icons\n// --------------------------\n\n.#{$fa-css-prefix}-spin {\n -webkit-animation: fa-spin 2s infinite line"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/font-awesome/scss/_stacked.scss",
"chars": 482,
"preview": "// Stacked Icons\n// -------------------------\n\n.#{$fa-css-prefix}-stack {\n position: relative;\n display: inline-block;"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/font-awesome/scss/_variables.scss",
"chars": 20971,
"preview": "// Variables\n// --------------------------\n\n$fa-font-path: \"../fonts\" !default;\n$fa-font-size-base: 14px !defau"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/font-awesome/scss/font-awesome.scss",
"chars": 430,
"preview": "/*!\n * Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome\n * License - http://fontawesome.io/lice"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/jquery/jquery.js",
"chars": 263767,
"preview": "/*eslint-disable no-unused-vars*/\n/*!\n * jQuery JavaScript Library v3.1.0\n * https://jquery.com/\n *\n * Includes Sizzle.j"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/metisMenu/metisMenu.css",
"chars": 1030,
"preview": "/*\n * metismenu - v1.1.3\n * Easy menu jQuery plugin for Twitter Bootstrap 3\n * https://github.com/onokumus/metisMenu\n *\n"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/metisMenu/metisMenu.js",
"chars": 3977,
"preview": "/*\n * metismenu - v1.1.3\n * Easy menu jQuery plugin for Twitter Bootstrap 3\n * https://github.com/onokumus/metisMenu\n *\n"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/morrisjs/morris.css",
"chars": 433,
"preview": ".morris-hover{position:absolute;z-index:1000}.morris-hover.morris-default-style{border-radius:10px;padding:6px;color:#66"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/morrisjs/morris.js",
"chars": 66047,
"preview": "/* @license\nmorris.js v0.5.0\nCopyright 2014 Olly Smith All rights reserved.\nLicensed under the BSD-2-Clause License.\n*/\n"
},
{
"path": "todo-web-application/src/main/resources/static/vendor/raphael/raphael.js",
"chars": 309945,
"preview": "// ┌───────────────────────────────────────────────────────────────────────────────────────────────────────┐ \\\\\n// │ Rap"
},
{
"path": "todo-web-application/src/main/webapp/WEB-INF/jsp/common/footer.jspf",
"chars": 309,
"preview": "<script src=\"webjars/jquery/1.9.1/jquery.min.js\"></script>\n<script src=\"webjars/bootstrap/3.3.6/js/bootstrap.min.js\"></s"
},
{
"path": "todo-web-application/src/main/webapp/WEB-INF/jsp/common/header.jspf",
"chars": 350,
"preview": "<%@ taglib uri=\"http://java.sun.com/jsp/jstl/core\" prefix=\"c\"%>\n<%@ taglib uri=\"http://java.sun.com/jsp/jstl/fmt\" prefix"
},
{
"path": "todo-web-application/src/main/webapp/WEB-INF/jsp/common/navigation.jspf",
"chars": 539,
"preview": "\n<nav role=\"navigation\" class=\"navbar navbar-default\">\n\t<div class=\"\">\n\t\t<a href=\"http://www.in28minutes.com\" class=\"nav"
},
{
"path": "todo-web-application/src/main/webapp/WEB-INF/jsp/error.jsp",
"chars": 201,
"preview": "<%@ include file=\"common/header.jspf\"%>\n<%@ include file=\"common/navigation.jspf\"%>\n<div class=\"container\">\nAn exception"
},
{
"path": "todo-web-application/src/main/webapp/WEB-INF/jsp/file-upload-successful.jsp",
"chars": 62,
"preview": "<div class=\"container\" id=\"welcome-message\">\n${message}\n</div>"
},
{
"path": "todo-web-application/src/main/webapp/WEB-INF/jsp/list-todos.jsp",
"chars": 958,
"preview": "<%@ include file=\"common/header.jspf\"%>\n<%@ include file=\"common/navigation.jspf\"%>\n\n<div class=\"container\">\n\t<table cla"
},
{
"path": "todo-web-application/src/main/webapp/WEB-INF/jsp/login.jsp",
"chars": 409,
"preview": "<%@ include file=\"common/header.jspf\"%>\n<%@ include file=\"common/navigation.jspf\"%>\n<div class=\"container\">\n\t<div id=\"er"
},
{
"path": "todo-web-application/src/main/webapp/WEB-INF/jsp/todo.jsp",
"chars": 831,
"preview": "<%@ include file=\"common/header.jspf\" %>\n<%@ include file=\"common/navigation.jspf\" %>\n<div class=\"container\">\n\t<form:for"
},
{
"path": "todo-web-application/src/main/webapp/WEB-INF/jsp/welcome.jsp",
"chars": 255,
"preview": "<%@ include file=\"common/header.jspf\"%>\n<%@ include file=\"common/navigation.jspf\"%>\n<div class=\"container\" id=\"welcome-m"
},
{
"path": "todo-web-application/src/test/java/com/in28minutes/springboot/web/SpringBootFirstWebApplicationTests.java",
"chars": 359,
"preview": "package com.in28minutes.springboot.web;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframew"
},
{
"path": "web-driver-1-basics/pom.xml",
"chars": 1123,
"preview": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLoca"
},
{
"path": "web-driver-1-basics/src/test/java/com/in28minutes/webdriver/basics/AbstractChromeWebDriverTest.java",
"chars": 819,
"preview": "package com.in28minutes.webdriver.basics;\n\nimport org.openqa.selenium.WebDriver;\nimport org.openqa.selenium.chrome.Chrom"
},
{
"path": "web-driver-1-basics/src/test/java/com/in28minutes/webdriver/basics/WebDriverBasicsLocatorsPerformanceTest.java",
"chars": 1747,
"preview": "package com.in28minutes.webdriver.basics;\n\nimport static org.testng.Assert.assertEquals;\n\nimport java.util.List;\n\nimport"
},
{
"path": "web-driver-1-basics/src/test/java/com/in28minutes/webdriver/basics/WebDriverBasicsLocatorsWithCSSSelectorTest.java",
"chars": 1827,
"preview": "package com.in28minutes.webdriver.basics;\n\nimport static org.testng.Assert.assertEquals;\n\nimport java.util.List;\n\nimport"
},
{
"path": "web-driver-1-basics/src/test/java/com/in28minutes/webdriver/basics/WebDriverBasicsLocatorsWithClassTest.java",
"chars": 812,
"preview": "package com.in28minutes.webdriver.basics;\n\nimport static org.testng.Assert.assertEquals;\n\nimport java.util.List;\n\nimport"
},
{
"path": "web-driver-1-basics/src/test/java/com/in28minutes/webdriver/basics/WebDriverBasicsLocatorsWithIdTest.java",
"chars": 1802,
"preview": "package com.in28minutes.webdriver.basics;\n\nimport static org.testng.Assert.assertEquals;\n\nimport org.openqa.selenium.By;"
},
{
"path": "web-driver-1-basics/src/test/java/com/in28minutes/webdriver/basics/WebDriverBasicsLocatorsWithLinkTextTest.java",
"chars": 1187,
"preview": "package com.in28minutes.webdriver.basics;\n\nimport org.openqa.selenium.By;\nimport org.openqa.selenium.WebElement;\nimport "
},
{
"path": "web-driver-1-basics/src/test/java/com/in28minutes/webdriver/basics/WebDriverBasicsLocatorsWithNameTest.java",
"chars": 2159,
"preview": "package com.in28minutes.webdriver.basics;\n\nimport org.openqa.selenium.By;\nimport org.openqa.selenium.WebElement;\nimport "
},
{
"path": "web-driver-1-basics/src/test/java/com/in28minutes/webdriver/basics/WebDriverBasicsLocatorsWithTagTest.java",
"chars": 1791,
"preview": "package com.in28minutes.webdriver.basics;\n\nimport java.util.List;\n\nimport org.openqa.selenium.By;\nimport org.openqa.sele"
},
{
"path": "web-driver-1-basics/src/test/java/com/in28minutes/webdriver/basics/WebDriverBasicsLocatorsWithXPathSelectorTest.java",
"chars": 1500,
"preview": "package com.in28minutes.webdriver.basics;\n\nimport static org.testng.Assert.assertEquals;\n\nimport java.util.List;\n\nimport"
},
{
"path": "web-driver-1-basics/src/test/java/com/in28minutes/webdriver/basics/form/FormElementCheckBoxTest.java",
"chars": 2598,
"preview": "package com.in28minutes.webdriver.basics.form;\n\nimport static org.testng.Assert.assertEquals;\nimport static org.testng.A"
},
{
"path": "web-driver-1-basics/src/test/java/com/in28minutes/webdriver/basics/form/FormElementRadioButtonTest.java",
"chars": 3308,
"preview": "package com.in28minutes.webdriver.basics.form;\n\nimport java.util.List;\n\nimport org.openqa.selenium.By;\nimport org.openqa"
},
{
"path": "web-driver-1-basics/src/test/java/com/in28minutes/webdriver/basics/form/FormElementSelectTest.java",
"chars": 2203,
"preview": "package com.in28minutes.webdriver.basics.form;\n\nimport org.openqa.selenium.By;\nimport org.openqa.selenium.WebElement;\nim"
},
{
"path": "web-driver-1-basics/src/test/java/com/in28minutes/webdriver/basics/form/FormElementTextTest.java",
"chars": 1337,
"preview": "package com.in28minutes.webdriver.basics.form;\n\nimport static org.testng.Assert.assertEquals;\n\nimport org.openqa.seleniu"
},
{
"path": "web-driver-1-basics/src/test/java/com/in28minutes/webdriver/login/FirstWebApplicationLoginTest.java",
"chars": 999,
"preview": "package com.in28minutes.webdriver.login;\n\nimport org.openqa.selenium.By;\nimport org.openqa.selenium.WebElement;\nimport o"
},
{
"path": "web-driver-1-basics/src/test/java/com/in28minutes/webdriver/login/StaticLoginTest.java",
"chars": 882,
"preview": "package com.in28minutes.webdriver.login;\n\nimport org.openqa.selenium.By;\nimport org.openqa.selenium.WebElement;\nimport o"
},
{
"path": "web-driver-2-more-scenarios/pom.xml",
"chars": 1206,
"preview": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocat"
},
{
"path": "web-driver-2-more-scenarios/src/test/java/com/in28minutes/webdriver/basics/AbstractChromeWebDriverTest.java",
"chars": 896,
"preview": "package com.in28minutes.webdriver.basics;\n\nimport java.util.concurrent.TimeUnit;\n\nimport org.openqa.selenium.WebDriver;\n"
},
{
"path": "web-driver-2-more-scenarios/src/test/java/com/in28minutes/webdriver/scenarios/ActionsBasicTest.java",
"chars": 1845,
"preview": "package com.in28minutes.webdriver.scenarios;\n\nimport org.openqa.selenium.Alert;\nimport org.openqa.selenium.By;\nimport or"
},
{
"path": "web-driver-2-more-scenarios/src/test/java/com/in28minutes/webdriver/scenarios/CheckElementStylesTest.java",
"chars": 3049,
"preview": "package com.in28minutes.webdriver.scenarios;\n\nimport static org.testng.Assert.assertFalse;\n\nimport org.openqa.selenium.B"
},
{
"path": "web-driver-2-more-scenarios/src/test/java/com/in28minutes/webdriver/scenarios/FramesTest.java",
"chars": 794,
"preview": "package com.in28minutes.webdriver.scenarios;\n\nimport org.openqa.selenium.By;\nimport org.testng.annotations.Test;\n\nimport"
},
{
"path": "web-driver-2-more-scenarios/src/test/java/com/in28minutes/webdriver/scenarios/JavaScriptAlertTest.java",
"chars": 859,
"preview": "package com.in28minutes.webdriver.scenarios;\n\nimport org.openqa.selenium.Alert;\nimport org.openqa.selenium.By;\nimport or"
},
{
"path": "web-driver-2-more-scenarios/src/test/java/com/in28minutes/webdriver/scenarios/NewWindowTest.java",
"chars": 2552,
"preview": "package com.in28minutes.webdriver.scenarios;\n\nimport org.openqa.selenium.By;\nimport org.testng.annotations.Test;\n\nimport"
},
{
"path": "web-driver-2-more-scenarios/src/test/java/com/in28minutes/webdriver/scenarios/PlayingWithModalWindowAndWaitsTest.java",
"chars": 3138,
"preview": "package com.in28minutes.webdriver.scenarios;\n\nimport java.util.concurrent.TimeUnit;\n\nimport org.openqa.selenium.By;\nimpo"
}
]
// ... and 37 more files (download for full content)
About this extraction
This page contains the full source code of the in28minutes/automation-testing-with-java-and-selenium GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 237 files (3.3 MB), approximately 874.1k tokens, and a symbol index with 755 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.