Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 69 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,72 @@

# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*

# Visual Studio files
.vs/
*.user
*.userosscache
*.suo
*.userprefs
*.dbmdl
*.jfm

# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/

# Visual Studio Code
.vscode/
*.code-workspace

# Rider
.idea/
*.sln.iml

# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates

# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/

# Credentials and sensitive data
*credentials*.json
*config*.json
*secrets*.json
*appsettings*.json
*compatibility_matrix*.json

# Logs
*.log
logs/
log/

# OS generated files
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db
28 changes: 28 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
## Table of Contents

* [Pre-requisites](#pre-requisites)
* [Configuration Setup](#configuration-setup)
* [Run Your First Test](#run-your-first-test)
* [Executing The Tests](#executing-the-tests)

Expand All @@ -45,6 +46,33 @@ Before you can start performing App automation testing with Appium, you have to

- Open the Android/iOS project using the file with a .sln extension.

## Configuration Setup

The project uses a configuration file to manage sensitive information like LambdaTest credentials and app IDs. Follow these steps to set up your configuration:

1. Locate the `config.template.json` file in the root directory
2. Create a new file named `config.json` by copying the template:
```bash
cp config.template.json config.json
```
3. Edit `config.json` and fill in your credentials:
```json
{
"lambdatest": {
"username": "YOUR_LAMBDATEST_USERNAME",
"accessKey": "YOUR_LAMBDATEST_ACCESS_KEY",
"androidAppId": "YOUR_ANDROID_APP_ID",
"iosAppId": "YOUR_IOS_APP_ID"
}
}
```

⚠️ **Important Security Notes:**
- The `config.json` file contains sensitive information and should NEVER be committed to version control
- The file is already included in `.gitignore` to prevent accidental commits
- Keep your credentials secure and do not share them publicly
- If you accidentally commit credentials, rotate them immediately

### Setting Up Your Authentication

Make sure you have your LambdaTest credentials with you to run test automation scripts on LambdaTest. To obtain your access credentials, [purchase a plan](https://billing.lambdatest.com/billing/plans) or access the [Automation Dashboard](https://appautomation.lambdatest.com/?utm_source=github&utm_medium=repo&utm_campaign=LT-appium-CSharp).
Expand Down
215 changes: 122 additions & 93 deletions android/csharp-appium-android/Program.cs
Original file line number Diff line number Diff line change
@@ -1,93 +1,122 @@
using System;
using OpenQA.Selenium.Appium;
using OpenQA.Selenium.Support.UI;
using OpenQA.Selenium.Appium.iOS;
using System.Threading;

namespace csharp_appium

{
class Program
{
static void Main(string[] args)
{
AppiumOptions caps = new AppiumOptions();

caps.AddAdditionalCapability("user", "YOUR_LT_USERNAME"); //Add the LT Username
caps.AddAdditionalCapability("accessKey", "YOUR_LT_ACCESS_KEY"); //Add the LT Access key

// Set URL of the application under test
caps.AddAdditionalCapability("app", "APP_URL"); //Add the App ID

// Specify device and os_version
caps.AddAdditionalCapability("deviceName", "Galaxy S21 Ultra 5G"); //Add the Device Details
caps.AddAdditionalCapability("platformVersion", "11");
caps.AddAdditionalCapability("platformName", "Android");
caps.AddAdditionalCapability("isRealMobile", true);
caps.AddAdditionalCapability("network", false);

caps.AddAdditionalCapability("project", "CSharp Sample Android");
caps.AddAdditionalCapability("build", "CSharp Sample Android");
caps.AddAdditionalCapability("name", "CSharp Sample Android");

// Initialize the remote Webdriver using LambdaTest remote URL
// and desired capabilities defined above
IOSDriver<IOSElement> driver = new IOSDriver<IOSElement>(
new Uri("https://mobile-hub.lambdatest.com/wd/hub"), caps);
driver.Manage().Timeouts().SetScriptTimeout(TimeSpan.FromSeconds(10));
// Test case for the sample iOS app.
// If you have uploaded your app, update the test case here.
IOSElement color = (IOSElement)new WebDriverWait(driver, TimeSpan.FromSeconds(30)).Until(
SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(MobileBy.Id("color"))
);
color.Click();
color.Click();

IOSElement text = (IOSElement)new WebDriverWait(driver, TimeSpan.FromSeconds(30)).Until(
SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(MobileBy.Id("Text"))
);
text.Click();

IOSElement toast = (IOSElement)new WebDriverWait(driver, TimeSpan.FromSeconds(30)).Until(
SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(MobileBy.Id("toast"))
);
toast.Click();

IOSElement nf = (IOSElement)new WebDriverWait(driver, TimeSpan.FromSeconds(30)).Until(
SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(MobileBy.Id("notification"))
);
nf.Click();

IOSElement gl = (IOSElement)new WebDriverWait(driver, TimeSpan.FromSeconds(30)).Until(
SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(MobileBy.Id("geoLocation"))
);
gl.Click();

Thread.Sleep(5000);

driver.Navigate().Back();

IOSElement st = (IOSElement)new WebDriverWait(driver, TimeSpan.FromSeconds(30)).Until(
SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(MobileBy.Id("speedTest"))
);
st.Click();

Thread.Sleep(5000);

driver.Navigate().Back();

IOSElement browser = (IOSElement)new WebDriverWait(driver, TimeSpan.FromSeconds(30)).Until(
SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(MobileBy.AccessibilityId("Browser"))
);
browser.Click();

IOSElement inputBox = (IOSElement)new WebDriverWait(driver, TimeSpan.FromSeconds(30)).Until(
SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(MobileBy.Id("url"))
);
inputBox.Click();


driver.Quit();
}
}
}
using System;
using OpenQA.Selenium.Appium;
using OpenQA.Selenium.Support.UI;
using OpenQA.Selenium.Appium.Android;
using System.Threading;
using System.IO;
using Newtonsoft.Json.Linq;

namespace csharp_appium

{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Starting Android Test...");

// Load configuration
var configPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "..", "..", "..", "config.json");
if (!File.Exists(configPath))
{
throw new FileNotFoundException("config.json not found. Please create it from config.template.json");
}

var config = JObject.Parse(File.ReadAllText(configPath));
var ltConfig = config["lambdatest"];

AppiumOptions caps = new AppiumOptions();

caps.AddAdditionalCapability("user", ltConfig["username"].ToString());
caps.AddAdditionalCapability("accessKey", ltConfig["accessKey"].ToString());
caps.AddAdditionalCapability("app", ltConfig["androidAppId"].ToString());

// Specify device and os_version
caps.AddAdditionalCapability("deviceName", "Galaxy S20");
caps.AddAdditionalCapability("platformVersion", "11");
caps.AddAdditionalCapability("platformName", "Android");
caps.AddAdditionalCapability("isRealMobile", true);
caps.AddAdditionalCapability("network", false);

caps.AddAdditionalCapability("project", "CSharp Sample Android");
caps.AddAdditionalCapability("build", "CSharp Sample Android");
caps.AddAdditionalCapability("name", "CSharp Sample Android");

// Initialize the remote Webdriver using LambdaTest remote URL
// and desired capabilities defined above
AndroidDriver<AndroidElement> driver = new AndroidDriver<AndroidElement>(
new Uri("https://mobile-hub.lambdatest.com/wd/hub"), caps);

// Test case for the sample Android app.
// If you have uploaded your app, update the test case here.
Console.WriteLine("Test: Clicking color button...");
AndroidElement color = (AndroidElement)new WebDriverWait(driver, TimeSpan.FromSeconds(30)).Until(
SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(MobileBy.Id("color"))
);
color.Click();
color.Click();
Console.WriteLine("✓ Color button test passed");

Console.WriteLine("Test: Clicking text button...");
AndroidElement text = (AndroidElement)new WebDriverWait(driver, TimeSpan.FromSeconds(30)).Until(
SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(MobileBy.Id("Text"))
);
text.Click();
Console.WriteLine("✓ Text button test passed");

Console.WriteLine("Test: Clicking toast button...");
AndroidElement toast = (AndroidElement)new WebDriverWait(driver, TimeSpan.FromSeconds(30)).Until(
SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(MobileBy.Id("toast"))
);
toast.Click();
Console.WriteLine("✓ Toast button test passed");

Console.WriteLine("Test: Clicking notification button...");
AndroidElement nf = (AndroidElement)new WebDriverWait(driver, TimeSpan.FromSeconds(30)).Until(
SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(MobileBy.Id("notification"))
);
nf.Click();
Console.WriteLine("✓ Notification button test passed");

Console.WriteLine("Test: Clicking geolocation button...");
AndroidElement gl = (AndroidElement)new WebDriverWait(driver, TimeSpan.FromSeconds(30)).Until(
SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(MobileBy.Id("geoLocation"))
);
gl.Click();
Console.WriteLine("✓ Geolocation button test passed");

Console.WriteLine("Waiting for geolocation request to process...");
Thread.Sleep(10000); // Wait 10 seconds for geolocation request

driver.Navigate().Back();

Console.WriteLine("Test: Clicking speed test button...");
AndroidElement st = (AndroidElement)new WebDriverWait(driver, TimeSpan.FromSeconds(30)).Until(
SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(MobileBy.Id("speedTest"))
);
st.Click();
Console.WriteLine("✓ Speed test button test passed");

Thread.Sleep(5000);

driver.Navigate().Back();

Console.WriteLine("Test: Clicking browser button...");
AndroidElement browser = (AndroidElement)new WebDriverWait(driver, TimeSpan.FromSeconds(30)).Until(
SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(MobileBy.AccessibilityId("Browser"))
);
browser.Click();
Console.WriteLine("✓ Browser button test passed");

Console.WriteLine("Test: Clicking URL input box...");
AndroidElement inputBox = (AndroidElement)new WebDriverWait(driver, TimeSpan.FromSeconds(30)).Until(
SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(MobileBy.Id("url"))
);
inputBox.Click();
Console.WriteLine("✓ URL input box test passed");

Console.WriteLine("All Android tests completed successfully!");
driver.Quit();
}
}
}
30 changes: 16 additions & 14 deletions android/csharp-appium-android/csharp-appium.csproj
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp6.0</TargetFramework>
<RootNamespace>csharp_appium_first_test</RootNamespace>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Castle.Core" Version="4.4.1" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
<PackageReference Include="Appium.WebDriver" Version="4.1.1" />
<PackageReference Include="DotNetSeleniumExtras.WaitHelpers" Version="3.11.0" />
</ItemGroup>
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<RootNamespace>csharp_appium_first_test</RootNamespace>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Castle.Core" Version="4.4.1" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="Appium.WebDriver" Version="5.0.0" />
<PackageReference Include="DotNetSeleniumExtras.WaitHelpers" Version="3.11.0" />
</ItemGroup>
</Project>
2 changes: 1 addition & 1 deletion android/csharp-appium-android/packages.config
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@
<package id="Appium.WebDriver" version="4.1.1" targetFramework="net461" />
<package id="Castle.Core" version="4.4.1" targetFramework="net461" />
<package id="DotNetSeleniumExtras.WaitHelpers" version="3.11.0" targetFramework="net461" />
<package id="Newtonsoft.Json" version="12.0.3" targetFramework="net461" />
<package id="Newtonsoft.Json" version="13.0.3" targetFramework="net461" />
</packages>
Loading