zebrunner / carina Goto Github PK
View Code? Open in Web Editor NEWCarina automation framework (TestNG): Web, Mobile, API, DB etc testing...
Home Page: https://zebrunner.github.io/carina
License: Apache License 2.0
Carina automation framework (TestNG): Web, Mobile, API, DB etc testing...
Home Page: https://zebrunner.github.io/carina
License: Apache License 2.0
no valuable stack trace, just error message:
2017-10-27 20:32:08 DefaultTestRailUpdater [TestNG] [INFO]Updater Thread: 17
2017-10-27 20:32:08 TestNamingUtil [TestNG] [WARN]Unable to find registered test name for threadId: 17. stack is null!
2017-10-27 20:32:08 DefaultTestRailUpdater [TestNG] [ERROR]Unable to identify test name by threadId: 17
Be able to track logcat results on Andriod. Ideally even generate only those lines which reflect to each specific device
integration with cucumber should be moved into separate sub-module.
By default it shouldn't be included into the multi-maven structure
improve carina nexus nginx config to fix:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy (default-deploy) on project carina-core: Failed to deploy artifacts: Could not transfer artifact com.qaprosoft:carina-core:jar:5.2.1.203-20171210.222021-1 from/to deploymentRepo (http://ci.qaprosoft.com/nexus/content/repositories/snapshots/): Failed to transfer file: http://ci.qaprosoft.com/nexus/content/repositories/snapshots/com/qaprosoft/carina-core/5.2.1.203-SNAPSHOT/carina-core-5.2.1.203-20171210.222021-1.jar. Return code is: 413, ReasonPhrase: Request Entity Too Large. -> [Help 1]
Rename the sender to smth more meaningful then just "cloud"
like QA Automation report
or at least create user: [email protected] and name it as QA Automation.
Swipe from MobileUtils doesn't work. Example of logs:
sun.reflect.GeneratedConstructorAccessor33.newInstance(Unknown Source) sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) java.lang.reflect.Constructor.newInstance(Constructor.java:423) org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:215) org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:167) org.openqa.selenium.remote.http.JsonHttpResponseCodec.reconstructValue(JsonHttpResponseCodec.java:40) org.openqa.selenium.remote.http.AbstractHttpResponseCodec.decode(AbstractHttpResponseCodec.java:82) org.openqa.selenium.remote.http.AbstractHttpResponseCodec.decode(AbstractHttpResponseCodec.java:45) org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:164) io.appium.java_client.remote.AppiumCommandExecutor.execute(AppiumCommandExecutor.java:89) org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:646) io.appium.java_client.DefaultGenericMobileDriver.execute(DefaultGenericMobileDriver.java:42) io.appium.java_client.AppiumDriver.execute(AppiumDriver.java:1) io.appium.java_client.android.AndroidDriver.execute(AndroidDriver.java:1) io.appium.java_client.PerformsTouchActions.performTouchAction(PerformsTouchActions.java:41) io.appium.java_client.TouchAction.perform(TouchAction.java:325) com.qaprosoft.carina.core.foundation.utils.mobile.MobileUtils.swipe(MobileUtils.java:447) com.qaprosoft.carina.core.foundation.utils.mobile.MobileUtils.swipeUntilElementPresence(MobileUtils.java:409) com.qaprosoft.carina.core.foundation.utils.mobile.MobileUtils.swipeUntilElementPresence(MobileUtils.java:380) com.myfitnesspal.refactored.gui.mobile.android.phone.diary.DiaryPage.clickNutritionBottomButton(DiaryPage.java:213) com.myfitnesspal.refactored.diary.DiaryTabTest.otherScreensTest(DiaryTabTest.java:34) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) java.lang.reflect.Method.invoke(Method.java:498) org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84) org.testng.internal.MethodInvocationHelper$1.runTestMethod(MethodInvocationHelper.java:200) com.qaprosoft.zafira.listener.ZafiraListener.run(ZafiraListener.java:502) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) java.lang.reflect.Method.invoke(Method.java:498) org.testng.internal.MethodInvocationHelper.invokeHookable(MethodInvocationHelper.java:212) org.testng.internal.Invoker.invokeMethod(Invoker.java:707) org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901) org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231) org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127) org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111) org.testng.TestRunner.privateRun(TestRunner.java:767) org.testng.TestRunner.run(TestRunner.java:617) org.testng.SuiteRunner.runTest(SuiteRunner.java:348) org.testng.SuiteRunner.access$000(SuiteRunner.java:38) org.testng.SuiteRunner$SuiteWorker.run(SuiteRunner.java:382) org.testng.internal.thread.ThreadUtil$2.call(ThreadUtil.java:64) java.util.concurrent.FutureTask.run(FutureTask.java:266) java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) java.lang.Thread.run(Thread.java:748)
Need a fast way to determine ExtendedWebElement by coordinates only.
If 0 or more then 1 elements are recognized by single point - raise exception otherwise return new ExtendedWebElement object
Error has following stacktrace:
[ExtendedElementLocator.java] [1] [ERROR] Unable to find element: no such element: Unable to locate element: {"method":"id","selector":"agree"}
(Session info: chrome=64.0.3282.119)
(Driver info: chromedriver=2.33.506120 (e3e53437346286c0bc2d2dc9aa4915ba81d9023f),platform=Windows NT 10.0.16299 x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 1.02 seconds
For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html
Build info: version: '3.2.0', revision: '8c03df6', time: '2017-03-02 09:34:51 -0800'
System info: host: 'HOST-NAME', ip: 'XXX.XXX.XXX.XXX', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '1.8.0_91'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities [{applicationCacheEnabled=false, rotatable=false, mobileEmulationEnabled=false, networkConnectionEnabled=false, chrome={chromedriverVersion=2.33.506120 (e3e53437346286c0bc2d2dc9aa4915ba81d9023f), userDataDir=C:\Users\UserName\AppData\Local\Temp\scoped_dir12272_29763}, takesHeapSnapshot=true, pageLoadStrategy=normal, databaseEnabled=false, handlesAlerts=true, hasTouchScreen=false, version=64.0.3282.119, platform=XP, browserConnectionEnabled=false, nativeEvents=true, acceptSslCerts=true, locationContextEnabled=true, webStorageEnabled=true, browserName=chrome, takesScreenshot=true, javascriptEnabled=true, cssSelectorsEnabled=true, setWindowRect=true, unexpectedAlertBehaviour=}]
Session ID: dc4cc63090d56769e1228ae1bf7b505c
*** Element info: {Using=id, value=agree}
Command duration or timeout: 0 milliseconds
it seems like in new core (DevicePool branch) we lost possibility to override mobile.* capabilities from settings from system variables. As result CI can't override such new capabilities/properties
subj
subj
We need to add "default" parameter to SpecialKeywords class.
api-tools classes can be included into the core sob-module: carina-api.
no need to have separate epo anymore
Hello
This is not a ticket. Just a question, since i didn't find where to ask questions.
When we configure Carina we need specify <selenium_host> property. Is there a chance to run a test on local selenium standalone specified in path? Or we always need make up hub?
P.S. As an improvement would be nice if you guys could do group on https://gitter.im/ and redirect there everybody, who has question, instead of creating tickets for question.
Thank you
When I choose device with Android version 6.0 or higher , Сarina initializes the wrong page , where set version 5.0 and 5.1.1 for example, although there are pages for each version
Test run link: https://ua.qaprosoft.com/zafira/#!/tests/runs/9432
Test with name "Dashboard graphs and summary labels - testGraphOfCaloriesYearly" shows artifacts and stacktrace for "Media Upload - testImageUpload".
Actually "Dashboard graphs and summary labels - testGraphOfCaloriesYearly" passed and "Media Upload - testImageUpload" failed
console_output.txt
test_logs.txt
it seems like it is a convenient tools for open-source community conversations.
please investigate how can we reuse it in our qa infrastructure
it seems like for 3rd party integrations like browserstack/saucelabs/amazon etc better to have separate DriverFactory.
So in additions to DesktopFactory and MobileFactory we can register BrowserstackFactory with functionality for this custom client.
The root cause: each tool use their own capabilities toolset which differs from default selenium/appium.
For example browserstack need:
device=value
when standard is
deviceName=value
carina-utils\src\main\java\com\qaprosoft\carina\core\foundation\log\ThreadLogAppender.java
carina-utils\src\main\resources\log4j.properties
NDC.push was located in carina-webdriver
carina-webdriver\src\main\java\com\qaprosoft\carina\core\foundation\webdriver\DriverPool.java
we wanna to have in console log infor about current device like
... [Motorola_Nexus_6] ....
Let's create in carina-commons or carina-utils file where we can collect some very-very high level static util methods.
And as 1st one move pause(long) and pause(double) into it from all ocurrences we have now
Need to log name for iPhone device to eTaf report
Sometimes we should execute test only on specific Android versions. For example we know that there are known automation limitations on Android versions <= 5.0.2, and some porblems on 5.1.1 but for 5.1 and 6+ everything is ok. To increase performance we can mark in annotation execution priority, or device os versions range, etc.
For example:
@SkipAndroidVersions("<5.1", "5.1.1")
@ExecutingPreorityOfAndroidVersions("7.0","6.0.1","7.1.1","6.0","5.1.1")
And in such case CI should try to execute this test first on first available device with os version 7.0, than if no such device - on 6.0.1 and so on. And skip all devices with os from Skip List. Postpond for availability any device from White list.
Similar thing can be used for iOS.
Current drag and drop method doesn't work for HTML5 web apps.
Solution that I found:
WebElement exercise = getExerciseItem(name).getElement(); // what to drag
WebElement dayBlock = getDayBlock(day).getElement(); // where drop
Actions act = new Actions(getDriver());
Action drag = act.clickAndHold(exercise).build();
drag.perform();
Point coordinates = dayBlock.getLocation();
Robot robot = new Robot();
robot.mouseMove(coordinates.getX()+20,coordinates.getY()-20);
pause(5000);
Refactor core and remove TestNamingUtil and XMLNameStrategy classes.
Name of the current test should be "calculated" in single place. Let's analyze if it is possible to do in ReportContext class where we save file for logging.
private static final ThreadLocal testDirectory = new ThreadLocal ();
we shouldn't import carina-webdriver sub-module from carina-api.
HttpClient.setupProxy() could be moved into utils at all
DriverPool.restartDriver(true); is not working on selenium hub.
It would be useful if we can get actual screenshots exactly on failing step, not only on ExtendedWebElement and TestListener events.
For example: if I have try/finally logic with some assertions in try{...} block and some actions in finally{...} block, and one assertion fails in try{...} - I'll get screenshot on the last page of finally{...} block, which is not related to the failing reason. The same situation with exceptions.
analogue to present swipeUp()/swipeDown()
Hello.
I didn't know how to ask question except creating ticket...maybe it is a stupid Q, but how i identify what last version STABLE version i can pull from Nexus?
there is standard fullReset capability which guarantee that app is uninstalled completely and cache is cleaned. Using this capability we can successfully override custom install/uninstall logic using direct adb calls (already removed from carina).
But negative aspect in this capability is that based on driver_mode we always reinstall application on the same device.
To minimize copy operation I proposed to add new capability:
-fullResetBeforeSuite
if it is true MobileCapabilityMatcher:
As result we will clean app/cache only at once during test suite start.
page source + screenshots are needed for UI Automator Viewer to be able to identify controls, their placement, id, xpath etc.
So after executing test in debug mode I'd like to have functionality which:
From time-to-time selenium hub can't forward command to node (selenium or appium) and wait for 600+ seconds. Issue can be reproduced on any device. As result we "freeze" all the testing a lot.
Find a way to determine lost node without waiting 600+ seconds.
sync all properties with actual status. some of them were removed in the current core generation
During aws s3 manager initialization we can't provide encrypted key/id values.
Method tap() has been already implemented in MobileUtils
Test names sometimes contain 'null'. Carina - 5.2.2.256-SNAPSHOT
12:04:45 2017-12-27 04:04:50 ZafiraConfigurator [TestNG] [ERROR] [iPhone_6_1] TestRail API returned HTTP 500("Invalid characters in URI: [/api/v2/get_case/30739,1780576]")
12:04:45 com.qaprosoft.carina.core.foundation.report.testrail.core.APIException: TestRail API returned HTTP 500("Invalid characters in URI: [/api/v2/get_case/30739,1780576]")
12:04:45 at com.qaprosoft.carina.core.foundation.report.testrail.core.APIClient.sendRequest(APIClient.java:245)
12:04:45 at com.qaprosoft.carina.core.foundation.report.testrail.core.APIClient.sendGet(APIClient.java:89)
12:04:45 at com.uashop.autotest.refactored.util.testng.TestRailZafiraConfigurator.getTestRailTestCaseName(TestRailZafiraConfigurator.java:53)
12:04:45 at com.uashop.autotest.refactored.util.testng.TestRailZafiraConfigurator.getTestName(TestRailZafiraConfigurator.java:27)
12:04:45 at com.qaprosoft.zafira.listener.ZafiraListener.run(ZafiraListener.java:494)
12:04:45 at sun.reflect.GeneratedMethodAccessor91.invoke(Unknown Source)
12:04:45 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
12:04:45 at java.lang.reflect.Method.invoke(Method.java:497)
12:04:45 at org.testng.internal.MethodInvocationHelper.invokeHookable(MethodInvocationHelper.java:212)
12:04:45 at org.testng.internal.Invoker.invokeMethod(Invoker.java:707)
12:04:45 at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901)
12:04:45 at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231)
12:04:45 at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)
12:04:45 at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
12:04:45 at org.testng.TestRunner.privateRun(TestRunner.java:767)
12:04:45 at org.testng.TestRunner.run(TestRunner.java:617)
12:04:45 at org.testng.SuiteRunner.runTest(SuiteRunner.java:348)
12:04:45 at org.testng.SuiteRunner.access$000(SuiteRunner.java:38)
12:04:45 at org.testng.SuiteRunner$SuiteWorker.run(SuiteRunner.java:382)
12:04:45 at org.testng.internal.thread.ThreadUtil$2.call(ThreadUtil.java:64)
12:04:45 at java.util.concurrent.FutureTask.run(FutureTask.java:266)
12:04:45 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
12:04:45 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
12:04:45 at java.lang.Thread.run(Thread.java:745)
We can use following:
formater.zip
But we should find solution how to add comment ignoring to skip it formatting.
We have to find a way to determine again current device name for the test to add it as part of logger message.
Root cause why such feature was disabled is that DevicePool from carina-webdriver module is not available in carina-reporting for ThreadLogAppender
Logs:
2017-11-22` 11:53:29] [AuthService.java] [23] [INFO] Check user status for registration: mfpauto61
[2017-11-22 11:53:29] [AuthService.java] [23] [INFO] identified free user: mfpauto61
[2017-11-22 11:54:59] [DriverPool.java] [23] [ERROR] Driver initialization 'default' FAILED for selenium: null! Retry 1 of 1 time - Unable to create new remote session. desired capabilities = Capabilities [{app=/opt/apk/myfitnesspal-develop-10593-qa-release.apk, noSign=true, newCommandTimeout=180, STF_ENABLED=true, autoGrantPermissions=true, platformName=Android, deviceName=ANY}], required capabilities = Capabilities [{}]
Build info: version: '3.4.0', revision: 'unknown', time: 'unknown'
System info: host: 'e8ac6c32c60b', ip: '172.18.0.43', os.name: 'Linux', os.arch: 'amd64', os.version: '4.4.0-98-generic', java.version: '1.8.0_131'
Driver info: driver.version: AndroidDriver
[2017-11-22 11:55:09] [BaseMobileTest.java] [23] [ERROR] Attempt #0 failed:org.openqa.selenium.SessionNotCreatedException: Unable to create new remote session. desired capabilities = Capabilities [{app=/opt/apk/myfitnesspal-develop-10593-qa-release.apk, noSign=true, newCommandTimeout=180, STF_ENABLED=true, autoGrantPermissions=true, platformName=Android, deviceName=ANY}], required capabilities = Capabilities [{}]
Build info: version: '3.4.0', revision: 'unknown', time: 'unknown'
System info: host: 'e8ac6c32c60b', ip: '172.18.0.43', os.name: 'Linux', os.arch: 'amd64', os.version: '4.4.0-98-generic', java.version: '1.8.0_131'
Driver info: driver.version: AndroidDriver
[2017-11-22 11:55:37] [Device.java] [23] [INFO] adb connect ua.qaprosoft.com:7752
[2017-11-22 11:55:38] [DevicePool.java] [23] [INFO] register device fot current thread id: 23; device: 'Samsung_Galaxy_S8_Plus'
[2017-11-22 11:55:39] [DriverPool.java] [23] [ERROR] Driver initialization 'default' FAILED for selenium: null! Retry 1 of 1 time - null
[2017-11-22 11:55:49] [TestNamingUtil.java] [23] [WARN] Unable to find registered test name for threadId: 23. stack is null!
[2017-11-22 11:55:49] [TestNamingUtil.java] [23] [WARN] Unable to find registered test name for threadId: 23. stack is null!
[2017-11-22 11:55:49] [Messager.java] [23] [INFO]
======================================================================================================================================
INFO: TEST [C16500 Favorites Lists - createRecipe] STARTED at [23:55:49 2017-11-22]
[2017-11-22 11:55:49] [ZafiraConfigurator.java] [23] [WARN] Unable to detect current device for threadId: 23
[2017-11-22 11:55:49] [Messager.java] [23] [INFO]
INFO: TEST [C16500 Favorites Lists - createRecipe] SKIPPED at [23:55:49 2017-11-22] - java.lang.NullPointerException
com.qaprosoft.carina.core.foundation.webdriver.DriverPool.createDriver(DriverPool.java:317)
com.qaprosoft.carina.core.foundation.webdriver.DriverPool.restartDriver(DriverPool.java:188)
com.qaprosoft.carina.core.foundation.webdriver.DriverPool.restartDriver(DriverPool.java:152)
com.myfitnesspal.android.autotest.test.BaseMobileTest.login(BaseMobileTest.java:107)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:498)
org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84)
org.testng.internal.Invoker.invokeConfigurationMethod(Invoker.java:564)
org.testng.internal.Invoker.invokeConfigurations(Invoker.java:213)
org.testng.internal.Invoker.invokeConfigurations(Invoker.java:138)
org.testng.internal.TestMethodWorker.invokeBeforeClassMethods(TestMethodWorker.java:175)
org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:107)
org.testng.TestRunner.privateRun(TestRunner.java:767)
org.testng.TestRunner.run(TestRunner.java:617)
org.testng.SuiteRunner.runTest(SuiteRunner.java:348)
org.testng.SuiteRunner.access$000(SuiteRunner.java:38)
org.testng.SuiteRunner$SuiteWorker.run(SuiteRunner.java:382)
org.testng.internal.thread.ThreadUtil$2.call(ThreadUtil.java:64)
java.util.concurrent.FutureTask.run(FutureTask.java:266)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
java.lang.Thread.run(Thread.java:748)
Need investigate and found a reason of pause of 10-13 seconds after tests execution.
Pay attention to the timestamp between two first lines
2017-09-17 18:20:54 AbstractTest [main] [DEBUG]Short suite file name: debug.xml
2017-09-17 18:21:11 Messager [main] [INFO]INFO: '**************** Test execution summary ****************'.
2017-09-17 18:21:11 Messager [main] [INFO]RESULT #1: TEST [User profile test - addFollowers] PASS [log=file://L:\smule\smule-qa.\reports\qa\1505661650340/User_profile_test_-_addFollowers/test.log]
before adding capability value to the desired capabilities list do extra verification.
if it is equals true or fals as string we should convert it to boolean.
it is required to be able to use vnc and video capturing with selenoid. It can't correctly resolve
enableVideo=true if it is provided as a string
take a look and finish required steps: https://github.com/qaprosoft/carina/community
After refactoring logging module we have only two outstanding logs which are not available from email or zafira directly.
This is before suite and after suite logic. I wanna to have two separate steps for that to be able to open and review them via email/zafira
If we use description format in tag Test like (description = "JIRA#") we are getting exception which caused test run terminating on Jenkins.
From the logs:
INFO: TEST [Test] FAILED at [21:35:40 2017-11-14] - 1
com.qaprosoft.carina.core.foundation.jira.Jira.getTickets(Jira.java:133)
com.qaprosoft.carina.core.foundation.listeners.AbstractTestListener.createTestResult(AbstractTestListener.java:603)
com.qaprosoft.carina.core.foundation.listeners.AbstractTestListener.passItem(AbstractTestListener.java:83)
com.qaprosoft.carina.core.foundation.listeners.AbstractTestListener.onTestSuccess(AbstractTestListener.java:342)
org.testng.internal.Invoker.runTestListeners(Invoker.java:1899)
org.testng.internal.Invoker.runTestListeners(Invoker.java:1879)
org.testng.internal.Invoker.invokeMethod(Invoker.java:778)
org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901)
org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231)
org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)
org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
java.lang.Thread.run(Thread.java:745)
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.