🌜
🌞
taiko

taiko

v1.3.4

Taiko is a Node.js library for automating Chromium based browsers

npm install taiko

README

Taiko

Docs | API reference

A Node.js library for testing modern web applications

Actions Status License MIT npm version contributions welcome Contributor Covenant

Taiko REPL

What’s Taiko?

Taiko is a free and open source browser automation tool built by the team behind Gauge from ThoughtWorks. Taiko is a Node.js library with a clear and concise API to automate Chromium based browsers(Chrome, Microsoft Edge, Opera) and Firefox. Tests written in Taiko are highly readable and maintainable.

With Taiko it’s easy to

  • Get Started
  • Record/Write/Run tests

Taiko’s smart selectors make tests reliable by adapting to changes in the structure of your web application. With Taiko there’s no need for id/css/xpath selectors or adding explicit waits (for XHR requests) in test scripts.

Features

Taiko is built ground up to test modern web applications. Here’s a list of a few unique features that sets it apart from other browser automation tools.

  • Easy Installation
  • Interactive Recorder
  • Smart Selectors
  • Handle XHR and dynamic content
  • Request/Response stubbing and mocking

Getting Started

Easy Installation

Taiko works on Windows, MacOS and Linux. You only need Node.js installed in your system to start writing Taiko scripts in JavaScript. After you’ve installed Node.js open a terminal application (or powershell in the case of Windows) and install Taiko using npm with the command

$ npm install -g taiko

This installs Taiko and the latest version of Chromium browser. We are all set to do some testing!

Interactive Recorder

Taiko comes with a Recorder that’s a REPL for writing test scripts. You can use Taiko’s JavaScript API to control the browser from the REPL. To launch the REPL type taiko in your favorite terminal application

$ taiko
Version: 0.8.0 (Chromium:76.0.3803.0)
Type .api for help and .exit to quit
>

This launches the Taiko prompt. You can now use Taiko’s API as commands in this prompt. For example, launch a Chromium browser instance using

> openBrowser()

You can now automate this Chromium browser instance with commands, for example, make the browser search google for something.

> goto("google.com/?hl=en")
> write("taiko test automation")
> click("Google Search")

These commands make the browser go to google’s home page, type the text "taiko test automation" and click on the "Google Search" button. You can see the browser performing these actions as you type and press enter for each command.

Taiko’s REPL keeps a history of all successful commands. Once you finish a flow of execution, you can generate a test script using the special command .code

> .code
const { openBrowser, goto, write, click, closeBrowser } = require('taiko');

(async () => {
    try {
        await openBrowser();
        await goto("google.com");
        await write("taiko test automation");
        await click("Google Search");
    } catch (error) {
            console.error(error);
    } finally {
            closeBrowser();
    }
})();

Taiko generates readable and maintainable JavaScript code. Copy and modify this code or save it directly to a file using

> .code googlesearch.js

You can choose to continue automating or finish the recording using

> .exit

To run a Taiko script pass the file as an argument to taiko

$ taiko googlesearch.js
✔ Browser opened
✔ Navigated to url "http://google.com"
✔ Wrote taiko test automation into the focused element.
✔ Clicked element containing text "Google Search"
✔ Browser closed

By default Taiko runs the script in headless mode, that means it does not launch a browser window. This makes it easy to run Taiko in containers (ex. Docker). To view the browser when the script executes use

$ taiko googlesearch.js --observe

Taiko’s REPL also documents all the API’s. To view all available API’s use the special command .api

$ taiko
Version: 0.8.0 (Chromium:76.0.3803.0)
Type .api for help and .exit to quit
> .api
Browser actions
    openBrowser, closeBrowser, client, switchTo, setViewPort, openTab, closeTab
...

To see more details of an API along with examples use

>.api openBrowser

Launches a browser with a tab. The browser will be closed when the parent node.js process is closed.

Example:
    openBrowser()
    openBrowser({ headless: false })
    openBrowser({args:['--window-size=1440,900']})

Smart Selectors

Taiko’s API treats the browser as a black box. With Taiko we can write scripts by looking at a web page and without inspecting it’s source code For example on google.com the command

> click("Google Search")

clicks on any element with the text Google Search (a button on the page at https://google.com). Taiko’s API mimics user interactions with the browser. For example if you want to write into an element that’s currently in focus use

> write("something")

Or if you want to write into a specific text field

> write("something", into(textBox({placeholder: "Username"})))

With Taiko’s API we can avoid using ids/css/xpath selectors to create reliable tests that don’t break with changes in the web page’s structure.

You can also use Taiko’s proximity selectors to visually locate elements. For example

> click(checkBox(near("Username")))

Will click the checkbox that is nearest to any element with the text Username.

Taiko also supports XPath and CSS selectors

> click($("#button_id")) // Using CSS selector
> click($("//input[@name='button_name']")) // XPath selector

Handle XHR and dynamic content

Taiko’s API listens to actions that trigger XHR request or fetch dynamic content and automatically waits for them to complete before moving on to the next action. Taiko implicitly waits for elements to load on the page before performing executing the command. Scripts written in Taiko are free of explicit local or global waits and the flakiness.

Request/Response stubbing and mocking

Setting up test infrastructure and test data is hard. Taiko makes this easy with the intercept API. For example, block requests on a page (like Google Analytics or any other resource)

> intercept("https://www.google-analytics.com/analytics.js");

Or redirect an XHR request on the page to a test instance

> intercept("https://fetchdata.com", "http://fetchtestdata.com")

Or stub an XHR request to return custom data

> intercept("https://fetchdata.com", {"test": data})

Or even modify data sent by XHR requests

> intercept("https://fetchdata.com", (request) => {request.continue({"custom": "data"})})

This simplifies our test setups as we don’t have to set up mock servers, or replace url’s in tests to point to test instances.

Integrating with Gauge

We recommend using Taiko with Gauge. Gauge is a framework for writing readable and reusable acceptance tests. With features like markdown specifications, data driven execution, parallel execution and reporting Gauge makes test maintenance easy. Gauge is easy to install and well integrated with Taiko. With Gauge and Taiko we can write reliable acceptance tests.

Install Gauge using npm and initialize an initialize and sample Taiko project using

$ npm install @getgauge/cli
$ gauge init js

Learn more about Gauge!

Experimental Firefox Support

To launch taiko with firefox:

  • Download and install firefox nightly
  • Set TAIKO_BROWSER_PATH to firefox nightly's executable.

Example: TAIKO_BROWSER_PATH="/Applications/Firefoxnightly.app/Contents/MacOS/firefox" taiko

Known Issues for now:

  • Highlighting element on action is set to false as overlay domain is not supported
  • openTab/closeTab does not work as expected since New is not available in firefox yet
  • Autofocus on first input field does not happen
  • file:// protocol does not emit events
  • waitFoNavigation does not wait for network calls and frame loads

Experimental TypeScript Support

When using Gauge together with Taiko with gauge-ts using

$ npm install @getgauge/cli
$ gauge init ts

Documentation

Branding

Inspired by

Talk to us

Copyright 2019 ThoughtWorks, Inc

Release Notes

1.3.4
Published on May 28, 2022
  • #2595 - Updated Unit Test for #2592
  • #2592 - Fixes #2587 Adds the ability to use click modifiers
  • #2588 - Add wait to flush interceptors #2397
  • #2585 - Update chromium to revision 1001660
  • #2584 - Boolean highlightOnAction
  • #2579 - Update chromium to revision 996121
  • #2573 - update dependencies
  • #2572 - Update chromium to revision 990320
  • #2566 - Update chromium to revision 986347
  • #2555 - Update chromium to revision 978099
  • #2553 - Bump mocha from 9.2.1 to 9.2.2
  • #2552 - Bump cssnano from 5.1.1 to 5.1.4
  • #2551 - Bump eslint from 8.10.0 to 8.11.0
  • #2548 - Bump devtools-protocol from 0.0.977936 to 0.0.979918
  • #2538 - Bump eslint-config-prettier from 8.4.0 to 8.5.0
  • #2533 - Bump @typescript-eslint/eslint-plugin from 5.12.1 to 5.13.0
  • #2520 - Bump eslint-plugin-jest from 25.3.4 to 26.1.1
  • #2387 - Add a feature for checkBox to take xpath as a parameter.
1.3.2
Published on March 19, 2022
  • #2558 - #2508 fix click api to take co-ordinates as options
  • #2557 - checkIfElementIsNotCovered shadowroot parent
  • #2556 - Add new devices for mobile emulation
  • #2554 - Add new mobile devices for mobile emulation
  • #2549 - Bump cssnano from 5.1.1 to 5.1.3
  • #2547 - Bump devtools-protocol from 0.0.977936 to 0.0.979353
  • #2546 - Bump cssnano from 5.1.0 to 5.1.1
  • #2542 - Bump @typescript-eslint/parser from 5.13.0 to 5.14.0
  • #2540 - Bump devtools-protocol from 0.0.975963 to 0.0.977936
  • #2532 - Update chromium to revision 970485
1.3.1
Published on March 8, 2022
  • #2541 - Bump lint-staged from 12.3.4 to 12.3.5
  • #2539 - Bump devtools-protocol from 0.0.975963 to 0.0.977469
  • #2537 - Remove div height
  • #2536 - Bump cssnano from 5.0.17 to 5.1.0
  • #2535 - Bump typescript from 4.5.5 to 4.6.2
  • #2534 - Bump @typescript-eslint/parser from 5.12.1 to 5.13.0
  • #2531 - Bump devtools-protocol from 0.0.974996 to 0.0.975963
  • #2530 - Bump eslint from 8.9.0 to 8.10.0
  • #2529 - Bump devtools-protocol from 0.0.974996 to 0.0.975498
  • #2528 - Bump devtools-protocol from 0.0.955664 to 0.0.974996
  • #2527 - Bump sinon from 12.0.1 to 13.0.1
  • #2524 - Bump @typescript-eslint/eslint-plugin from 5.9.1 to 5.12.1
  • #2523 - Bump mocha from 9.1.3 to 9.2.1
  • #2522 - Bump url-parse from 1.5.4 to 1.5.7
  • #2519 - Bump commander from 8.3.0 to 9.0.0
  • #2518 - Update chromium to revision 967620
  • #2517 - Bump follow-redirects from 1.14.7 to 1.14.8
  • #2516 - Bump @typescript-eslint/eslint-plugin from 5.9.1 to 5.12.0
  • #2515 - Bump lint-staged from 12.1.7 to 12.3.4
  • #2514 - Bump devtools-protocol from 0.0.957163 to 0.0.970581
  • #2513 - Bump devtools-protocol from 0.0.957163 to 0.0.969541
  • #2512 - chore: add openBrowser debug logs
  • #2511 - Bump cssnano from 5.0.15 to 5.0.17
  • #2510 - Bump @typescript-eslint/eslint-plugin from 5.9.1 to 5.11.0
  • #2509 - Bump eslint-plugin-jest from 25.3.4 to 26.1.0
  • #2507 - Bump devtools-protocol from 0.0.957163 to 0.0.967529
  • #2506 - Bump follow-redirects from 1.14.6 to 1.14.7
  • #2505 - Bump devtools-protocol from 0.0.957163 to 0.0.966979
  • #2503 - Bump devtools-protocol from 0.0.957163 to 0.0.966116
  • #2502 - Bump lint-staged from 12.1.7 to 12.3.3
1.2.8
Published on November 22, 2021
  • #2403 - Bump devtools-protocol from 0.0.924232 to 0.0.943452
  • #2401 - Bump devtools-protocol from 0.0.924232 to 0.0.943026
  • #2398 - Bump devtools-protocol from 0.0.924232 to 0.0.942138
  • #2395 - Bump devtools-protocol from 0.0.924232 to 0.0.940865
  • #2393 - Bump devtools-protocol from 0.0.924232 to 0.0.940363
  • #2392 - Bump devtools-protocol from 0.0.924232 to 0.0.940028
  • #2391 - Bump devtools-protocol from 0.0.924232 to 0.0.939725
  • #2388 - Bump devtools-protocol from 0.0.924232 to 0.0.938931
  • #2385 - Bump devtools-protocol from 0.0.924232 to 0.0.938546
  • #2384 - Bump eslint-plugin-jest from 24.4.0 to 25.2.3
  • #2382 - Bump devtools-protocol from 0.0.924232 to 0.0.937139
  • #2380 - Added ability to pass useHostName and secure params via openBrowser API
  • #2379 - Bump devtools-protocol from 0.0.924232 to 0.0.936174
  • #2377 - Bug(checkbox|radio): Set checked value on native element setter so that events are triggered properly
  • #2370 - Bug(range): Set range value on native element setter to trigger events correctly
  • #2369 - Bump devtools-protocol from 0.0.924232 to 0.0.933220
  • #2366 - Bump devtools-protocol from 0.0.924232 to 0.0.932485
  • #2365 - Bump eslint-plugin-jest from 24.4.0 to 25.2.2
  • #2364 - Bump eslint-plugin-jest from 24.4.0 to 25.2.1
  • #2363 - Bump devtools-protocol from 0.0.924232 to 0.0.931720
  • #2361 - Bump devtools-protocol from 0.0.924232 to 0.0.931360
  • #2360 - Bump eslint-plugin-jest from 24.4.0 to 25.0.6
  • #2357 - Bump typescript from 4.4.2 to 4.4.4
  • #2353 - Bump eslint-plugin-jest from 24.4.0 to 25.0.5
  • #2352 - Bump devtools-protocol from 0.0.924232 to 0.0.930289
  • #2348 - Bump eslint-plugin-jest from 24.4.0 to 25.0.1
  • #2345 - Bump devtools-protocol from 0.0.924232 to 0.0.928170
  • #2343 - Bump devtools-protocol from 0.0.924232 to 0.0.927854
  • #2342 - Bump eslint-plugin-jest from 24.4.0 to 24.5.2
  • #2341 - Bump devtools-protocol from 0.0.924232 to 0.0.927104
1.2.7
Published on August 9, 2021
  • #2240 - Bump lint-staged from 11.1.1 to 11.1.2
  • #2239 - Scroll only when element state check fails
  • #2237 - Bump clean-css from 5.1.4 to 5.1.5
  • #2233 - Bump devtools-protocol from 0.0.907573 to 0.0.908187
  • #2232 - dep update
  • #2231 - Bump @babel/parser from 7.14.7 to 7.14.9
  • #2230 - Bump dtslint from 4.1.1 to 4.1.3
  • #2227 - Bump devtools-protocol from 0.0.898382 to 0.0.906795
  • #2224 - Bump @typescript-eslint/parser from 4.28.2 to 4.28.5
  • #2222 - Bump @typescript-eslint/eslint-plugin from 4.28.2 to 4.28.5
  • #2219 - Bump lint-staged from 11.0.0 to 11.1.1
  • #2215 - Bump markdown-it-anchor from 8.1.0 to 8.1.2
  • #2214 - Bump recast from 0.20.4 to 0.20.5
  • #2213 - Bump eslint-plugin-jest from 24.3.6 to 24.4.0
  • #2212 - Bump cssnano from 5.0.6 to 5.0.7
  • #2200 - Update chromium to revision 900323
  • #2169 - Update chromium to revision 896380
1.2.6
Published on August 2, 2021
  • #2229 - Cache proxomity element Rect
  • #2226 - Bump devtools-protocol from 0.0.898382 to 0.0.906505
  • #2223 - Bump devtools-protocol from 0.0.898382 to 0.0.905680
  • #2216 - Bump lint-staged from 11.0.0 to 11.1.0
  • #2211 - Bump eslint-plugin-jest from 24.3.6 to 24.3.7
  • #2210 - Bump @babel/parser from 7.14.7 to 7.14.8
  • #2209 - Bump @typescript-eslint/eslint-plugin from 4.28.2 to 4.28.4
  • #2208 - Bump @typescript-eslint/parser from 4.28.2 to 4.28.4
  • #2207 - Bump eslint from 7.30.0 to 7.31.0
  • #2199 - Bump devtools-protocol from 0.0.898382 to 0.0.901419
  • #2194 - Bump @typescript-eslint/eslint-plugin from 4.28.2 to 4.28.3
  • #2193 - Bump @typescript-eslint/parser from 4.28.2 to 4.28.3
  • #2192 - Bump lint-staged from 11.0.0 to 11.0.1
  • #2191 - Bump devtools-protocol from 0.0.898382 to 0.0.900855
  • #2189 - Bump devtools-protocol from 0.0.898382 to 0.0.900357
  • #2188 - Bump devtools-protocol from 0.0.898382 to 0.0.899914
  • #2187 - Bump dtslint from 4.1.1 to 4.1.2
  • #2186 - Bump devtools-protocol from 0.0.898382 to 0.0.899437
  • #2183 - Fix max listener reached warning in unit tests
  • #2182 - update deps to latest
  • #2181 - Bump debug from 4.3.1 to 4.3.2
  • #2180 - Bump @typescript-eslint/eslint-plugin from 4.28.0 to 4.28.2
  • #2179 - Bump husky from 6.0.0 to 7.0.1
  • #2178 - Bump @typescript-eslint/parser from 4.28.0 to 4.28.2
  • #2177 - Bump devtools-protocol from 0.0.895982 to 0.0.898382
  • #2176 - Bump markdown-it from 12.0.6 to 12.1.0
  • #2175 - Bump devtools-protocol from 0.0.895982 to 0.0.898124
  • #2174 - Bump markdown-it-anchor from 8.0.4 to 8.1.0
  • #2172 - Bump husky from 6.0.0 to 7.0.0
  • #2171 - Bump dtslint from 4.1.0 to 4.1.1
1.2.5
Published on May 3, 2021
  • #2027 - Bump devtools-protocol from 0.0.876958 to 0.0.878026
  • #2022 - Bump version to 1.2.5
  • #2021 - Bump @babel/parser from 7.13.16 to 7.14.0
  • #2017 - Bump cssnano from 5.0.1 to 5.0.2
  • #2016 - Bump devtools-protocol from 0.0.873728 to 0.0.876958
  • #2015 - Bump devtools-protocol from 0.0.873728 to 0.0.876535
  • #2014 - Bump devtools-protocol from 0.0.873728 to 0.0.876073
  • #2013 - fix(config): Allow navigation and retry timeout to be read from env
  • #2012 - Bump eslint from 7.24.0 to 7.25.0
  • #2011 - Bump documentation from 13.2.4 to 13.2.5
  • #2010 - Bump eslint-plugin-jest from 24.3.5 to 24.3.6
  • #2009 - Bump eslint-config-prettier from 8.2.0 to 8.3.0
  • #2008 - Perform click on given positions
  • #2007 - Bump cssnano from 4.1.11 to 5.0.1
  • #2005 - Bump devtools-protocol from 0.0.872298 to 0.0.873728
  • #2004 - Bump @babel/parser from 7.13.15 to 7.13.16
  • #2003 - Bump markdown-it from 12.0.5 to 12.0.6
  • #2002 - Bump documentation from 13.2.1 to 13.2.4
  • #1999 - #1998 assign current target for openTab with blank url
1.2.4
Published on April 19, 2021
  • #1997 - Custom message for waitFor API
  • #1994 - Bump eslint-plugin-prettier from 3.3.1 to 3.4.0
  • #1993 - Bump markdown-it from 12.0.4 to 12.0.5
  • #1992 - Bump devtools-protocol from 0.0.871838 to 0.0.872298
  • #1991 - Bump eslint-config-prettier from 7.2.0 to 8.2.0
  • #1990 - Bump devtools-protocol from 0.0.871249 to 0.0.871838
  • #1985 - Bump devtools-protocol from 0.0.871249 to 0.0.871615
  • #1983 - Bump eslint-plugin-jest from 24.3.4 to 24.3.5
  • #1982 - Bump eslint from 7.23.0 to 7.24.0
  • #1981 - Bump devtools-protocol from 0.0.869921 to 0.0.871249
  • #1980 - Bump sinon from 10.0.0 to 10.0.1
  • #1979 - Bump @babel/parser from 7.13.13 to 7.13.15
  • #1977 - Bump dtslint from 4.0.8 to 4.0.9
  • #1976 - Bump typescript from 4.2.3 to 4.2.4
  • #1975 - Bump devtools-protocol from 0.0.869754 to 0.0.869921
  • #1974 - Bump documentation from 13.2.0 to 13.2.1
  • #1973 - Bump cssnano from 4.1.10 to 4.1.11
  • #1972 - Bump devtools-protocol from 0.0.867593 to 0.0.869754
  • #1971 - Bump eslint-plugin-jest from 24.3.1 to 24.3.4
  • #1969 - Bump devtools-protocol from 0.0.867593 to 0.0.868034
  • #1964 - Bump devtools-protocol from 0.0.866556 to 0.0.867593
  • #1961 - Bump husky from 5.0.9 to 6.0.0
  • #1960 - Bump y18n from 4.0.0 to 4.0.1
  • #1959 - Bump @babel/parser from 7.13.12 to 7.13.13
  • #1958 - Bump eslint from 7.22.0 to 7.23.0
  • #1956 - Bump devtools-protocol from 0.0.866105 to 0.0.866556
  • #1955 - Fix evaluate passing data code snippet
  • #1954 - Bump devtools-protocol from 0.0.862653 to 0.0.866105
  • #1953 - Bump dtslint from 4.0.7 to 4.0.8
  • #1948 - Bump @babel/parser from 7.13.10 to 7.13.12
1.2.3
Published on March 24, 2021
  • #1952 - Bump version to 1.2.3
  • #1950 - Enable web security by default
  • #1949 - Bump sinon from 9.2.4 to 10.0.0
  • #1947 - Bump chrome-remote-interface from 0.29.0 to 0.30.0
  • #1946 - Update dependencies for chromium
  • #1945 - Bump husky from 5.0.9 to 5.2.0
  • #1944 - Bump commander from 7.1.0 to 7.2.0
  • #1943 - Bump @11ty/eleventy from 0.11.1 to 0.12.1
  • #1942 - Bump devtools-protocol from 0.0.862653 to 0.0.863986
  • #1939 - Bump eslint-plugin-jest from 24.3.1 to 24.3.2
  • #1937 - Bump @babel/parser from 7.13.10 to 7.13.11
  • #1936 - Bump devtools-protocol from 0.0.862653 to 0.0.862770
  • #1934 - Update chromium to revision 861020
  • #1933 - Bump mocha from 8.3.1 to 8.3.2
  • #1932 - Bump devtools-protocol from 0.0.861504 to 0.0.862653
  • #1931 - Bump eslint-plugin-jest from 24.1.8 to 24.3.1
  • #1930 - Bump eslint from 7.20.0 to 7.22.0
  • #1929 - Bump documentation from 13.1.1 to 13.2.0
  • #1928 - Bump chai from 4.3.3 to 4.3.4
  • #1923 - Bump devtools-protocol from 0.0.861373 to 0.0.861504
  • #1922 - Bump eslint-plugin-jest from 24.1.8 to 24.2.1
  • #1918 - Bump eslint-plugin-jest from 24.1.8 to 24.2.0
  • #1917 - Bump devtools-protocol from 0.0.860858 to 0.0.861373
  • #1916 - Bump @babel/parser from 7.12.17 to 7.13.10
  • #1915 - Bump eslint-plugin-jest from 24.1.8 to 24.1.9
  • #1914 - Bump devtools-protocol from 0.0.860415 to 0.0.860858
  • #1913 - Bump eslint-plugin-jest from 24.1.5 to 24.1.8
  • #1912 - Bump eslint-plugin-mocha from 8.0.0 to 8.1.0
  • #1911 - Bump devtools-protocol from 0.0.859327 to 0.0.860415
  • #1910 - Bump markdown-it-anchor from 7.0.2 to 7.1.0
1.2.2
Published on February 23, 2021
  • #1880 - Support to attach multiple files to upload
  • #1876 - Update node version10 12, 14
  • #1875 - Update node version for build

General

License
MIT
Typescript Types
Built-in
Tree-shakeable
No

Popularity

GitHub Stargazers
3,179
Community Interest
3,255
Number of Forks
272

Maintenance

Commits
10/219/22020
Last Commit
Open Issues
47
Closed Issues
854
Open Pull Requests
4
Closed Pull Requests
443

Versions

Versions Released
10/219/2202
Latest Version Released
May 28, 2022
Current Tags
latest1.3.4
dev0.0.9-dev1
nightly0.0.9-nightly.20180717

Contributors

NivedhaSenthil
NivedhaSenthil
Commits: 595
negiDharmendra
negiDharmendra
Commits: 131
Apoorva-GA
Apoorva-GA
Commits: 129
saikrishna321
saikrishna321
Commits: 121
nehashri
nehashri
Commits: 100
zabil
zabil
Commits: 95
kashishm
kashishm
Commits: 84
shubhamsc
shubhamsc
Commits: 78
BugDiver
BugDiver
Commits: 77
luciferankon
luciferankon
Commits: 60
sriv
sriv
Commits: 41
chandrakanth17
chandrakanth17
Commits: 21
sguptatw
sguptatw
Commits: 16
chandu199
chandu199
Commits: 14
gaugebot
gaugebot
Commits: 11