有问题可随时回帖
依赖工具
Android Studio或者Android SDK:https://developer.android.com/studio/
Android模拟器:Android Studio自带、Genymotion https://www.genymotion.com/
Appium Desktop: https://github.com/appium/appium-desktop
Appium: https://github.com/appium/appium
演练App: 雪球官方新版本-安卓iOS版下载-应用宝官网
Appium Clients:http://appium.io/docs/en/about-appium/appium-clients/
示例代码:https://github.com/appium/sample-code
下载sdk可能需要***,请自行配置。
环境配置
Linux和Mac的配置,在~/.bash_profile中加入
export ANDROID_HOME=/usr/local/opt/android-sdk/
export PATH=$ANDROID_HOME/bin/:~/bin/:$PATH
windows:直接adb所在的目录放到windows的系统变量Path里即可。
adb和aapt所在的目录可能因为sdk的版本不同而不同,建议先去目录下查找下,然后再把这些工具的目录放到PATH变量中。
启动模拟器
模拟器推荐使用Android 6.0的镜像。
emulator -list-avds
emulator @设备名
常见问题
- x86 HAXM需要安装
- 8.1的支持不太好,优先使用6.0做验证
- 提示launchActivity找不到,你需要显式指定启动包和activity
- 不是所有的app都可以安装在模拟器,需要libs下有x86支持文件
{
"platformName": "android",
"deviceName": "emulator-5554",
"appActivity": ".view.WelcomeActivityAlias",
"appPackage": "com.xueqiu.android"
}
寻找app入口
Appium默认会自己去找,但是不见得能找对,可以自己主动填写
使用如下命令去找
adb logcat | grep Displayed
录制用例
# This sample code uses the Appium python client
# pip install Appium-Python-Client
# Then you can paste this into a file and simply run with Python
from appium import webdriver
caps = {}
caps["app"] = "/Users/seveniruby/Downloads/com.xueqiu.android_11.2_174.apk"
caps["platformName"] = "android"
caps["deviceName"] = "emulator-5554"
driver = webdriver.Remote("http://localhost:4723/wd/hub", caps)
el1 = driver.find_element_by_id("com.xueqiu.android:id/cancel")
el1.click()
el2 = driver.find_element_by_id("com.xueqiu.android:id/tv_search")
el2.click()
el3 = driver.find_element_by_id("com.xueqiu.android:id/search_input_text")
el3.send_keys("pdd")
el4 = driver.find_element_by_xpath("/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.RelativeLayout/android.widget.LinearLayout/android.support.v4.view.ViewPager/android.widget.RelativeLayout/android.widget.ListView/android.widget.LinearLayout[1]/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.RelativeLayout[1]/android.widget.LinearLayout[2]/android.widget.TextView")
el4.click()
driver.quit()
Java代码
import io.appium.java_client.MobileElement;
import io.appium.java_client.android.AndroidDriver;
import junit.framework.TestCase;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.net.MalformedURLException;
import java.net.URL;
import org.openqa.selenium.remote.DesiredCapabilities;
public class SampleTest {
private AndroidDriver driver;
@Before
public void setUp() throws MalformedURLException {
DesiredCapabilities desiredCapabilities = new DesiredCapabilities();
desiredCapabilities.setCapability("app", "/Users/seveniruby/Downloads/com.xueqiu.android_11.2_174.apk");
desiredCapabilities.setCapability("platformName", "android");
desiredCapabilities.setCapability("deviceName", "emulator-5554");
URL remoteUrl = new URL("http://localhost:4723/wd/hub");
driver = new AndroidDriver(remoteUrl, desiredCapabilities);
}
@Test
public void sampleTest() {
MobileElement el1 = (MobileElement) driver.findElementById("com.xueqiu.android:id/cancel");
el1.click();
MobileElement el2 = (MobileElement) driver.findElementById("com.xueqiu.android:id/tv_search");
el2.click();
MobileElement el3 = (MobileElement) driver.findElementById("com.xueqiu.android:id/search_input_text");
el3.sendKeys("pdd");
MobileElement el4 = (MobileElement) driver.findElementByXPath("/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.RelativeLayout/android.widget.LinearLayout/android.support.v4.view.ViewPager/android.widget.RelativeLayout/android.widget.ListView/android.widget.LinearLayout[1]/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.RelativeLayout[1]/android.widget.LinearLayout[2]/android.widget.TextView");
el4.click();
}
@After
public void tearDown() {
driver.quit();
}
}
定位元素
//*[contains(@resource-id,'tip_close_left')]/android.widget.ImageView
uiautomatorviewer不能与appium desktop同时使用
演练
- 使用Appium Desktop启动雪球app,试用元素的点击,输入,滑动,以及观察元素的属性。并录制启动后的几个关键点击和输入动作。
- 使用Python和Java的IDE,录制一段代码并执行它。启动雪球->点击主界面的登陆按钮->点击登陆->输入用户名和密码
- 用标准的xUnit的风格,编写2个用例。第一个用例是上面的题目,第二个用例 点击自选->点击+号 添加一只你喜欢的股票。
把作业的代码贴到回复里
作业总结
- 尽量避免使用硬编码等待 Thread.sleep,使用隐式等待。
- id定位不需要写/前面的内容
- xpath表达式双引号里面可以用单引号
- findElement在元素找不到的时候会抛异常,使用findElements来代替
- 用例顺序控制和逻辑控制,我们后面再讲解