Giter Club home page Giter Club logo

boykaframework / boyka-framework Goto Github PK

View Code? Open in Web Editor NEW
121.0 7.0 42.0 346.37 MB

πŸŽ‰ Ultimate test automation framework for automating any application on any platform

Home Page: https://boykaframework.github.io/boyka-framework/

License: MIT License

Java 94.76% JavaScript 0.33% TypeScript 2.56% CSS 1.30% MDX 1.05%
testing test-automation java automation okhttp3 webautomation apiautomation docusaurus hacktoberfest automation-framework

boyka-framework's Introduction

logo

πŸŽ‰ Ultimate test automation for testing any application on any platform

Don't forget to ⭐ the repository if you like it!

Product Hunt

Join Discord contributors last update Maven Central GitHub releases license


πŸ€” Why was Boyka-framework created?

In my career having vast experience in automating API, Web browsers and Mobile apps, I have seen that people had to use different frameworks for automating API, Web and Mobile applications which created a lot of chaos with respect to maintenance of dependencies and their respective code for test automation.

Also, I never came across a test automation framework which allowed us to write automation test script without any project specific boilerplate code or a mini framework.

In addition to this, there was learning curve involved for learning those individual frameworks which slowed down the team to write automation and thus increased overall automation debt.

This all gave me an idea of having a single framework which could solve all the above mentioned problems and help the QA's to keep the pace up with writing test scripts and reduce the automation debt.

🎯 Features

  • βœ… Zero boilerplate code
  • βœ… Support Rest API automation with schema validations and response body verification
  • βœ… Supports Web browser automation with support for Chrome, Edge, Firefox and Safari.
  • βœ… Supports Android native, web and hybrid apps automation
  • βœ… Supports iOS native, web and hybrid apps automation
  • βœ… Allow Multi-user Multi-platform session interactions like testing a multi-platform chat application
  • βœ… Supports execution of Web tests on cloud platforms like BrowserStack and LambdaTest
  • βœ… Highly configurable via boyka-config.json
  • βœ… Micro logging to log events of the test execution
  • βœ… Supports taking screenshots
  • βœ… Highly extensible via listeners for integrating with available Reporters
  • βœ… Supports any available test frameworks like TestNG, JUnit, Cucumber, etc
  • βœ… Support video recording of the tests for Mobile platforms

⏱️ Coming soon

Following are the awesome features which will be implemented soon to the frameworks:

  • Support for GraphQL and SOAP API automation
  • Support video recording of the tests for Web platforms
  • Support for more cloud platforms
  • Many many more...

πŸ‘€ Usage

Use this space to tell a little more about your project and how it can be used. Show additional screenshots, code samples, demos or link to other resources.

<dependency>
  <groupId>io.github.boykaframework</groupId>
  <artifactId>boyka-framework</artifactId>
  <version>1.2.0</version>
</dependency>

πŸ€“ Sample Code snippets

πŸ› οΈ Boyka Config file

This is the configuration file for Boyka Framework named boyka-config.json stored at src/test/resources folder.

{
  "listeners_package": "io.github.boykaframework.testng.listeners",
  "ui": {
    "timeout": {
      "implicit_wait": 10,
      "explicit_wait": 10,
      "page_load_timeout": 30,
      "script_timeout": 10,
      "highlight_delay": 100
    },
    "logging": {
      "exclude_logs": ["bugreport"]
    },
    "screenshot": {
      "enabled": true,
      "path": "./screenshots",
      "extension": "jpeg",
      "prefix": "SCR"
    },
    "web": {
      "test_local_chrome": {
        "base_url": "http://the-internet.herokuapp.com/",
        "browser": "CHROME",
        "highlight": true,
        "headless": false,
        "resize": "CUSTOM",
        "custom_size": {
          "width": 1580,
          "height": 1080
        }
      },
      "test_local_firefox": {
        "browser": "FIREFOX"
      },
      "test_local_edge": {
        "browser": "EDGE"
      },
      "test_local_safari": {
        "browser": "SAFARI"
      },
      "test_browserstack_chrome": {
        "browser": "REMOTE",
        "target": "BROWSER_STACK",
        "user_name": "${env:BS_USER}",
        "password": "${env:BS_KEY}",
        "capabilities": {
          "browser": "Chrome",
          "browser_version": "latest",
          "os": "Windows",
          "os_version": "10",
          "resolution": "1920x1080",
          "project": "Test Boyka Project",
          "build": "Test BrowserStack Build",
          "name": "Test BrowserStack Session"
        }
      },
      "test_selenium_grid": {
        "browser": "REMOTE",
        "target": "LOCAL",
        "port": "4444",
        "capabilities": {
          "browserName": "chrome",
          "platform": "MAC"
        }
      },
      "test_lambda_test_chrome": {
        "browser": "REMOTE",
        "target": "LAMBDA_TEST_WEB",
        "user_name": "${env:LT_USER}",
        "password": "${env:LT_KEY}",
        "capabilities": {
          "browserName": "Chrome",
          "version": "99.0",
          "platform": "Windows 10",
          "resolution": "1920x1080",
          "build": "Test LambdaTest Build",
          "name": "Test LambdaTest Session",
          "network": true,
          "visual": true,
          "video": true,
          "console": true
        }
      }
    },
    "mobile": {
      "test_local_sauce_android": {
        "server": {
          "target": "LOCAL",
          "port": 4723,
          "session_override": true,
          "driver": "UI_AUTOMATOR",
          "allow_insecure": ["get_server_logs"]
        },
        "device": {
          "os": "ANDROID",
          "version": "12",
          "name": "Pixel_7_Pro",
          "type": "VIRTUAL",
          "server_install_timeout": 60,
          "server_launch_timeout": 60,
          "ignore_unimportant_views": true,
          "swipe": {
            "distance": 25,
            "max_swipe_until_found": 5
          },
          "application": {
            "path": "/apps/android/sauce-demo.apk",
            "install_timeout": 180
          },
          "virtual_device": {
            "name": "Pixel_7_Pro",
            "headless": true
          }
        }
      },
      "test_bs_android": {
        "server": {
          "target": "BROWSER_STACK",
          "user_name": "${env:BS_USER}",
          "password": "${env:BS_KEY}",
          "driver": "UI_AUTOMATOR"
        },
        "device": {
          "os": "ANDROID",
          "version": "11.0",
          "name": "Google Pixel 5",
          "type": "CLOUD",
          "ignore_unimportant_views": true,
          "application": {
            "path": "AndroidApp",
            "external": true,
            "install_timeout": 180
          },
          "capabilities": {
            "projectName": "BrowserStack Android Project",
            "buildName": "Test BrowserStack Build",
            "sessionName": "Test BrowserStack Session",
            "appiumVersion": "2.0.0",
            "automationVersion": "latest",
            "deviceLogs": true,
            "networkLogs": true,
            "debug": true,
            "video": true,
            "appiumLogs": true
          }
        }
      },
      "test_lt_android": {
        "server": {
          "target": "LAMBDA_TEST_MOBILE",
          "user_name": "${env:LT_USER}",
          "password": "${env:LT_KEY}",
          "driver": "UI_AUTOMATOR"
        },
        "device": {
          "type": "CLOUD",
          "application": {
            "install_timeout": 180,
            "wait_activity": "com.swaglabsmobileapp.MainActivity"
          },
          "ignore_unimportant_views": true,
          "capabilities": {
            "platformName": "Android",
            "deviceName": "Pixel 5",
            "platformVersion": "11",
            "app": "${env:LT_APP_ANDROID}",
            "project": "LambdaTest Android Project",
            "build": "Test LambdaTest Build",
            "name": "Test LambdaTest Session",
            "devicelog": true,
            "network": true,
            "visual": true,
            "video": true,
            "autoGrantPermissions": true,
            "autoAcceptAlerts": true,
            "isRealMobile": true,
            "w3c": true
          }
        }
      },
      "test_local_sauce_ios": {
        "server": {
          "target": "LOCAL",
          "port": 4724,
          "session_override": true,
          "driver": "XCUI",
          "allow_insecure": ["get_server_logs"]
        },
        "device": {
          "os": "IOS",
          "version": "16.2",
          "name": "iPhone 14 Pro Max",
          "type": "VIRTUAL",
          "server_install_timeout": 60,
          "server_launch_timeout": 60,
          "connect_keyboard": false,
          "typing_speed": 30,
          "swipe": {
            "distance": 25,
            "max_swipe_until_found": 5
          },
          "virtual_device": {
            "headless": true,
            "launch_timeout": 180
          },
          "wda": {
            "launch_timeout": 120,
            "connection_timeout": 120
          },
          "application": {
            "path": "/apps/ios/sauce-demo.zip",
            "install_timeout": 180
          }
        }
      },
      "test_bs_ios": {
        "server": {
          "target": "BROWSER_STACK",
          "user_name": "${env:BS_USER}",
          "password": "${env:BS_KEY}",
          "driver": "XCUI"
        },
        "device": {
          "os": "IOS",
          "version": "16",
          "name": "iPhone 14 Pro",
          "type": "CLOUD",
          "application": {
            "path": "IOSApp",
            "external": true,
            "install_timeout": 180
          },
          "capabilities": {
            "projectName": "BrowserStack iOS Project",
            "buildName": "Test BrowserStack Build",
            "sessionName": "Test BrowserStack Session",
            "appiumVersion": "2.0.0",
            "automationVersion": "latest",
            "deviceLogs": true,
            "networkLogs": true,
            "debug": true,
            "video": true,
            "appiumLogs": true
          }
        }
      },
      "test_lt_ios": {
        "server": {
          "target": "LAMBDA_TEST_MOBILE",
          "user_name": "${env:LT_USER}",
          "password": "${env:LT_KEY}",
          "driver": "XCUI"
        },
        "device": {
          "type": "CLOUD",
          "application": {
            "install_timeout": 180
          },
          "ignore_unimportant_views": true,
          "capabilities": {
            "platformName": "iOS",
            "deviceName": "iPhone 14",
            "platformVersion": "16",
            "app": "${env:LT_APP_IOS}",
            "project": "LambdaTest iOS Project",
            "build": "Test LambdaTest Build",
            "name": "Test LambdaTest Session",
            "devicelog": true,
            "network": true,
            "visual": true,
            "video": true,
            "autoGrantPermissions": true,
            "autoAcceptAlerts": true,
            "isRealMobile": true,
            "w3c": true
          }
        }
      }
    }
  },
  "api": {
    "test_reqres": {
      "base_uri": "https://reqres.in",
      "base_path": "/api",
      "read_timeout": 2,
      "write_timeout": 2,
      "connection_timeout": 1,
      "schema_path": "schema/",
      "logging": {
        "request": true,
        "response": true
      }
    }
  }
}
πŸͺ’ API Sample

Add your response schema JSON files at the directory mentioned in config under src/test/resources folder.

-| /src
 |__ /test
   |__ /resources
     |__ /schemas  # This folder path mentioned in config file.
       |__ create-user-schema.json

Here's how you can execute the API test and also verify its response.

import static io.github.boykaframework.actions.api.ApiActions.withRequest;
import static io.github.boykaframework.enums.PlatformType.API;
import static io.github.boykaframework.manager.ParallelSession.createSession;
import static io.github.boykaframework.manager.ParallelSession.clearSession;
. . .
// Create request body object
final User user = User.createUser ()
  .name ("Wasiq")
  .job ("Software Engineer")
  .create ();

// Create API session.
createSession (API, "test_postman");

// Compose request
final ApiRequest request = ApiRequest.createRequest ()
  .method (POST)
  .path ("/users")
  .bodyObject (user)
  .create ();

// Execute request
final ApiResponse response = withRequest (request).execute ();

// Verify response status code
response.verifyStatusCode ()
  .isEqualTo (201);

// Verify response schema
response.verifySchema ("create-user-schema.json");

// Verify response body
response.verifyTextField ("id")
  .isNotNull ();
response.verifyTextField ("name")
  .isEqualTo (user.getName ());
response.verifyTextField ("job")
  .isEqualTo (user.getJob ());
response.verifyTextField ("createdAt")
  .isNotNull ();

// Clear API session.
clearSession ();
πŸ’» Common Page Object for Web, Android and iOS

This is how you can create a common page object for all Web, Android and iOS.

import io.appium.java_client.AppiumBy;
import org.openqa.selenium.By;

import io.github.boykaframework.builders.Locator;
import lombok.Getter;

@Getter
public class LoginPage {
  private static final LoginPage LOGIN_PAGE = new LoginPage ();

  public static LoginPage loginPage () {
    return LOGIN_PAGE;
  }

  private final Locator loginButton = Locator.buildLocator ()
    .web (By.id ("login-button"))
    .android (AppiumBy.accessibilityId ("test-LOGIN"))
    .ios (AppiumBy.accessibilityId ("test-LOGIN"))
    .name ("Login Button")
    .build ();
  private final Locator password = Locator.buildLocator ()
    .web (By.id ("password"))
    .android (AppiumBy.accessibilityId ("test-Password"))
    .ios (AppiumBy.accessibilityId ("test-Password"))
    .name ("Password")
    .build ();
  private final Locator username = Locator.buildLocator ()
    .web (By.id ("user-name"))
    .android (AppiumBy.accessibilityId ("test-Username"))
    .ios (AppiumBy.accessibilityId ("test-Username"))
    .name ("User Name")
    .build ();

  private LoginPage () {
    // Avoid explicit class initialization.
  }
}
βœ… Common Test flow for Web, Android and iOS

This is how you can write common actions class for Web, Android and iOS together for the app which has similar flows on both the platforms.

import static io.github.boykaframework.actions.drivers.NavigateActions.navigate;
import static io.github.boykaframework.actions.drivers.WindowActions.onWindow;
import static io.github.boykaframework.actions.elements.ElementActions.onElement;
import static io.github.boykaframework.actions.elements.FingerActions.withFinger;
import static io.github.boykaframework.actions.elements.TextBoxActions.onTextBox;
import static io.github.boykaframework.enums.PlatformType.WEB;
import static io.github.boykaframework.manager.ParallelSession.getSession;
import static io.github.boykaframework.testng.ui.saucedemo.pages.LoginPage.loginPage;
import static java.text.MessageFormat.format;

import io.github.boykaframework.enums.PlatformType;

public class SauceDemoActions {
  private static final String URL = "https://www.saucedemo.com";

  private final PlatformType platformType;

  public SauceDemoActions () {
    this.platformType = getSession ().getPlatformType ();
  }

  public void verifyLogin (final String userName, final String password) {
    verifyNavigateToSite ();
    onTextBox (loginPage ().getUsername ()).enterText (userName);
    onTextBox (loginPage ().getPassword ()).enterText (password);
    withMouse (loginPage ().getLoginButton ()).click ();
    verifyLoggedIn ();
  }

  private void verifyNavigateToSite () {
    if (this.platformType == WEB) {
      navigate ().to (URL);
      navigate ().verifyUrl ()
        .startsWith (URL);
    }
  }

  private void verifyLoggedIn () {
    if (this.platformType == WEB) {
      navigate ().verifyUrl ()
        .isEqualTo (format ("{0}/inventory.html", URL));
      onWindow ().verifyTitle ()
        .isEqualTo ("Swag Labs");
    }
    onElement (homePage ().getMenuButton ()).verifyIsDisplayed ()
      .isTrue ();
    onElement (homePage ().getMenuButton ()).verifyIsEnabled ()
      .isTrue ();
  }
}

Now, you can use this actions class in your test as shown below:

package io.github.boykaframework.testng.ui.saucedemo;

import static io.github.boykaframework.actions.drivers.DriverActions.withDriver;
import static io.github.boykaframework.actions.drivers.WindowActions.onWindow;
import static io.github.boykaframework.manager.ParallelSession.clearSession;
import static io.github.boykaframework.manager.ParallelSession.createSession;
import static io.github.boykaframework.manager.ParallelSession.getSession;
import static com.google.common.truth.Truth.assertThat;

import io.github.boykaframework.enums.PlatformType;
import io.github.boykaframework.testng.ui.saucedemo.actions.SauceDemoActions;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

public class SauceDemoTest {
  private SauceDemoActions sauceDemo;

  @AfterMethod (alwaysRun = true)
  public void afterMethod () {
    onWindow ().takeScreenshot ();
  }

  @BeforeClass (description = "Setup test class", alwaysRun = true)
  @Parameters ({ "platformType", "driverKey" })
  public void setupTestClass (final PlatformType platformType, final String driverKey) {
    createSession ("Unique User Persona", platformType, driverKey);
    this.sauceDemo = new SauceDemoActions ();
  }

  @AfterClass (description = "Tear down test class", alwaysRun = true)
  public void tearDownTestClass () {
    withDriver ().saveLogs ();
    clearSession ();
  }

  @Test (description = "Test login functionality")
  public void testLogin () {
    this.sauceDemo.verifyLogin ("standard_user", "secret_sauce");
  }
}

β˜• Examples

πŸ‘Ύ Tech Stack

🏘️ Boyka Framework

Boyka core tech stack

πŸ’» Main project and Website

Boyka Main project tech stack

πŸ’Ž Open source supporters

Big thanks to the following organizations for their support to the project with their open source licenses:

lambdatest
browserstack
JetBrains
Tuple

🧭 Project Road-map

Check out our road map to know which features we are cooking,

πŸ‘‹ Contributing

These are our awesome contributors:

Contributors

Contributions are always welcome!

Check out contributing.md for ways to get started.

πŸ“œ Code of Conduct

Please read the Code of Conduct

⚠️ License

Distributed under MIT License.

🀝 Contact

⭐ Star History

Star History Chart

boyka-framework's People

Contributors

dependabot[bot] avatar diogormendes avatar github-actions[bot] avatar makodeajay avatar mfaisalkhatri avatar sahilpuri2020 avatar wasiqb avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

boyka-framework's Issues

Change Workflow agent from Linux to Mac

  • Change linux agent to Mac agent
  • Add tests for Safari browser and run it on Mac agent
  • Add tests for Firefox browser and run it on Mac agent
  • Add tests for Edge browser and run it on Mac agent
  • Add tests for Opera browser and run it on Mac agent
  • Update Chrome test to run on Mac agent

Update Home page

  • Create Hero component
  • Add hero section on Home page
  • Add features section showcasing all features of the framework
  • Add code snippet tabs for API and Web
  • Add sub tabs for API to showcase steps in writing API tests
  • Add sub tabs for Web to showcase steps in writing Web tests
  • Add banner about the framework

Add Android Test using Sauce demo app

  • Update page objects for Saucedemo app using existing page objects
  • Update existing tests to also run for Android
  • Run test on local emulator for PR
  • Run test on BS on latest mobile and tablet devices
  • Run test on LT on latest mobile and tablet devices

πŸ› : Remove LambdaTest and BrowserStack test from PR check

❓ What is the bug?

Test for BrowserStack and LambdaTest fails for PR raised via fork

Version

1.0.0 (Default)

πŸ–₯️ What application type is this bug for?

NOT APPLICABLE

πŸ“ƒ Steps to reproduce

  • Create Fork for project
  • Make changes to your copy
  • Raise PR
  • Trigger tests by Core team

βœ… Expected Behaviour

Web tests should pass

❌ Actual Behaviour

LambdaTest and BrowserTest related tests fails due to missing secrets in the fork.

Add Element specific action methods and add more tests

  • Add method to get and verify Text of an element.
  • Add method to get and verify if element displayed.
  • Add method to get and verify if element enabled.
  • Add method to get and verify if element selected.
  • Add method to get and verify element attribute.
  • Delete clearText method from KeyboardAction class.
  • Add clear method to ElementActions class.
  • Added info logging in all public methods.
  • Write End to end test journey

Add iOS tests using Sauce demo app

  • Update page objects for Saucedemo app using existing page objects
  • Update existing tests to also run for iOS
  • Run test on local simulators for PR
  • Run test on BS and LT on latest mobile and iPad devices

πŸ› : Site colour theme different on Mobile as compared with desktop

❓ What is the bug?

Site colour theme not in sync on different platforms

Version

1.0.0 (Default)

πŸ–₯️ What application type is this bug for?

NOT APPLICABLE

πŸ“ƒ Steps to reproduce

  1. Open documentation website on Desktop browser
  2. Open documentation website on Mobile browser

βœ… Expected Behavior

Colour theme should be same on both devices

❌ Actual Behavior

Colour theme is different

Create Docusaurus website, add ESLint and Prettier

  • Create website with Docusaurus
  • Update existing workflow to run only on Java project changes
  • Host the site on GH pages with workflow
  • Add ESLint
  • Add Prettier
  • Update commit hook to look for ESLint and Prettier issues before committing any changes
  • Update site colours, fonts and icons branding

✨ : Support dynamic element component

πŸ“— Description of the new feature request?

Allow Query for a particular product item out of the list of items based on title or any similar filter.

🚧 Scenario where this would be used?

Consider scenario where there are multiple similar components like Product item on an e-com site. Here user should be able to query for a particular product item out of the list of items based on title or any similar filter.

πŸ’ Supporting information

No response

Curl request logger✨ :

πŸ“— Description of the new feature request?

Adding Curl request logger for easier debugging from logs

🚧 Scenario where this would be used?

Adding Curl request logger for easier debugging from logs

πŸ’ Supporting information

No response

πŸ› : Error in Test Results Job in core-framework workflow

❓ What is the bug?

Error occurred in test result job

Version

1.0.0 (Default)

πŸ–₯️ What application type is this bug for?

NOT APPLICABLE

πŸ“ƒ Steps to reproduce

Submit PR and trigger workflows.

βœ… Expected Behavior

Test Results job should pass.

❌ Actual Behavior

Getting following Error on Test results job, Error: Resource not accessible by integration after test execution passes.

Code clean-up for Web and API

  • Replace clear method in Session class with clearSession
  • Add common lambda helper methods to perform actions on driver
  • Add common lambda helper methods to perform actions on element
  • Add copyright block on all the code files
  • Replace Rest-Assured with OkHttp3
  • Add Javadoc on all the methods and classes

GitHub workflow to deploy library to Maven central

  • Bump version up in main package.json
  • Bump the version up for Framework pom based on root Node package version
  • Publish Framework JAR to Maven Central
  • Create release tag
  • Create GitHub release with generated GHANGELOG
  • Create a new Discussion for the release
  • Tweet about the release

Handle iOS application automation

  • Add iOS driver support with W3C capabilities
  • Handle iOS logs handling for device, network, console, iOS logs
  • Handle iOS specific gestures

✨ : Add all driver specific actions

πŸ“— Description of the new feature request?

There are many driver specific actions which are still missing from the framework.

🚧 Scenario where this would be used?

We need to cover all driver specific actions in the framework

πŸ’ Supporting information

  • acceptAlert
  • dismissAlert
  • switchToFrame
  • goBack
  • goForward
  • refresh
  • Save driver logs to logs folder
  • cookieOf
  • deleteAllCookies
  • deleteCookie
  • takeScreenshot
  • executeScript

Moving towards monorepo architecture

Changes needed:

  • Create core-java directory and move all Java project related files under this new folder
  • Create Node package in root directory
  • Install and setup commitlint for checking commit message format
  • Install and setup husky for pre-push hook to verify commit messages

Why monorepo is required?

  • The reason for moving towards monorepo is the need that we want to create the framework documentation site in the same repo. To accommodate this, it is required to have monorepo in place.
  • Also, we want to move towards conventional commit messaging and want to enforce this practice via commit hooks, this can be done with the help of husky, the awesome tool to add pre-push hook to verify commit message.
  • Another tool commitlint will help in writing convention commit messages.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.