Appium Server
npm version
npm view appium versions --json
#需要***,一般是没法安装成功的
npm install -g appium --verbose
使用cnpm安装
npm install -g cnpm --registry=https://registry.npm.taobao.org
cnpm install -g appium
ADB
- adb client,这是我们常用的adb命令
- adb server,开放5037端口的一个常驻进程
- adb调试协议,adb client与adb server的通讯
- adbd,设备端上的一个daemon进程,用于处理与手机的通讯
- 不通过usb线直连Android真机 adb tcpip + adb connect
findElement的核心逻辑
uiautomator2
private Object findElement(By by) throws ClassNotFoundException, UiAutomator2Exception,
UiObjectNotFoundException {
if (by instanceof ById) {
String locator = getElementLocator((ById) by);
return getInstance().findObject(android.support.test.uiautomator.By.res(locator));
} else if (by instanceof By.ByAccessibilityId) {
return getInstance().findObject(android.support.test.uiautomator.By.desc(by.getElementLocator()));
} else if (by instanceof ByClass) {
return getInstance().findObject(android.support.test.uiautomator.By.clazz(by.getElementLocator()));
} else if (by instanceof By.ByXPath) {
return getXPathUiObject(by.getElementLocator(), null /* AndroidElement */);
} else if (by instanceof By.ByAndroidUiAutomator) {
return getInstance().findObject(findByUiAutomator(by.getElementLocator()));
}
String msg = String.format("By locator %s is currently not supported!", by.getClass().getSimpleName());
throw new UnsupportedOperationException(msg);
}
toast识别
@Test
public void testToast() throws InterruptedException {
driver.findElementByXPath("//*[@text='Views']").click();
driver.findElementByAndroidUIAutomator(
"new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(" +
"new UiSelector().text(\\"Popup Menu\\").instance(0));").click();
driver.findElementByXPath("//*[contains(@text, 'Make')]").click();
driver.findElementByXPath("//*[@text='Search']").click();
//System.out.println(driver.findElementByClassName("android.widget.Toast").getText());
System.out.println(driver.findElementByXPath("//*[@class='android.widget.Toast']").getText());
}
TestXueqiu
import io.appium.java_client.MobileElement;
import io.appium.java_client.TouchAction;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.GsmCallActions;
import io.appium.java_client.pagefactory.WithTimeout;
import io.appium.java_client.touch.WaitOptions;
import io.appium.java_client.touch.offset.PointOption;
import org.apache.commons.io.FileUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.ScreenOrientation;
import org.openqa.selenium.remote.DesiredCapabilities;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.time.Duration;
import java.util.concurrent.TimeUnit;
public class ApiDemos {
private AndroidDriver driver;
@Before
public void setUp() throws MalformedURLException {
DesiredCapabilities desiredCapabilities = new DesiredCapabilities();
desiredCapabilities.setCapability("appPackage", "com.example.android.apis");
desiredCapabilities.setCapability("appActivity", ".ApiDemos");
desiredCapabilities.setCapability("platformName", "android");
desiredCapabilities.setCapability("deviceName", "emulator-5554");
desiredCapabilities.setCapability("avd", "Three");
desiredCapabilities.setCapability("automationName", "uiautomator2");
URL remoteUrl = new URL("http://localhost:4723/wd/hub");
driver = new AndroidDriver(remoteUrl, desiredCapabilities);
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
}
@Test
public void testToast() throws InterruptedException {
driver.findElementByXPath("//*[@text='Views']").click();
driver.findElementByAndroidUIAutomator(
"new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(" +
"new UiSelector().text(\\"Popup Menu\\").instance(0));").click();
driver.findElementByXPath("//*[contains(@text, 'Make')]").click();
driver.findElementByXPath("//*[@text='Search']").click();
//System.out.println(driver.findElementByClassName("android.widget.Toast").getText());
System.out.println(driver.findElementByXPath("//*[@class='android.widget.Toast']").getText());
}
@Test
public void testSwipe() throws InterruptedException, IOException {
Thread.sleep(3000);
for(int i=0;i<10;i++) {
swipe(0.8, 0.8, 0.4, 0.4);
FileUtils.copyFile(
driver.getScreenshotAs(OutputType.FILE).getCanonicalFile(),
new File(i+".png"));
}
}
@Test
public void testRorate() throws InterruptedException {
driver.rotate(ScreenOrientation.LANDSCAPE);
Thread.sleep(2000);
driver.rotate(ScreenOrientation.PORTRAIT);
driver.findElementByXPath("//*[@text='App']").click();
driver.findElementByXPath("//*[@text='Alarm']").click();
driver.navigate().back();
driver.navigate().back();
}
@Test
public void testCall(){
driver.sendSMS("15600534760", "hello from seveniruby");
driver.makeGsmCall("15600534760", GsmCallActions.CALL);
}
public void swipe(Double startX, Double startY, Double endX, Double endY) throws InterruptedException {
Dimension size=driver.manage().window().getSize();
TouchAction touchAction = new TouchAction(driver);
touchAction.press(PointOption.point((int)(size.width*startX), (int)(size.height*startY)));
touchAction.waitAction(WaitOptions.waitOptions(Duration.ofSeconds(1)));
touchAction.moveTo(PointOption.point((int)(size.width*endX), (int)(size.height*endY)));
touchAction.release();
touchAction.perform();
Thread.sleep(1000);
}
@After
public void tearDown() {
//driver.quit();
}
}
作业1
- appium server安装
- 运行你之前的用例
- 提取所有的appium shell命令回复到帖子里
作业2
- 连接远程的appium地址 http://10.130.32.76:4723/wd/hub
- 运行你的测试用例,演练下滑动和切换后台。
- 体现你的名字或者手机号,unicodeKeyBoard
参考资料
答案
#!/bin/bash
PLATFORM_TOOL="/usr/local/Cellar/android-sdk/24.4.1_1/platform-tools/adb.ori"
#打印时间
echo "#`date +%Y%m%d_%H%M` $0" >> /tmp/adb.log
#打印所有的参数
echo "adb $@">> /tmp/adb.log
test -x "$PLATFORM_TOOL" && exec "$PLATFORM_TOOL" "$@"
echo "It appears you do not have 'Android SDK Platform-tools' installed."
echo "Use the 'android' tool to install them: "
echo " android update sdk --no-ui --filter 'platform-tools'"