appium / dotnet-client Goto Github PK
View Code? Open in Web Editor NEWExtension to the official Selenium dotnet webdriver
License: Apache License 2.0
Extension to the official Selenium dotnet webdriver
License: Apache License 2.0
The Appium command 'session/:sessionId?/appium/app/strings' has changed: appium/appium@af89c29
Now it's a POST command and allows an optional parameter language to get strings for a specific language.
[FindsBy(How = How.ClassName, Using = "UIATableView")]
public override IWebElement foo{ get; protected set; }
and
driver.FindElementByClassName("UIATableView");
both cause:
responding to client with error: {"status":9,"value":{"message":"Invalid locator strategy: css selector","origValue":"Invalid locator strategy: css selector"},"sessionId":"9717df13-5a24-4de7-a22e-f1d63c847fde"}
info: <-- POST /wd/hub/session/9717df13-5a24-4de7-a22e-f1d63c847fde/element 500 0.591 ms - 177
after updating to the latest .net appium driver 1.2.0.5 the above issue occured
Driver Version 1.4.0.2, Appium 1.4.0
For example, if x = 100 and y = 100, the following will result in tapping (100,100) then (200,200).
ITouchAction t = new TouchAction(driver)
.Tap(x, y)
.Wait(100)
.Tap(x, y);
t.Perform();
wd.js implementation can be found at admc/wd#333
The driver should expose a member to allow a client to perform swipes
Two methods needed, one to get
the network connection, the other to set
it.
The network connection is specified as a bitmask, the details of which are here. Feel free to make whatever structure would be idiomatic for the values.
Getting the connection (e.g., wd):
GET, /wd/hub/session/:sessionId?/network_connection
Setting the connection (e.g., wd):
POST, /wd/hub/session/:sessionId?/network_connection
with payload like "parameters": { "type": 1 }
@Astro03 , reusing Selenium TouchActions is more hindrance than help, in particular, some actions takes double parameters rather than int. Rather than scratching my head for hours, I am going to cut this dependency and write a custom TouchAction class. Have to think of a good name so that it is not confusing.
My intention is to take screenshot across different screens for my app, but the GetScreenshot() method is not working. I thought its a problem with my app but later on I tried with this sample app and the result is same. The byte array is empty in the screenshot object.
Appium Log: here
Appreciate your help.
The driver should expose members to allow a client to set the orientation of the device to portrait or landscape
To this end, the driver should implement the OpenQA.Selenium.IRotatable interface.
Hello!
I use new Webdriver 2.46.0 and I'm getting null reference exception in AppiumDriver.cs:
dynMethod.Invoke(CommandInfoRepository.Instance, new object[] { entry.Command, commandInfo });
Because this line returns null
var dynMethod = typeof(CommandInfoRepository).GetMethod("TryAddAdditionalCommand", BindingFlags.NonPublic | BindingFlags.Instance);
I've found that in new Selenium version 'TryAddAdditionalCommand' method in CommandInfoRepository was renamed to 'TryAddCommand' and was made public (https://raw.githubusercontent.com/SeleniumHQ/selenium/master/dotnet/CHANGELOG)
2.45.0 source:
https://code.google.com/p/selenium/source/browse/dotnet/src/webdriver/Remote/CommandInfoRepository.cs?name=selenium-2.45.0
2.46.0 source:
https://github.com/SeleniumHQ/selenium/blob/master/dotnet/src/webdriver/Remote/CommandInfoRepository.cs
So this code fixes it:
var dynMethod = typeof(CommandInfoRepository).GetMethod("TryAddAdditionalCommand", BindingFlags.NonPublic | BindingFlags.Instance);
if (dynMethod == null)
{
dynMethod = typeof(CommandInfoRepository).GetMethod("TryAddCommand", BindingFlags.Public | BindingFlags.Instance);
}
If you don't mind I can submit pull request
WHYYYYY? Doest it have good alternatives?
In the latest version 1.2.0.8. I can't find the ToggleWifi and ToggleAirplaneMode. but the ToggleLocationServices is still there.
Do you change the way how to use it?
Is there anyone can explain this?
The driver should expose a member for tapping a location X and Y
Use Case: In an Android app, a user should be able to close the navigation drawer by tapping outside the drawer. When the drawer is opened, the only views that are accessible are the drawer itself and the action bar (the drawer can't be closed by tapping the action bar). Therefore, I can't use the method TouchActions.SingleTap(IWebElement) to tap outside the drawer.
The driver should expose a member to allow a client to get screenshots
To this end, the driver should implement the interface OpenQA.Selenium.ITakesScreenshot
Add methods to query and set the input method (IME) in Android (spec). Five methods are there:
GET
/wd/hub/session/:sessionId?/ime/available_engines
GET
/wd/hub/session/:sessionId?/ime/active_engine
true
)
GET
/wd/hub/session/:sessionId?/ime/activated
POST
/wd/hub/session/:sessionId?/ime/activate
POST
/wd/hub/session/:sessionId?/ime/deactivate
POST
to /wd/hub/session/:sessionId?/appium/device/open_notifications
with no data.
The version is still listed as v1.0, when it has been updated in the AssemblyInfo.cs, but not the Readme, changelog, or release section. I posted this at https://discuss.appium.io/t/appium-webdriver-1-2-0-1-for-dotnet/147/2 and was told to post an issue on the GitHub. :)
I am using the Appium Driver and can do things like changing to web/native context view.
However if i use multitouch I get the following could not load type of error:
Could not load type 'OpenQA.Selenium.Appium.MultiTouch.TouchAction' from assembly 'appium-dotnet-driver, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
Is there something I am missing? I have all the required dependencies:
If you were to use touch actions on elements such as the following:
// double tapping on element
new TouchAction(driver).
Tap(element, x, y, 2)
.Perform();
where element is derived from using pageobjects.. this results in the exception:
Additional information: Field 'elementId' defined on type 'OpenQA.Selenium.Remote.RemoteWebElement' is not a field on the target object which is of type 'OpenQA.Selenium.Appium.Android.AndroidElement'.
Seems to be a bug but is there a new way to interact w/ touch actions + page objects?
I initially created this issue with appium but it turns out to be dotnet client.
This issue is related to appium/appium#4310
new TouchAction(driver)
.Tap(point.X, point.Y, count: 2)
.Perform();
Here's the trace:
> info: --> POST /wd/hub/session/8d6776f8-b84f-4fb5-ba04-4237bef7ba74/touch/perform {"actions":[{"action":"press","options":{"x":540,"y":1050}},{"action":"wait","options":{"ms":50}},{"action":"release"},{"action":"wait","options":{"ms":100}},{"action":"press","options":{"x":540,"y":540}},{"action":"wait","options":{"ms":50}},{"action":"release"}]}
> info: <-- POST /wd/hub/session/8d6776f8-b84f-4fb5-ba04-4237bef7ba74/touch/perform 500 0.804 ms - 97
> at Array.filter (native)
> at Function._.filter._.select (C:\Workspace\appium\node_modules\underscore\underscore.js:173:65)
> at _.(anonymous function) [as filter] (C:\Workspace\appium\node_modules\underscore\underscore.js:1178:39)
> at null.<anonymous> (C:\Workspace\appium\lib\devices\android\android-controller.js:912:47)
> at androidController.performTouch (C:\Workspace\appium\lib\devices\android\android-controller.js:990:5)
> at Object.exports.performTouch [as handle] (C:\Workspace\appium\lib\server\controller.js:331:14)
> at next_layer (C:\Workspace\appium\node_modules\express\lib\router\route.js:113:13)
> at Route.dispatch (C:\Workspace\appium\node_modules\express\lib\router\route.js:117:5)
> at C:\Workspace\appium\node_modules\express\lib\router\index.js:222:24
NOTE: The {"action":"press","options":{"x":540,"y":540}} looks very suspicious as the "y" I am expecting it to be 1050
Hi,
I have problem with APPIUM C# client and Appium server. Before I used for testing Appium Python client and everything was OK. But now I switched on C# client.
When i'm trying create Appium WebDriver I get always this error -
New-Object : Exception calling ".ctor" with "2" argument(s): "The HTTP request
to the remote WebDriver server for URL http://127.0.0.1:4723/wd/hub/session timed out after 60 seconds."
At C:\autolib\automation\lib\Cmdlets_Common\Appium.ps1:74 char:22 + return New-Object <<<< OpenQA.Selenium.Appium.AppiumDriver((New-Object u
ri($AppiumServerUri)), $capabilities) + CategoryInfo : InvalidOperation: (:) [New-Object], MethodInvoca
tionException + FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.Power
Shell.Commands.NewObjectCommand
This apk file has 12MB and test is running on virtual environment (WM) and on emulator, so It is possible that environment is slowed down that TimeOut 60 second for installation of APK is reached. But why didn't I have this same problem with python client and my most important question - it is possible to change this timeout?
thanks a lot
Hi
I am using
Ios automation
Appium dotnet driver: 1.2.0.8
C# bindings
Appium 1.3.7
public static AppiumDriver AdriverLocal;
AdriverLocal = new AppiumDriver (new Uri("http://10.XXX.XX.XXX:4723/wd/hub"), DCLocal);
execution of this second line throws error : instance of abstract class cannot be created,
Now when this is an abstract class.. how do i use the functions??
Couldnt find any documentation for this change.
Please Reply asap.
I tried the lock command and it did not lock the phone.
In our app, we have a sliding panel containing items that can be dragged and dropped into the main view. To test that functionality, we perform complex drag and drops using a start, mid, and end points.
This is a method we use when there is only one mid point:
public static void DragAndDrop(this AppiumDriver driver, Location start, Location midpoint, Location end)
{
if (driver == null) { throw new ArgumentNullException("driver"); }
if (start == null) { throw new ArgumentNullException("start"); }
if (midpoint == null) { throw new ArgumentNullException("midpoint"); }
if (end == null) { throw new ArgumentNullException("end"); }
ITouchAction action = new TouchAction(driver).Press(start.X, start.Y)
.Wait(ms: 2000)
.MoveTo(midpoint.X, midpoint.Y)
.MoveTo(end.X, end.Y)
.Release();
action.Perform();
}
The method does not behave as expected (with and without the call to ITouchAction.Wait). Looking at the screen when calling this method, it seems as if only the press and wait are being performed.
Appium does behave as expected when we don't need the midpoint and have only one call to ITouchAction.MoveTo.
Hi there!
I'm using code from examples;
ITouchAction touchAction = new TouchAction(driver)
.Press (startX, startY)
.Wait (duration)
.MoveTo (endX, endY)
.Release ();
touchAction.Perform();
And i'm getting 'System.NotImplementedException' here (this.Execute):
public void PerformTouchAction(TouchAction touchAction)
{
if (null == touchAction)
{
return; // do nothing
}
var parameters = new Dictionary<string, object>();
parameters.Add("actions", touchAction.GetParameters());
this.Execute(AppiumDriverCommand.TouchActionV2Perform, parameters);
}
What i'm doing wrong?
I just try to do some multiple action test. just like:
ITouchAction touch = new TouchAction(driver);
touch.Press(50, 50).Release().Perform();
but this test will pass in AppiumForWindows-1.2.4.1
Got Error:
An unhandled exception of type 'OpenQA.Selenium.WebDriverException' occurred in WebDriver.dll
Additional information: Unexpected error. ERROR running Appium command: Cannot read property 'element' of undefined
The JSON wire protocol supports setting the location. This driver have this command.
Java client contains interesting things like:
What if dotnet client would be the same?
Problem statement here - http://stackoverflow.com/questions/27807675/webdriverwait-is-not-working-c-appium
The README Example seems to be outdated. The class AppiumDriver is abstract.
The line from the example: "driver = new AppiumDriver(new Uri("http://127.0.0.1:4723/wd/hub"), capabilities); "
will not work anymore. You have to use AndroidDriver or IOSDriver to create a new driver instance.
Please update the example. The usage example in the class AppiumDriver seems to be outdated too.
SNIPPET CODE from example:
...
private AppiumDriver driver;
[TestFixtureSetUp]
public void beforeAll(){
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.SetCapability("deviceName", "iPhone Retina (4-inch 64-bit)");
capabilities.SetCapability("platformName", "iOS");
capabilities.SetCapability("platformVersion", "7.1");
capabilities.SetCapability("app", "<Path to your app>");
driver = new AppiumDriver(new Uri("http://127.0.0.1:4723/wd/hub"), capabilities);
}
...
These files contain regions that refer to MJsonMethod
, presumably an interface or base class, that doesn't appear to exist. This is confusing and should be removed.
Appium Version: 1.0.0
When I try to call KeyEvent with a string, it's throwing an error.
For example, driver.KeyEvent("66");
generates the following error:
debug: Appium request initiated at /wd/hub/session/77ea3a8a-c7b1-410b-b6fa-65ec29d89642/appium/device/keyevent
debug: Request received with params: {"keycode":"66"}
info: Pushing command to appium work queue: ["pressKeyCode",{"keycode":"66","metastate":null}]
info: [BOOTSTRAP] [info] Got data from client: {"cmd":"action","action":"pressKeyCode","params":{"keycode":"66","metastate":null}}
info: [BOOTSTRAP] [info] Got command of type ACTION
info: [BOOTSTRAP] [debug] Got command action: pressKeyCode
info: [BOOTSTRAP] [info] Returning result: {"value":"java.lang.String cannot becast to java.lang.Integer","status":13}
info: Responding to client with error: {"status":13,"value":{"message":"An unknown server-side error occurred while processing the command.","origValue":"java.lang.String cannot be cast to java.lang.Integer"},"sessionId":"77ea3a8a-c7b1-410b-b6fa-65ec29d89642"}
This method is referenced to in a test (https://github.com/appium/appium-dotnet-driver/blob/master/samples/IosComplexTest.cs#L126) but it doesn't exist?
Hi!
Seems like clicks for IOS devices are not working with latest Appium version:
{"status":13,"value":"ERROR running Appium command: invalid json, empty body"}
Request is /element/5003/click
with empty body.
The same click works if I use Java client.
Request is the same (/element/5003/click
) but the body is not empty: {"id":"5003"}
The client version is 1.2.0.8
When can we expect to have a new NuGet release (0.3)? We would like to use the new orientation endpoint, which is not available in 0.2.
/wd/hub/session/:sessionId?/appium/device/pull_folder
expects {path: String path}
Returns a zip file of the contents of the folder. base63 encoded.
I recently just upgraded to 1.2.0.7 and updated methods and interfaces in my code. Most things seem to work the same except HideKeyboard() crashes Appium whenever I try to use it. I noticed its trying to send a symbol for hiding the keyboard.
info: [debug] Socket data received (25 bytes)
info: [debug] Socket data being routed.
info: [debug] Got result from instruments: {"status":0,"value":""}
info: [debug] Responding to client with success: {"status":0,"value":"","sessionId":"edafd8d2-5357-499b-b33e-82b8bf3c9585"}
info: <-- POST /wd/hub/session/edafd8d2-5357-499b-b33e-82b8bf3c9585/element/28/value 200 3676.050 ms - 74 {"status":0,"value":"","sessionId":"edafd8d2-5357-499b-b33e-82b8bf3c9585"}
info: --> GET /wd/hub/session/edafd8d2-5357-499b-b33e-82b8bf3c9585/element/28/name {}
info: [debug] Pushing command to appium work queue: "au.getElement('28').type()"
info: [debug] Sending command to instruments: au.getElement('28').type()
info: [debug] [INST] 2015-01-08 15:48:04 +0000 Debug: evaluation finished
info: [debug] [INST] 2015-01-08 15:48:04 +0000 Debug: responding with:
info: [debug] [INST] 2015-01-08 15:48:04 +0000 Debug: Running system command #32: /usr/local/bin/node /usr/local/lib/node_modules/appium/node_modules/appium-uiauto/bin/command-proxy-client.js /tmp/instruments_sock 2,{"status":0,"value":""}...
info: [debug] [INST] 2015-01-08 15:48:05 +0000 Debug: Got new command 32 from instruments: au.getElement('28').type()
info: [debug] Socket data received (37 bytes)
info: [debug] Socket data being routed.
info: [debug] Got result from instruments: {"status":0,"value":"UIASearchBar"}
info: [debug] Responding to client with success: {"status":0,"value":"UIASearchBar","sessionId":"edafd8d2-5357-499b-b33e-82b8bf3c9585"}
info: <-- GET /wd/hub/session/edafd8d2-5357-499b-b33e-82b8bf3c9585/element/28/name 200 968.173 ms - 86 {"status":0,"value":"UIASearchBar","sessionId":"edafd8d2-5357-499b-b33e-82b8bf3c9585"}
info: --> POST /wd/hub/session/edafd8d2-5357-499b-b33e-82b8bf3c9585/element/28/value {"value":[""],"keysToSend":[""]}
info: [debug] Pushing command to appium work queue: "au.getElement('28').setValueByType('')"
info: [debug] Sending command to instruments: au.getElement('28').setValueByType('')
info: [debug] [INST] 2015-01-08 15:48:05 +0000 Debug: evaluating au.getElement('28').type()
info: [debug] [INST] 2015-01-08 15:48:05 +0000 Debug: evaluation finished
info: [debug] [INST] 2015-01-08 15:48:05 +0000 Debug: responding with:
info: [debug] [INST] 2015-01-08 15:48:05 +0000 Debug: Running system command #33: /usr/local/bin/node /usr/local/lib/node_modules/appium/node_modules/appium-uiauto/bin/command-proxy-client.js /tmp/instruments_sock 2,{"status":0,"value":"UIASearchBar"}...
info: [debug] [INST] 2015-01-08 15:48:06 +0000 Debug: Got new command 33 from instruments: au.getElement('28').setValueByType('')
info: [debug] [INST] 2015-01-08 15:48:06 +0000 Debug: evaluating au.getElement('28').setValueByType('')
info: [debug] Socket data received (25 bytes)
info: [debug] Socket data being routed.
info: [debug] Got result from instruments: {"status":0,"value":""}
info: [debug] Responding to client with success: {"status":0,"value":"","sessionId":"edafd8d2-5357-499b-b33e-82b8bf3c9585"}
info: <-- POST /wd/hub/session/edafd8d2-5357-499b-b33e-82b8bf3c9585/element/28/value 200 1501.082 ms - 74 {"status":0,"value":"","sessionId":"edafd8d2-5357-499b-b33e-82b8bf3c9585"}
Nuget lists the most recent version of the driver as 1.2.0.1. README and release notes list the version as 1.0.0. One of them is wrong and should be updated.
Hi
Following is my scenario:
We have web interface for which we had automation in selenium and C#(MS Test-Specflow).
We have one iOS app for which we have written automation using appium + capabilities for iPad app.
We are running automation from windows machine and with help of remote execution talking with appium server on Mac machine.
Now in one of the scenario we need to click on button in web site which is launching that iOS app. This happens only if web site is open from iPad and safari browser. Once that app opened on UI user have to do some actions then at the end app will create one PDF and close that app, and application switches back to web interface with that PDF showing in UI.
How to swiitch between safari browser and iOS app interface to automate this scenario.
Ex. Suppose In Gmail site there is one button to open Whatsapp. If user clicks on button whatsapp gets open. Then user perform action say send message to particular contact and once action is successful then system redirects user to gmail site.
How to automate such scenario.
The StartActivity does not work in AppiumForWindows-1.2.4.1. when the new version will be release?
Please explain me how install that drivers step by step, of course, if you have enough free time.
I try to build that solution, but don't get .exe - file . What do I do wrong?
This issue is spawned from appium/appium#4581
Log from appium server
info: --> POST /wd/hub/session//element {"using":"xpath","value":"//*[@resource-id='com.pof.android:id/thetitle']", "locator":"xpath"}
There are occasions when the a request is sent to server with malformed URL. Has anyone seen this issue?
I'm trying to fill this form and then click the 'Done' button. It is working fine in portrait orientation but I'm having trouble in landscape. The driver not able to find the 'SERVER NICKNAME' field in landscape mode. This field initially remain hidden behind the keyboard and then once I make the first keyboard hide call after adding the 'admin' user name I can see the 'SERVER NICKNAME' field in the screen. But driver not able to find it.
// add server url
var serverUrl = webDriverWait.Until(d => d.FindElement(By.XPath("//android.widget.EditText[@resource-id='workplace.xxx:id/editconnection_server_url']")));
serverUrl.SendKeys("http:localhost");
// add user name
var userName = webDriverWait.Until(d => d.FindElement(By.XPath("//android.widget.EditText[@resource-id='workplace.xxx:id/editconnection_username']")));
userName.SendKeys("admin");
// hide keyboard
driver.HideKeyboard();
// add server nickname
// driver not able to find this element in landscape mode after keyboard hide
var serverNickName = webDriverWait.Until(d => d.FindElement(By.XPath("//android.widget.EditText[@resource-id='workplace.xxx:id/editconnection_server_nickname']")));
serverNickName.SendKeys("99 server");
// hide the keyboard
driver.HideKeyboard();
// click on Done button
var doneButton = webDriverWait.Until(d => d.FindElement(By.XPath("//android.widget.Button[@resource-id='workplace.xxx:id/editconnection_done']")));
doneButton.Click();
Is there any way to do driver context refresh? Thanks for looking into it and appreciate your help.
I use Appium server running on Mac machine and AppiumDriver with c# bindings to execute tests from Windows machine. The issue is that when I create an instance of AndroidDriver its ctor rises a NullReferenceException. When I create an instance of RemoteWebDriver, it works smoothly. This is my code:
var caps = new DesiredCapabilities();
caps.SetCapability(MobileCapabilityType.DeviceName, "a0d86205");
caps.SetCapability("udid", "a0d86205");
caps.SetCapability(MobileCapabilityType.App, "https://valid/path/to/my.apk");
caps.SetCapability(MobileCapabilityType.PlatformName, MobilePlatform.Android);
var drv = new AndroidDriver(ServerUri, caps) // rises exception
// var drv = new RemoteWebDriver(ServerUri, caps) // works smoothly
Exception:
System.NullReferenceException : Object reference not set to an instance of an object.
Result StackTrace:
at OpenQA.Selenium.Appium.AppiumDriver._AddAppiumCommands()
at OpenQA.Selenium.Appium.AppiumDriver..ctor(Uri remoteAddress, ICapabilities desiredCapabilities)
at OpenQA.Selenium.Appium.Android.AndroidDriver..ctor(Uri remoteAddress, DesiredCapabilities desiredCapabilities)
Most recent server responce
info: [debug] Responding to client with success: {"status":0,"value":{"platform":"LINUX","browserName":"Android","platformVersion":"5.0.1","webStorageEnabled":false,"takesScreenshot":true,"javascriptEnabled":true,"databaseEnabled":false,"networkConnectionEnabled":true,"locationContextEnabled":false,"warnings":{},"desired":{"udid":"a0d86205","deviceName":"a0d86205","platformName":"Android","app":"https://valid/path/to/my.apk"},"udid":"a0d86205","deviceName":"a0d86205","platformName":"Android","app":"https://valid/path/to/my.apk"},"sessionId":"9536382e-a320-4d8b-b8cd-3afdd4c0bd68"}
info: <-- GET /wd/hub/session/9536382e-a320-4d8b-b8cd-3afdd4c0bd68 200 0.702 ms - 641 {"status":0,"value":{"platform":"LINUX","browserName":"Android","platformVersion":"5.0.1","webStorageEnabled":false,"takesScreenshot":true,"javascriptEnabled":true,"databaseEnabled":false,"networkConnectionEnabled":true,"locationContextEnabled":false,"warnings":{},"desired":{"udid":"a0d86205","deviceName":"a0d86205","platformName":"Android","app":"https://valid/path/to/my.apk"},"udid":"a0d86205","deviceName":"a0d86205","platformName":"Android","app":"https://valid/path/to/my.apk"},"sessionId":"9536382e-a320-4d8b-b8cd-3afdd4c0bd68"}
Where am I wrong? Why the constructor of AndroidDriver rises this execption and doesn't specify the reason?
@Astro03 , and others, could you post here what methods you are implementing, so we don't do the same job twice.
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.