基於C#的Appium自動化測試框架(Ⅰ):程序結構


因為工作原因,使用的編程語言都是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();//提交此元素到服務器

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM