51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1820|回复: 3
打印 上一主题 下一主题

[Appium] 基于C#的Appium自动化测试框架(I):程序结构

[复制链接]
  • TA的每日心情
    无聊
    2024-7-12 13:16
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]测试小兵

    跳转到指定楼层
    1#
    发表于 2017-6-20 10:41:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    因为工作原因,使用的编程语言都是C#,但是国内相应的Appium资料少得可怜,Java版本的Appium也考虑过,但是奈何自己搞不定Eclipse这个编译环境【说白了就是因为懒……
    无意中看到了外面的世界,然后发现国外的相关资料还是很多的,那还说啥?赶紧的,撸起袖子就是干。

    前置条件:APPIUM环境搭建,Windows环境下的搭建教程还是很多的,按照教程操作就可以了。

    测试环境:Visual Studio 2015+Genymotion模拟器+Custome Phone 6.0.0
    源码下载后先设置VS能自动去下载对应的Nuget包,更新的时候有条件的还是可以挂点什么东西,原因你懂的。更新完对应的Nuget包,该关联的引用也都关联上了,报的错也就自行消失了。
    C#下的Appium框架实际上WPF格式的WinForm应用程序,具体的启动过程以及原理可以参考:http://www.cnblogs.com/oscarxie/p/6678142.html,但是这个不是今天的重点
    顺带真的想吐槽笔记本小屏幕还要强行追求1920*1080的高分辨率,强行放大字体后截图看起来感觉怪怪的,调低分辨率就是满屏幕的马赛克……

    我们先来看一段GitHub上的示范代码,这段代码的功能是设置Appium的相关参数,对Windows自带的计算器功能进行测试,测试结果则是调用了Nunit单元测试中的断言功能进行判断:
    1. public class BasicScenarios
    2.     {
    3.         protected const string WindowsApplicationDriverUrl = "http://127.0.0.1:4723/wd/hub";
    4.         protected static RemoteWebDriver CalculatorSession;
    5.         protected static RemoteWebElement CalculatorResult;
    6.         protected static string OriginalCalculatorMode;

    7.         [ClassInitialize]
    8.         public static void Setup(TestContext context)
    9.         {
    10.             // Launch the calculator app
    11.             DesiredCapabilities appCapabilities = new DesiredCapabilities();
    12.             appCapabilities.SetCapability("app", "Microsoft.WindowsCalculator_8wekyb3d8bbwe!App");
    13.             appCapabilities.SetCapability("platformName", "Windows");
    14.             appCapabilities.SetCapability("deviceName", "WindowsPC");
    15.             CalculatorSession = new RemoteWebDriver(new Uri(WindowsApplicationDriverUrl), appCapabilities);
    16.             Assert.IsNotNull(CalculatorSession);
    17.             CalculatorSession.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(2));

    18.             // Make sure we're in standard mode
    19.             CalculatorSession.FindElementByXPath("//Button[starts-with(@Name, \"Menu\")]").Click();
    20.             OriginalCalculatorMode = CalculatorSession.FindElementByXPath("//List[@AutomationId=\"FlyoutNav\"]//ListItem[@IsSelected=\"True\"]").Text;
    21.             CalculatorSession.FindElementByXPath("//ListItem[@Name=\"Standard Calculator\"]").Click();

    22.             // Use series of operation to locate the calculator result text element as a workaround
    23.             // We currently cannot query element by automationId without using modified appium dot net driver
    24.             // TODO: Use a proper appium/webdriver nuget package that allow us to query based on automationId
    25.             CalculatorSession.FindElementByXPath("//Button[@Name=\"Clear\"]").Click();
    26.             CalculatorSession.FindElementByXPath("//Button[@Name=\"Seven\"]").Click();
    27.             CalculatorResult = CalculatorSession.FindElementByName("Display is  7 ") as RemoteWebElement;
    28.             Assert.IsNotNull(CalculatorResult);
    29.         }

    30.         [ClassCleanup]
    31.         public static void TearDown()
    32.         {
    33.             // Restore original mode before closing down
    34.             CalculatorSession.FindElementByXPath("//Button[starts-with(@Name, \"Menu\")]").Click();
    35.             CalculatorSession.FindElementByXPath("//ListItem[@Name=\"" + OriginalCalculatorMode + "\"]").Click();

    36.             CalculatorResult = null;
    37.             CalculatorSession.Dispose();
    38.             CalculatorSession = null;
    39.         }

    40.         [TestInitialize]
    41.         public void Clear()
    42.         {
    43.             CalculatorSession.FindElementByName("Clear").Click();
    44.             Assert.AreEqual("Display is  0 ", CalculatorResult.Text);
    45.         }

    46.         [TestMethod]
    47.         public void Addition()
    48.         {
    49.             CalculatorSession.FindElementByName("One").Click();
    50.             CalculatorSession.FindElementByName("Plus").Click();
    51.             CalculatorSession.FindElementByName("Seven").Click();
    52.             CalculatorSession.FindElementByName("Equals").Click();
    53.             Assert.AreEqual("Display is  8 ", CalculatorResult.Text);
    54.         }
    55. }
    复制代码
    从上面的代码我们可以得出,C#下的Appium可以分为以下三个步骤:
    1.实例化DesiredCapabilities类并调用SetCapability方法设置对应的一些参数,对应的参数设置可以参考Java版的设置:
    1. appCapabilities.setappCapabilitiesability("automationName", "Appium");//appium做自动化
    2. //appCapabilities.setappCapabilitiesability("app", "C:\\software\\jrtt.apk");//安装apk
    3. //appCapabilities.setappCapabilitiesability("browserName", "chrome");//设置HTML5的自动化,打开谷歌浏览器
    4.         appCapabilities.setappCapabilitiesability("deviceName", "S4");//设备名称
    5.         appCapabilities.setappCapabilitiesability("platformName", "Android"); //安卓自动化还是IOS自动化
    6.         appCapabilities.setappCapabilitiesability("platformVersion", "4.4"); //安卓操作系统版本
    7.         appCapabilities.setappCapabilitiesability("udid", "192.168.56.101:5555"); //设备的udid (adb devices 查看到的)
    8.         appCapabilities.setappCapabilitiesability("appPackage","com.android.calculator2");//被测app的包名
    9.         appCapabilities.setappCapabilitiesability("appActivity",".Calculator");//被测app的入口Activity名称
    10.         appCapabilities.setappCapabilitiesability("unicodeKeyboard", "True"); //支持中文输入
    11.         appCapabilities.setappCapabilitiesability("resetKeyboard", "True"); //支持中文输入,必须两条都配置
    12.         appCapabilities.setappCapabilitiesability("noSign", "True"); //不重新签名apk
    13.         appCapabilities.setappCapabilitiesability("newCommandTimeout", "30");
    复制代码

    2.设置Appium的服务地址:具体的服务地址是在Appium中进行设置的,同时连接手机,我们把设置好的地址复制过来就可以了。
    1. <span style="color: #0000ff">new</span> RemoteWebDriver(<span style="color: #0000ff">new</span> Uri(<span style="color: #800000">"</span><span style="color: #800000">http://172.xx.xx.169:4723/wd/hub</span><span style="color: #800000">"</span>), capabilities);
    复制代码

    3.调用RemoteWebDriver的类下提供的元素定位方法进行元素定位,并对应为好的元素进行对应的操作:Appium提供了以下定位元素的方法(这里的具体语法和Java相比有点区别,需要注意下):
    1. <span style="color: #000000">FindElement(By by);
    2. FindElementByClassName(</span><span style="color: #0000ff">string</span><span style="color: #000000"> className);
    3. FindElementByCssSelector(</span><span style="color: #0000ff">string</span><span style="color: #000000"> cssSelector);
    4. FindElementById(</span><span style="color: #0000ff">string</span><span style="color: #000000"> id);
    5. FindElementByLinkText(</span><span style="color: #0000ff">string</span><span style="color: #000000"> linkText);
    6. FindElementByName(</span><span style="color: #0000ff">string</span><span style="color: #000000"> name);
    7. FindElementByPartialLinkText(</span><span style="color: #0000ff">string</span><span style="color: #000000"> partialLinkText);
    8. FindElementByTagName(</span><span style="color: #0000ff">string</span><span style="color: #000000"> tagName);
    9. FindElementByXPath(</span><span style="color: #0000ff">string</span> xpath);
    复制代码

    同时,Appium也提供了以下的操作:
    1. <span style="color: #0000ff">bool</span> Displayed { <span style="color: #0000ff">get</span>; } <span style="color: #008000">//</span><span style="color: #008000">判断元素是否存在</span>
    2. <span style="color: #0000ff">bool</span> Enabled { <span style="color: #0000ff">get</span>; } <span style="color: #008000">//</span><span style="color: #008000">判断元素是否启用</span>
    3. <span style="color: #0000ff">bool</span> Selected { <span style="color: #0000ff">get</span>; }<span style="color: #008000">//</span><span style="color: #008000">判断元素是否被选中</span>
    4. Size Size { <span style="color: #0000ff">get</span>; }<span style="color: #008000">//</span><span style="color: #008000">获取元素的高度和宽度</span>
    5. <span style="color: #0000ff">string</span> TagName { <span style="color: #0000ff">get</span>; }<span style="color: #008000">//</span><span style="color: #008000">获取元素的文本(不含空格)</span>
    6. <span style="color: #0000ff">string</span> Text { <span style="color: #0000ff">get</span>; }<span style="color: #008000">//</span><span style="color: #008000">获取指定属性的值</span>
    7. <span style="color: #0000ff">void</span> Clear();<span style="color: #008000">//</span><span style="color: #008000">清除元素内容</span>
    8. <span style="color: #0000ff">void</span> Click();<span style="color: #008000">//</span><span style="color: #008000">点击</span>
    9. <span style="color: #0000ff">string</span> GetAttribute(<span style="color: #0000ff">string</span><span style="color: #000000"> attributeName);
    10. </span><span style="color: #0000ff">string</span> GetCssValue(<span style="color: #0000ff">string</span> propertyName);<span style="color: #008000">//</span><span style="color: #008000">获取CSS属性的值</span>
    11. <span style="color: #0000ff">void</span> SendKeys(<span style="color: #0000ff">string</span> text);<span style="color: #008000">//</span><span style="color: #008000">将文本写入元素</span>
    12. <span style="color: #0000ff">void</span> Submit();<span style="color: #008000">//</span><span style="color: #008000">提交此元素到服务器</span>
    复制代码


    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    该用户从未签到

    2#
    发表于 2017-6-20 10:52:18 | 只看该作者
    很详细,学习了!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2024-7-12 13:16
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]测试小兵

    3#
     楼主| 发表于 2017-6-20 10:53:00 | 只看该作者

    加油!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-6-28 15:45
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]测试小兵

    4#
    发表于 2017-6-23 15:43:33 | 只看该作者
    好像是测试APP的,是吗?
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-23 11:33 , Processed in 0.066789 second(s), 22 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表