因為工作原因,使用的編程語言都是C#,但是國內相應的Appium資料少得可憐,Java版本的Appium也考慮過,但是奈何自己搞不定Eclipse這個編譯環境【說白了就是因為懶……
無意中看到了外面的世界,然后發現國外的相關資料還是很多的,那還說啥?趕緊的,擼起袖子就是干。
前置條件:APPIUM環境搭建,Windows環境下的搭建教程還是很多的,按照教程操作就可以了。
測試環境:Visual Studio 2015+Genymotion模擬器+Custome Phone 6.0.0
源碼下載地址:https://github.com/appium/appium-dot-exe
源碼下載后先設置VS能自動去下載對應的Nuget包,更新的時候有條件的還是可以掛點什么東西,原因你懂的。更新完對應的Nuget包,該關聯的引用也都關聯上了,報的錯也就自行消失了。
C#下的Appium框架實際上WPF格式的WinForm應用程序,具體的啟動過程以及原理可以參考:http://www.cnblogs.com/oscarxie/p/6678142.html,但是這個不是今天的重點

順帶真的想吐槽筆記本小屏幕還要強行追求1920*1080的高分辨率,強行放大字體后截圖看起來感覺怪怪的,調低分辨率就是滿屏幕的馬賽克……
我們先來看一段GitHub上的示范代碼,這段代碼的功能是設置Appium的相關參數,對Windows自帶的計算器功能進行測試,測試結果則是調用了Nunit單元測試中的斷言功能進行判斷:
public class BasicScenarios { protected const string WindowsApplicationDriverUrl = "http://127.0.0.1:4723/wd/hub"; protected static RemoteWebDriver CalculatorSession; protected static RemoteWebElement CalculatorResult; protected static string OriginalCalculatorMode; [ClassInitialize] public static void Setup(TestContext context) { // Launch the calculator app DesiredCapabilities appCapabilities = new DesiredCapabilities(); appCapabilities.SetCapability("app", "Microsoft.WindowsCalculator_8wekyb3d8bbwe!App"); appCapabilities.SetCapability("platformName", "Windows"); appCapabilities.SetCapability("deviceName", "WindowsPC"); CalculatorSession = new RemoteWebDriver(new Uri(WindowsApplicationDriverUrl), appCapabilities); Assert.IsNotNull(CalculatorSession); CalculatorSession.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(2)); // Make sure we're in standard mode CalculatorSession.FindElementByXPath("//Button[starts-with(@Name, \"Menu\")]").Click(); OriginalCalculatorMode = CalculatorSession.FindElementByXPath("//List[@AutomationId=\"FlyoutNav\"]//ListItem[@IsSelected=\"True\"]").Text; CalculatorSession.FindElementByXPath("//ListItem[@Name=\"Standard Calculator\"]").Click(); // Use series of operation to locate the calculator result text element as a workaround // We currently cannot query element by automationId without using modified appium dot net driver // TODO: Use a proper appium/webdriver nuget package that allow us to query based on automationId CalculatorSession.FindElementByXPath("//Button[@Name=\"Clear\"]").Click(); CalculatorSession.FindElementByXPath("//Button[@Name=\"Seven\"]").Click(); CalculatorResult = CalculatorSession.FindElementByName("Display is 7 ") as RemoteWebElement; Assert.IsNotNull(CalculatorResult); } [ClassCleanup] public static void TearDown() { // Restore original mode before closing down CalculatorSession.FindElementByXPath("//Button[starts-with(@Name, \"Menu\")]").Click(); CalculatorSession.FindElementByXPath("//ListItem[@Name=\"" + OriginalCalculatorMode + "\"]").Click(); CalculatorResult = null; CalculatorSession.Dispose(); CalculatorSession = null; } [TestInitialize] public void Clear() { CalculatorSession.FindElementByName("Clear").Click(); Assert.AreEqual("Display is 0 ", CalculatorResult.Text); } [TestMethod] public void Addition() { CalculatorSession.FindElementByName("One").Click(); CalculatorSession.FindElementByName("Plus").Click(); CalculatorSession.FindElementByName("Seven").Click(); CalculatorSession.FindElementByName("Equals").Click(); Assert.AreEqual("Display is 8 ", CalculatorResult.Text); } }
從上面的代碼我們可以得出,C#下的Appium可以分為以下三個步驟:
1.實例化DesiredCapabilities類並調用SetCapability方法設置對應的一些參數,對應的參數設置可以參考Java版的設置:
appCapabilities.setappCapabilitiesability("automationName", "Appium");//appium做自動化 //appCapabilities.setappCapabilitiesability("app", "C:\\software\\jrtt.apk");//安裝apk //appCapabilities.setappCapabilitiesability("browserName", "chrome");//設置HTML5的自動化,打開谷歌瀏覽器 appCapabilities.setappCapabilitiesability("deviceName", "S4");//設備名稱 appCapabilities.setappCapabilitiesability("platformName", "Android"); //安卓自動化還是IOS自動化 appCapabilities.setappCapabilitiesability("platformVersion", "4.4"); //安卓操作系統版本 appCapabilities.setappCapabilitiesability("udid", "192.168.56.101:5555"); //設備的udid (adb devices 查看到的) appCapabilities.setappCapabilitiesability("appPackage","com.android.calculator2");//被測app的包名 appCapabilities.setappCapabilitiesability("appActivity",".Calculator");//被測app的入口Activity名稱 appCapabilities.setappCapabilitiesability("unicodeKeyboard", "True"); //支持中文輸入 appCapabilities.setappCapabilitiesability("resetKeyboard", "True"); //支持中文輸入,必須兩條都配置 appCapabilities.setappCapabilitiesability("noSign", "True"); //不重新簽名apk appCapabilities.setappCapabilitiesability("newCommandTimeout", "30");
2.設置Appium的服務地址:具體的服務地址是在Appium中進行設置的,同時連接手機,我們把設置好的地址復制過來就可以了。
new RemoteWebDriver(new Uri("http://172.xx.xx.169:4723/wd/hub"), capabilities);
3.調用RemoteWebDriver的類下提供的元素定位方法進行元素定位,並對應為好的元素進行對應的操作:Appium提供了以下定位元素的方法(這里的具體語法和Java相比有點區別,需要注意下):
FindElement(By by); FindElementByClassName(string className); FindElementByCssSelector(string cssSelector); FindElementById(string id); FindElementByLinkText(string linkText); FindElementByName(string name); FindElementByPartialLinkText(string partialLinkText); FindElementByTagName(string tagName); FindElementByXPath(string xpath);
同時,Appium也提供了以下的操作:
bool Displayed { get; } //判斷元素是否存在 bool Enabled { get; } //判斷元素是否啟用 bool Selected { get; }//判斷元素是否被選中 Size Size { get; }//獲取元素的高度和寬度 string TagName { get; }//獲取元素的文本(不含空格) string Text { get; }//獲取指定屬性的值 void Clear();//清除元素內容 void Click();//點擊 string GetAttribute(string attributeName); string GetCssValue(string propertyName);//獲取CSS屬性的值 void SendKeys(string text);//將文本寫入元素 void Submit();//提交此元素到服務器
