一些框架进本设置和信息,请参照我上一篇关于web测试的文章
自动化框架Quantum Automation Framework (JAVA,Appium,TestNG,QAF) + cucumber + perfecto (web)
https://blog.csdn.net/leonlee85/article/details/80892401仅以此作为学习笔记分享,描述理解有错误欢迎指正。(转载请注明出处)
1. mobile test suit 参数设置
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="Appium Demo Suite" verbose="0" parallel="tests"> <listeners> <listener class-name="com.quantum.listeners.QuantumReportiumListener"/> </listeners> <!-- To use actual AppiumDriver classes defined --> <!-- by driverClass property in env.resources dirs --> <!-- Set driver.name value to perfectoDriver --> <parameter name="driver.name" value="appiumDriver"/> <parameter name="remote.server" value="http://0.0.0.0:4723/wd/hub"></parameter> <parameter name="remote.port" value="4723"></parameter> <test name="Android demoApp Test" enabled="true"> <parameter name="appium.capabilities.platformName" value="Android"></parameter> <parameter name="appium.capabilities.deviceName" value="127.0.0.1:62025"></parameter> <parameter name="appium.capabilities.app" value="C:/Python27/Scripts/testprojects/demoapp/ApiDemos-debug.apk"></parameter> <parameter name="appium.capabilities.automationName" value="Appium"></parameter> <parameter name="appium.capabilities.appPackage" value="io.appium.android.apis"></parameter> <parameter name="appium.capabilities.appActivity" value="ApiDemos"></parameter> <parameter name="appium.capabilities.noReset" value="true"></parameter> <parameter name="env.resources" value="src/main/resources/android"/> <groups> <run> <include name="@demoApp"/> </run> </groups> <classes> <class name="com.qmetry.qaf.automation.step.client.gherkin.GherkinScenarioFactory"/> </classes> </test> </suite>
在test下的众多parameter设置,也可以写在另外的文件中,通过如下参数导入
<parameter name="env.resources" value="src/main/resources/android"/>
这样能让文件看起来更简洁,便于维护
src/main/resources/android下的env.properties文件里
perfecto.capabilities.platformName=android perfecto.capabilities.applicationName=Calculator driver.capabilities.driverClass=io.appium.java_client.android.AndroidDriver
注意最后一个参数,如果测试安卓请务必设置这个参数为AndroidDriver, 如果是IOS程序设置为IosDriver
这个两个类都是继承了appiumDriver类,可以直接使用appium封装的方法,但是对于要模拟安卓按键操作,需要使用AndroidDriver里的pressKeyCode方法。这里不修改的话在程序里去获取到AndroidDriver对象是会报错的,提示appiumdriver 和 androiddriver类不能相互转换。
2. 编写test步骤
@demoApp Feature: Appium demoApp Example Feature #Sample Test Scenario Description @demoApp Scenario: Appium Example Given I start application by name "API Demos" And I am using an AppiumDriver When I wait for "2" seconds Then I will see "NFC" in screen When I click on button "App" And I will see "Action Bar" in screen Then I click on button "Loader" And I wait for "5" seconds Then I will go back to pre-screen And I wait for "2" seconds
3. 定义步骤方法,同样一些公共参数可以写在src/main/resources/android下的**.loc文件里面,通过<parameter>标签导入
package com.quantum.steps; import com.qmetry.qaf.automation.step.QAFTestStep; import com.qmetry.qaf.automation.step.QAFTestStepProvider; import com.qmetry.qaf.automation.ui.WebDriverTestBase; import com.qmetry.qaf.automation.ui.webdriver.QAFExtendedWebElement; import com.qmetry.qaf.automation.util.StringUtil; import com.quantum.utils.AppiumUtils; import com.quantum.utils.ConfigurationUtils; import com.quantum.utils.ConsoleUtils; import com.quantum.utils.DriverUtils; import cucumber.api.java.en.Then; import cucumber.api.java.en.When; import cucumber.api.java.en.And; import io.appium.java_client.android.AndroidDriver; import io.appium.java_client.android.AndroidKeyCode; import io.appium.java_client.ios.IOSDriver; import org.openqa.selenium.By; /** * @author LeonLi * */ @QAFTestStepProvider public class DemoAppStepDefs { @QAFTestStep(description = "I start application by name {0}") public void iStartApplicationByName(String str0){ } @Then("I will see \"(.+)\" in screen") public void iWillSeeInTitleBar(String text){ new QAFExtendedWebElement(By.xpath("//android.widget.TextView[@content-desc=\"" + text + "\"]")).verifyText(text); } @When("I click on button \"(.*?)\"") public void iClickOnButton(String btn){ DriverUtils.getAndroidDriver().findElementByXPath("//android.widget.TextView" + "[@content-desc=\"" + btn + "\"]").click(); } @And("I am using an AppiumDriver") public void testForAppiumDriver() { if (ConfigurationUtils.getBaseBundle().getPropertyValue("driver.name").contains("Remote")) ConsoleUtils.logWarningBlocks("Driver is an instance of QAFExtendedWebDriver"); else if (AppiumUtils.getAppiumDriver() instanceof IOSDriver) ConsoleUtils.logWarningBlocks("Driver is an instance of IOSDriver"); else if (AppiumUtils.getAppiumDriver() instanceof AndroidDriver) ConsoleUtils.logWarningBlocks("Driver is an instance of AndroidDriver"); } @When("I will go back to pre-screen") public void iWillGoBackToPreScreen(){ DriverUtils.getAndroidDriver().pressKeyCode(AndroidKeyCode.BACK); } }
一切准备好后,打开模拟器,运行appium server,运行test case。
强烈推荐appium server 1.8.1,设置简单,可以通过UI界面直接启动模拟器上的软件,实时同步,自带控件的inspector.
需要了解appium server和模拟器之间设置可以参考我的这篇微博https://blog.csdn.net/leonlee85/article/details/80878164