北京第三期_Appium 安装与入门_20180729

有问题可随时回帖

依赖工具

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来代替
  • 用例顺序控制和逻辑控制,我们后面再讲解