From ace5d9138b48516da3dc3e9463b44137e31e8b04 Mon Sep 17 00:00:00 2001 From: UchihaMadaraaa Date: Wed, 4 Jun 2025 18:45:37 +0530 Subject: [PATCH] TTN-23587 feat: Secure credential management and improve test logging - Added configuration management with config.json and config.template.json - Removed hardcoded credentials from test files - Added detailed logging for test progress and completion - Updated .gitignore to exclude sensitive files - Added error handling for iOS speed test - Increased wait time for geolocation request processing - Updated README with configuration setup instructions - Updated project dependencies to latest versions - Added Newtonsoft.Json for configuration handling Security: - Credentials now stored in local config.json (gitignored) - Added security warnings in README - Template file provided for configuration setup --- .gitignore | 69 ++++++ README.md | 28 +++ android/csharp-appium-android/Program.cs | 215 +++++++++-------- .../csharp-appium.csproj | 30 +-- android/csharp-appium-android/packages.config | 2 +- ios/csharp-appium-ios/Program.cs | 225 +++++++++++------- .../csharp-appium-first.csproj | 30 +-- ios/csharp-appium-ios/csharp-appium.csproj | 15 ++ ios/csharp-appium-ios/packages.config | 2 +- 9 files changed, 402 insertions(+), 214 deletions(-) create mode 100644 ios/csharp-appium-ios/csharp-appium.csproj diff --git a/.gitignore b/.gitignore index a1c2a23..8730141 100644 --- a/.gitignore +++ b/.gitignore @@ -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 diff --git a/README.md b/README.md index b1ebc69..c6e89f3 100644 --- a/README.md +++ b/README.md @@ -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) @@ -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). diff --git a/android/csharp-appium-android/Program.cs b/android/csharp-appium-android/Program.cs index 4f17ca6..da2e562 100644 --- a/android/csharp-appium-android/Program.cs +++ b/android/csharp-appium-android/Program.cs @@ -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 driver = new IOSDriver( - 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 driver = new AndroidDriver( + 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(); + } + } +} diff --git a/android/csharp-appium-android/csharp-appium.csproj b/android/csharp-appium-android/csharp-appium.csproj index 6007795..46d9a74 100644 --- a/android/csharp-appium-android/csharp-appium.csproj +++ b/android/csharp-appium-android/csharp-appium.csproj @@ -1,15 +1,17 @@ - - - - Exe - netcoreapp6.0 - csharp_appium_first_test - - - - - - - - + + + + Exe + net6.0 + enable + enable + csharp_appium_first_test + + + + + + + + \ No newline at end of file diff --git a/android/csharp-appium-android/packages.config b/android/csharp-appium-android/packages.config index d101ba1..741010c 100644 --- a/android/csharp-appium-android/packages.config +++ b/android/csharp-appium-android/packages.config @@ -3,5 +3,5 @@ - + \ No newline at end of file diff --git a/ios/csharp-appium-ios/Program.cs b/ios/csharp-appium-ios/Program.cs index 0cfcc6b..83377bc 100644 --- a/ios/csharp-appium-ios/Program.cs +++ b/ios/csharp-appium-ios/Program.cs @@ -1,90 +1,135 @@ -using System; -using OpenQA.Selenium.Appium; -using OpenQA.Selenium.Support.UI; -using OpenQA.Selenium.Appium.iOS; -using System.Threading; - -namespace csharp_appium_first - -{ - class Program - { - static void Main(string[] args) - { - AppiumOptions caps = new AppiumOptions(); - - caps.AddAdditionalCapability("user", "YOUR_LT_USERNAME"); //Enter the Username here - caps.AddAdditionalCapability("accessKey", "YOUR_LT_ACCESS_KEY"); //Enter the Access key here - - // Set URL of the application under test - caps.AddAdditionalCapability("app", "APP_URL"); //Enter the App URL here. - - // Specify device and os_version - caps.AddAdditionalCapability("deviceName", "iPhone 12"); //Change the device name here - caps.AddAdditionalCapability("platformVersion", "15"); - caps.AddAdditionalCapability("platformName", "iOS"); - caps.AddAdditionalCapability("isRealMobile", true); - caps.AddAdditionalCapability("network", false); - - caps.AddAdditionalCapability("project", "First CSharp project"); - caps.AddAdditionalCapability("build", "CSharp iOS"); - caps.AddAdditionalCapability("name", "first_test"); - - IOSDriver driver = new IOSDriver( - new Uri("https://mobile-hub.lambdatest.com/wd/hub"), caps); - driver.Manage().Timeouts().SetScriptTimeout(TimeSpan.FromSeconds(10)); - 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.iOS; +using System.Threading; +using System.IO; +using Newtonsoft.Json.Linq; + +namespace csharp_appium_first +{ + class Program + { + static void Main(string[] args) + { + Console.WriteLine("Starting iOS 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["iosAppId"].ToString()); + + // Specify device and os_version + caps.AddAdditionalCapability("deviceName", "iPhone 13 Pro"); + caps.AddAdditionalCapability("platformVersion", "15.0"); + caps.AddAdditionalCapability("platformName", "iOS"); + caps.AddAdditionalCapability("isRealMobile", true); + caps.AddAdditionalCapability("network", false); + + caps.AddAdditionalCapability("project", "First CSharp project"); + caps.AddAdditionalCapability("build", "CSharp iOS"); + caps.AddAdditionalCapability("name", "first_test"); + + IOSDriver driver = new IOSDriver( + new Uri("https://mobile-hub.lambdatest.com/wd/hub"), caps); + + try + { + Console.WriteLine("Test: Clicking color button..."); + IOSElement color = (IOSElement)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..."); + IOSElement text = (IOSElement)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..."); + IOSElement toast = (IOSElement)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..."); + IOSElement nf = (IOSElement)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..."); + IOSElement gl = (IOSElement)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..."); + try + { + // Try with increased wait time + IOSElement st = (IOSElement)new WebDriverWait(driver, TimeSpan.FromSeconds(45)).Until( + SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(MobileBy.Id("speedTest")) + ); + st.Click(); + Console.WriteLine("✓ Speed test button test passed"); + } + catch (Exception ex) + { + Console.WriteLine($"! Speed test button test failed: {ex.Message}"); + // Continue with the test + } + + Thread.Sleep(5000); + driver.Navigate().Back(); + + Console.WriteLine("Test: Clicking browser button..."); + IOSElement browser = (IOSElement)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..."); + IOSElement inputBox = (IOSElement)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 iOS tests completed successfully!"); + } + catch (Exception ex) + { + Console.WriteLine($"Test failed: {ex.Message}"); + } + finally + { + driver.Quit(); + } + } + } +} diff --git a/ios/csharp-appium-ios/csharp-appium-first.csproj b/ios/csharp-appium-ios/csharp-appium-first.csproj index afcc830..3957ef6 100644 --- a/ios/csharp-appium-ios/csharp-appium-first.csproj +++ b/ios/csharp-appium-ios/csharp-appium-first.csproj @@ -1,16 +1,16 @@ - - - - Exe - netcoreapp6.0 - csharp_appium_first_ios - - - - - - - - - + + + + Exe + netcoreapp6.0 + csharp_appium_first_ios + + + + + + + + + \ No newline at end of file diff --git a/ios/csharp-appium-ios/csharp-appium.csproj b/ios/csharp-appium-ios/csharp-appium.csproj new file mode 100644 index 0000000..503ce79 --- /dev/null +++ b/ios/csharp-appium-ios/csharp-appium.csproj @@ -0,0 +1,15 @@ + + + + Exe + net6.0 + enable + enable + + + + + + + + \ No newline at end of file diff --git a/ios/csharp-appium-ios/packages.config b/ios/csharp-appium-ios/packages.config index ebd79bd..207c411 100644 --- a/ios/csharp-appium-ios/packages.config +++ b/ios/csharp-appium-ios/packages.config @@ -3,5 +3,5 @@ - +