Appium的简答使用

Appium Appium 服务关键字 关键字 描述 实例 automationName 你想使用的自动化测试引擎 Appium?(默认) 或?Selendroid platformName 你要测试的手机操作系统 iOS,?Android, 或?FirefoxOS platformVersion 手机操作系统版本 例如:?7.1,?4.4 deviceName 使用的手机类型或模拟器类型 iPhone Simulator,?iPad Simulator,?iPhone Retina 4-inch,?Android Emulator,?Galaxy S4, 等。在 iOS 上,这个关键字的值必须是使用?instruments -s devices?得到的可使用的设备名称之一。在 Android 上,这个关键字目前不起作用。 app .ipa?or?.apk文件所在的本地绝对路径或者远程路径,也可以是一个包括两者之一的.zip。 Appium会先尝试安装路径对应的应用在适当的真机或模拟器上。针对Android系统,如果你指定app-package和app-activity(具体见下面)的话,那么就可以不指定app。?会与?browserName?冲突 比如/abs/path/to/my.apk或http://myapp.com/app.ipa browserName 需要进行自动化测试的手机 web 浏览器名称。如果是对应用进行自动化测试,这个关键字的值应为空。 iOS 系统上可以用 ‘Safari‘ ,Android 系统上可以用 ‘Chrome‘, ‘Chromium‘, 或 ‘Browser‘。 newCommandTimeout 设置命令超时时间,单位:秒。达到超时时间仍未接收到新的命令时 Appium 会假设客户端退出然后自动结束会话。 比如?60 autoLaunch Appium是否需要自动安装和启动应用。默认值true true,?false language (Sim/Emu-only)?设定模拟器?( simulator / emulator )?的语言。 如:?fr locale (Sim/Emu-only) 设定模拟器 ( simulator / emulator ) 的区域设置。 如:?fr_CA udid 连接的物理设备的唯一设备标识 如:?1ae203187fc012g orientation (Sim/Emu-only) 在一个设定的方向模式中开始测试 LANDSCAPE?(横向) 或?PORTRAIT?(纵向) autoWebview 直接转换到 WebView 上下文。 默认值?false、 true,?false noReset 不要在会话前重置应用状态。默认值false。 true,?false fullReset (iOS) 删除整个模拟器目录。(Android) 通过卸载——而不是清空数据——来重置应用状态。在 Android 上,这也会在会话结束后自动清除被测应用。默认值?false true,?false ? Android特有 关键字 描述 实例 appActivity 你要从你的应用包中启动的 Android Activity 名称。它通常需要在前面添加?.?(如:使用.MainActivity?而不是?MainActivity) MainActivity,?.Settings appPackage 你想运行的Android应用的包名 比如com.example.android.myApp,?com.android.settings appWaitActivity 你想要等待启动的 Android Activity 名称 SplashActivity deviceReadyTimeout 设置等待一个模拟器或真机准备就绪的超时时间 5 androidCoverage 用于执行测试的 instrumentation 类。作为命令?adb shell am instrument -e coverage true -w?的-w?参数。 com.my.Pkg/com.my.Pkg.instrumentation.MyInstrumentation enablePerformanceLogging (仅适用于 Chrome 和 webview) 开启 Chromedriver 的性能日志。 (默认?false) true,?false androidDeviceReadyTimeout 等待设备在启动应用后准备就绪的超时时间。以秒为单位。 如?30 androidDeviceSocket 开发工具的 socket 名称。只有在被测应用是一个使用 Chromium 内核的浏览器时需要。 socket 会被浏览器打开,然后 Chromedriver 把它作为开发者工具来进行连接。 如?chrome_devtools_remote avd 需要启动的 AVD (安卓虚拟设备) 名称。 如?api19 avdLaunchTimeout 以毫秒为单位,等待 AVD 启动并连接到 ADB 的超时时间。(默认值120000) 300000 avdReadyTimeout 以毫秒为单位,等待 AVD 完成启动动画的超时时间。(默认值?120000) 300000 avdArgs 启动 AVD 时需要加入的额外的参数。 如?-netfast useKeystore 使用一个自定义的 keystore 来对 apk 进行重签名。默认值?false true?or?false keystorePath 自定义 keystore 的路径。默认: ~/.android/debug.keystore 如?/path/to.keystore keystorePassword 自定义 keystore 的密码。 如?foo keyAlias key 的别名 如?androiddebugkey keyPassword key 的密码 如?foo chromedriverExecutable webdriver 可执行文件的绝对路径 (如果 Chromium 核心提供了对应的 webdriver, 应该用它代替 Appium 自带的 webdriver) /abs/path/to/webdriver autoWebviewTimeout 以毫秒为单位,等待 Webview 上下文激活的时间。默认值?2000 如?4 intentAction 用于启动 activity 的 intent action。 (默认值android.intent.action.MAIN) 如?android.intent.action.MAIN,android.intent.action.VIEW intentCategory 用于启动 activity 的 intent category。 (默认值android.intent.category.LAUNCHER) 如?android.intent.category.LAUNCHER,android.intent.category.APP_CONTACTS intentFlags 用于启动 activity 的标识 ( flags ) (默认值?0x10200000) 如?0x10200000 optionalIntentArguments 用于启动 activity 的额外 intent 参数。请查看?Intent 参数 如?--esn <EXTRA_KEY>,?--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> stopAppOnReset 在使用 adb 启动应用前停止被测应用的进程 ( process ) 。如果被测应用是被另一个应用创建的,当这个参数被设定为 false 时,允许另一个应用的进程在使用 adb 启动被测应用时继续存活。默认值?true true?或?false unicodeKeyboard 使用 Unicode 输入法。默认值false true?或?false resetKeyboard 在设定了?unicodeKeyboard?关键字的 Unicode 测试结束后,重置输入法到原有状态。如果单独使用,将会被忽略。默认值?false true?或?false noSign 跳过检查和对应用进行 debug 签名的步骤。只能在使用 UiAutomator 时使用,使用 selendroid 是不行。默认值?false true?或?false ignoreUnimportantViews 调用 uiautomator 的函数setCompressedLayoutHierarchy()。由于 Accessibility 命令在忽略部分元素的情况下执行速度会加快,这个关键字能加快测试执行的速度。被忽略的元素将不能够被找到,因此这个关键字同时也被实现成可以随时改变的 *设置 ( settings ) * 。默认值?false true?或?false ? iOS特有 关键字 描述 实例 calendarFormat (Sim-only) 为iOS的模拟器设置日历格式 如?gregorian?(公历) bundleId 被测应用的 bundle ID 。用于在真实设备中启动测试,也用于使用其他需要 bundle ID 的关键字启动测试。在使用 bundle ID 在真实设备上执行测试时,你可以不提供?app?关键字,但你必须提供?udid?。 如?io.appium.TestApp udid 连接的真实设备的唯一设备编号 ( Unique device identifier ) 如?1ae203187fc012g launchTimeout 以毫秒为单位,在 Appium 运行失败之前设置一个等待 instruments 的时间 比如:?20000 locationServicesEnabled (Sim-only) 强制打开或关闭定位服务。默认值是保持当前模拟器的设定 true?或?false locationServicesAuthorized (Sim-only) 通过修改 plist 文件设定是否允许应用使用定位服务,从而避免定位服务的警告出现。默认值是保持当前模拟器的设定。请注意在使用这个关键字时,你同时需要使用?bundleId?关键字来发送你的应用的 bundle ID。 true?或者?false autoAcceptAlerts 当 iOS 的个人信息访问警告 (如 位置、联系人、图片) 出现时,自动选择接受( Accept )。默认值?false。 true?或者?false autoDismissAlerts 当 iOS 的个人信息访问警告 (如 位置、联系人、图片) 出现时,自动选择不接受( Dismiss )。默认值false。 true?或者?false nativeInstrumentsLib 使用原生 intruments 库 (即关闭 instruments-without-delay ) true?或者?false nativeWebTap (Sim-only) 在Safari中允许"真实的",非基于 javascript 的 web 点击 (tap) 。 默认值:?false。注意:取决于 viewport 大小/比例, 点击操作不一定能精确地点中对应的元素。 true?或者?false safariInitialUrl (Sim-only) (>= 8.1) 初始化 safari 的时使用的地址。默认是一个本地的欢迎页面 如https://www.github.com safariAllowPopups (Sim-only) 允许 javascript 在 Safari 中创建新窗口。默认保持模拟器当前设置。 true?或者?false safariIgnoreFraudWarning (Sim-only) 阻止 Safari 显示此网站可能存在风险的警告。默认保持浏览器当前设置。 true?或者?false safariOpenLinksInBackground (Sim-only) Safari 是否允许链接在新窗口打开。默认保持浏览器当前设置。 true?或者?false keepKeyChains (Sim-only) 当 Appium 会话开始/结束时是否保留存放密码存放记录 (keychains) (库(Library)/钥匙串(Keychains)) true?或者?false localizableStringsDir 从哪里查找本地化字符串。默认值?en.lproj en.lproj processArguments 通过 instruments 传递到 AUT 的参数 如?-myflag interKeyDelay 以毫秒为单位,按下每一个按键之间的延迟时间。 如?100 showIOSLog 是否在 Appium 的日志中显示设备的日志。默认值false true?或者?false sendKeyStrategy 输入文字到文字框的策略。模拟器默认值:oneByOne(一个接着一个) 。真实设备默认值:grouped?(分组输入) oneByOne,?grouped?或setValue screenshotWaitTimeout 以秒为单位,生成屏幕截图的最长等待时间。默认值: 10。 如?5 waitForAppScript 用于判断 "应用是否被启动” 的 iOS 自动化脚本代码。默认情况下系统等待直到页面内容非空。结果必须是布尔类型。 例如?true;,target.elements().length > 0;,?$.delay(5000); true; Webview 1、通过driver.page_source找源码 2、通过chrome浏览器,××× chrome://inspect/#devices 获取webview的源代码,需要××× 定位方式 Id定位 通过全名称 person_center_id_1 = driver.find_element_by_id("com.xsteach.appedu:id/content_rb_mine") person_center_id_1.click() 通过部分名称 person_center_id_2 = driver.find_element_by_id("content_rb_mine") person_center_id_2.click() class_name定位 1、class_name 唯一存在 #定位搜索框,通过class_name search_box = driver.find_element_by_class_name("android.widget.RelativeLayout") 2、class_name 和其他元素重复 比如底部的几个元素都是同一个class_name,但是index索引不一样,从0开始 定位方式1: 需要注意,此种写法和ui automator viewer给的索引不一样,是从1开始 home_page = driver.find_element_by_xpath("//*[@class=‘android.widget.RadioButton‘][1]") 定位方式2: 此处定位表达式的index取自ui automator viewer category = driver.find_element_by_xpath("//*[@class=‘android.widget.RadioButton‘ and @index=1]") 定位方式3: Uiautomator通过uiautomator定位,返回的是一列表,下标从0开始 my_course = driver.find_elements_by_android_uiautomator(‘new UiSelector().className("android.widget.RadioButton")‘)[2] xpath定位 需要注意,此种写法和ui automator viewer给的索引不一样,是从1开始 home_page = driver.find_element_by_xpath("//*[@class=‘android.widget.RadioButton‘][1]") text定位 需要使用uiautomator的定位方式 1、匹配全部文本 find_elements_by_android_uiautomator返回的是一个列表需要取第一元素 #个人中心 p_center = driver.find_elements_by_android_uiautomator(‘new UiSelector().text("个人中心")‘)[0] 也可以使用find_element_by_android_uiautomator返回的是单个元素 #分类 category = driver.find_element_by_android_uiautomator(‘new UiSelector().text("分类")‘) 2、匹配部分文本 #社区 area = driver.find_element_by_android_uiautomator(‘new UiSelector().textContains("社")‘) area.click() time.sleep(3) 3、正则匹配文本 #我的课程 course = driver.find_element_by_android_uiautomator(‘new UiSelector().textMatches(".*课程.*")‘) course.click() time.sleep(3) css_selector定位(webview) 只适用于webview的html页面,继承自webdriver,与pc版本的UI测试一致 driver.find_element_by_css_selector() <input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off"> 用id driver.find_element_by_css_selector("input#kw") driver.find_element_by_css_selector("input[id=kw]") 通过link_text定位(webview) 只适用于webview容器中的html页面,继承自webdriver,与pc版本的UI测试一致 driver.find_element_by_link_text() 通过name定位 web view容器中的html页面可以用name定位,native并没有name属性 driver.find_element_by_name() <a href="https://www.hao123.com" name="tj_trhao123" class="mnav">hao123</a> driver.find_element_by_name("tj_trhao123") find_element(by,value) find_element_by_方式(value)实际调用的都是find_element(by,value) 需要导入这个包: from selenium.webdriver.common.by import By 例如:定位id为ag2的元素 方式一: driver.find_element_by_id("ag2”) driver.find_element_by_id("content_rb_bbs”) 方式二: driver.find_element(By.ID,"ag2") driver.find_element(By.ID,"content_rb_bbs") 这个操作的好处是可以直接把操作的by和value放到一个元组里,然后调用通用方法来传参获得元素结果 cateid=(By.ID,"ag2") driver.find_element(*cateid).click() 用find_element()方法定位,两个参数 第一个参数是定位的类型由By指定,第二个参数是具体的定位值; 传入两个个参数不需要是元组 driver.find_element(By.ID,"kw") driver.find_element(By.XPATH,‘//input[@id="kw"]‘) driver.find_element(By.NAME,"tj_trhao123") driver.find_element(By.CLASS_NAME,"s_ipt") driver.find_element(By.TAG_NAME,"input") driver.find_element(By.LINK_TEXT,"hao123").click() driver.find_element(By.PARTIAL_LINK_TEXT,"hao123") driver.find_element(By.CSS_SELECTOR,"input#kw") find_elements_by_定位方式(value) 返回的是一个列表,需要通过下标获取对应元素对象 driver.find_elements_by_id() driver.find_elements_by_class_name() driver.find_elements_by_android_uiautomator() find_elements(by,value) 同样返回 find_elements(By.ID,”XXXX”) 定位元素顺序: 1、Id 2、class_name,如重复结合index 3、Uiautomator,可定位text等 4、xpath 常用API 点击click pm = driver.find_elements_by_id("com.xsteach.appedu:id/rlItemView")[1] pm.click() 清空clear() userName = driver.find_element_by_id("etUser") userName.clear() 输入文本send_keys() userName = driver.find_element_by_id("etUser") userName.send_keys(“xxx”) 左右上下滑动 ‘‘‘左滑‘‘‘ x = driver.get_window_size()[‘width‘] y = driver.get_window_size()[‘height‘] driver.swipe(x*3/4,y/4,x/4,y/4) ‘‘‘右滑‘‘‘ x = driver.get_window_size()[‘width‘] y = driver.get_window_size()[‘height‘] driver.swipe(x/4,y/4,x*3/4,y/4) ‘‘‘下滑‘‘‘ x = driver.get_window_size()[‘width‘] y = driver.get_window_size()[‘height‘] driver.swipe(x/2,y*3/4,x/2,y/4) ‘‘‘上滑‘‘‘ x = driver.get_window_size()[‘width‘] y = driver.get_window_size()[‘height‘] driver.swipe(x/2,y/4,x/2,y*3/4) 滑动界面 from appium.webdriver.common.touch_action import TouchAction def test_scroll_down(driver): ??? screen = driver.get_window_size() ??? action = TouchAction(driver) ??? action.press(x=screen[‘width‘]/2,y=screen[‘height‘]/2) ??? action.move_to(x=0,y=-screen[‘height‘]/10) ??? action.release() ??? action.perform() 获取界面属性,控件属性 1)获取当前Activity名称 activity = driver.current_activity 2)获取屏幕宽高 screen = driver.get_window_size() 3)获取控件文本 mobile_name.get_attribute(‘text‘) mobile_name.text 4)获取控件类名 mobile_name.get_attribute(‘className‘) 5)判断控件是否显示 mobile_name.is_displayed() mobile_name.get_attribute(‘displayed‘) 6)获得控件位置 mobile_name.location 7)获得控件大小mobile_name.size 8)查找控件子结点 需要先获取节点元素parent,然后获取对应的子节点 parent.find_elements_by_class_name(‘android.widget.TextView‘) 截屏 driver.get_screenshot_as_file(file_path) 断言源码内容 assert "平面广告设计付款专用链接1" in driver.page_source #获取当前Activity的名称 activity = driver.current_activity print(activity) #获取屏幕高度、宽度 size = driver.get_window_size() print(size) #获取平面设计元素 pm = driver.find_elements_by_id("com.xsteach.appedu:id/rlItemView")[1] print("文本:",pm.get_attribute(‘text‘)) print("文本:",pm.text) print("类名:",pm.get_attribute(‘className‘)) print("控件是否显示:",pm.is_displayed()) print("控件是否显示:",pm.get_attribute("displayed")) print("控件位置:",pm.location) print("控件大小:",pm.size) children = pm.find_elements_by_id("com.xsteach.appedu:id/iv_tag") print(children) pm.click() time.sleep(5) assert "平面广告设计付款专用链接1" in driver.page_source file_path = "e:\\" + time.strftime("%Y-%m-%d") + ".png" driver.get_screenshot_as_file(file_path) 关闭driver driver.quit() 注意:一定要记得关闭driver, 否则下次连接的时候可能会出异常,因为Appium以为你上次未关闭,会创建Session失败。 关闭app driver.close_app() 模拟点击返回键 模拟操作系统的返回键 driver.press_keycode(4) 其中按钮的定义,由Android里的KeyEvent.java里定义的,所以其它的Android按钮也是支持的。 #获取平面设计元素 pm = driver.find_elements_by_id("com.xsteach.appedu:id/rlItemView")[1] pm.click() time.sleep(5) assert "平面广告设计付款专用链接1" in driver.page_source driver.press_keycode(4) 手机键盘事件的操作 两个函数可用 driver.keyevent() driver.press_keycode(4) KEYCODE_CALL 拨号键 5 KEYCODE_ENDCALL 挂机键 6 KEYCODE_HOME 按键Home 3 KEYCODE_MENU 菜单键 82 KEYCODE_BACK 返回键 4 KEYCODE_SEARCH 搜索键 84 KEYCODE_CAMERA 拍照键 27 KEYCODE_FOCUS 拍照对焦键 80 KEYCODE_POWER 电源键 26 KEYCODE_NOTIFICATION 通知键 83 KEYCODE_MUTE 话筒静音键 91 KEYCODE_VOLUME_MUTE 扬声器静音键 164 KEYCODE_VOLUME_UP 音量增加键 24 KEYCODE_VOLUME_DOWN 音量减小键 25 控制键 KEYCODE_ENTER 回车键 66 KEYCODE_ESCAPE ESC键 111 KEYCODE_DPAD_CENTER 导航键 确定键 23 KEYCODE_DPAD_UP 导航键 向上 19 KEYCODE_DPAD_DOWN 导航键 向下 20 KEYCODE_DPAD_LEFT 导航键 向左 21 KEYCODE_DPAD_RIGHT 导航键 向右 22 KEYCODE_MOVE_HOME 光标移动到开始键 122 KEYCODE_MOVE_END 光标移动到末尾键 123 KEYCODE_PAGE_UP 向上翻页键 92 KEYCODE_PAGE_DOWN 向下翻页键 93 KEYCODE_DEL 退格键 67 KEYCODE_FORWARD_DEL 删除键 112 KEYCODE_INSERT 插入键 124 KEYCODE_TAB Tab键 61 KEYCODE_NUM_LOCK 小键盘锁 143 KEYCODE_CAPS_LOCK 大写锁定键 115 KEYCODE_BREAK Break/Pause键 121 KEYCODE_SCROLL_LOCK 滚动锁定键 116 KEYCODE_ZOOM_IN 放大键 168 KEYCODE_ZOOM_OUT 缩小键 169 组合键 KEYCODE_ALT_LEFT Alt+Left KEYCODE_ALT_RIGHT Alt+Right KEYCODE_CTRL_LEFT Control+Left KEYCODE_CTRL_RIGHT Control+Right KEYCODE_SHIFT_LEFT Shift+Left KEYCODE_SHIFT_RIGHT Shift+Right 基本 KEYCODE_0 按键’0’ 7 KEYCODE_1 按键’1’ 8 KEYCODE_2 按键’2’ 9 KEYCODE_3 按键’3’ 10 KEYCODE_4 按键’4’ 11 KEYCODE_5 按键’5’ 12 KEYCODE_6 按键’6’ 13 KEYCODE_7 按键’7’ 14 KEYCODE_8 按键’8’ 15 KEYCODE_9 按键’9’ 16 KEYCODE_A 按键’A’ 29 KEYCODE_B 按键’B’ 30 KEYCODE_C 按键’C’ 31 KEYCODE_D 按键’D’ 32 KEYCODE_E 按键’E’ 33 KEYCODE_F 按键’F’ 34 KEYCODE_G 按键’G’ 35 KEYCODE_H 按键’H’ 36 KEYCODE_I 按键’I’ 37 KEYCODE_J 按键’J’ 38 KEYCODE_K 按键’K’ 39 KEYCODE_L 按键’L’ 40 KEYCODE_M 按键’M’ 41 KEYCODE_N 按键’N’ 42 KEYCODE_O 按键’O’ 43 KEYCODE_P 按键’P’ 44 KEYCODE_Q 按键’Q’ 45 KEYCODE_R 按键’R’ 46 KEYCODE_S 按键’S’ 47 KEYCODE_T 按键’T’ 48 KEYCODE_U 按键’U’ 49 KEYCODE_V 按键’V’ 50 KEYCODE_W 按键’W’ 51 KEYCODE_X 按键’X’ 52 KEYCODE_Y 按键’Y’ 53 KEYCODE_Z 按键’Z’ 54 appium可以借助pc端selenium的物理按键代码来操作。 driver.press_keycode() 括号内填入pc端键盘的代号 示例 均基于邢帅教育 APP 示例1: #encoding=utf-8 from appium import webdriver import time caps = {} #app的包名 caps["appPackage"] = "com.xsteach.appedu" #需要启动的Activity名称 caps["appActivity"] = "com.xsteach.appedu.StartActivity" #系统类 caps["platformName"] = "Android" #系统版本 caps["platformVersion"] = "6" #设置id caps["deviceName"] = "G2W0214B11002712" #使用使用 Unicode 输入法,支持中文 caps["unicodeKeyboard"] = True #在设定了 unicodeKeyboard 关键字的 Unicode 测试结束后,重置输入法到原有状态。 #如果单独使用,将会被忽略。默认值 false caps["resetKeyboard"] = True #自动确认警告 caps["autoAcceptAlerts"] = True #会话前重置应用状态 caps["noReset"] = True #设置命令超时时间 caps["newCommandTimeout"] = 6000 #创建driver对象 driver = webdriver.Remote("http://localhost:4723/wd/hub",caps) #获取屏幕的宽度、高度,返回字典 size = driver.get_window_size() print(size) #判断对应的app是否安装 print(driver.is_app_installed("com.xsteach.appedu")) #退出app driver.close_app() 注意:通过adb shell dumpsys package com.xsteach.appedu获取的包名 不能带/ 示例2:搜索 #encoding=utf-8 from appium import webdriver import time caps = {} #app的包名 caps["appPackage"] = "com.xsteach.appedu" #需要启动的Activity名称 caps["appActivity"] = "com.xsteach.appedu.StartActivity" #系统类 caps["platformName"] = "Android" #系统版本 caps["platformVersion"] = "6" #设置id caps["deviceName"] = "G2W0214B11002712" #使用使用 Unicode 输入法,支持中文 caps["unicodeKeyboard"] = True #隐藏键盘,在设定了 unicodeKeyboard 关键字的 Unicode 测试结束后,重置输入法到原有状态。 #如果单独使用,将会被忽略。默认值 false caps["resetKeyboard"] = True #自动确认警告 caps["autoAcceptAlerts"] = True #会话前重置应用状态 caps["noReset"] = True #设置命令超时时间 caps["newCommandTimeout"] = 6000 #创建driver对象 driver = webdriver.Remote("http://localhost:4723/wd/hub",caps) #打印当前页面的Activity print(driver.current_activity) time.sleep(5) #获取个人中心元素对象,返回的是一个list uList = driver.find_elements_by_android_uiautomator("new UiSelector().text(\"个人中心\")") print(uList) print(uList[0].text) #获取顶部搜索框对象 searchBox = driver.find_element_by_id("com.xsteach.appedu:id/rl_home_top_search") searchBox.click() time.sleep(3) #获取二级页面的搜索框对象 searchBox2 = driver.find_element_by_id("com.xsteach.appedu:id/editText") time.sleep(3) #输入搜索关键字 searchBox2.send_keys("PS") time.sleep(4) #获取搜索出的第一个内容并点击 driver.find_element_by_id("com.xsteach.appedu:id/item_tv_dynamic_search_result").click() time.sleep(3) #关闭app driver.close_app() 示例3:登录 #encoding=utf-8 from appium import webdriver import time caps = {} #app的包名 caps["appPackage"] = "com.xsteach.appedu" #需要启动的Activity名称 caps["appActivity"] = "com.xsteach.appedu.StartActivity" #系统类 caps["platformName"] = "Android" #系统版本 caps["platformVersion"] = "6" #设置id caps["deviceName"] = "G2W0214B11002712" #使用使用 Unicode 输入法,支持中文 caps["unicodeKeyboard"] = True #隐藏键盘,在设定了 unicodeKeyboard 关键字的 Unicode 测试结束后,重置输入法到原有状态。 #如果单独使用,将会被忽略。默认值 false caps["resetKeyboard"] = True #自动确认警告 caps["autoAcceptAlerts"] = True #会话前重置应用状态 caps["noReset"] = True #设置命令超时时间 caps["newCommandTimeout"] = 6000 #创建driver对象 driver = webdriver.Remote("http://localhost:4723/wd/hub",caps) #获取个人中心页面元素 personInfo = driver.find_element_by_id("content_rb_mine") personInfo.click() time.sleep(3) #获取"点击登录"按钮元素 click_login = driver.find_element_by_id("tvLogin") click_login.click() time.sleep(3) #获取用户名输入框,并输入用户名 userName = driver.find_element_by_id("etUser") userName.send_keys("fosterwu") time.sleep(2) #获取密码输入框并输入名 passWord = driver.find_element_by_id("etPwd") passWord.send_keys("gloryroad123") time.sleep(2) #获取登录按钮,并点击登录按钮 loginButton = driver.find_element_by_id("btnLogin") loginButton.click() time.sleep(3) #退出app driver.close_app() 示例4: 进入平面设计模块,然后选择第一个课程,然后一直返回到首页 #encoding=utf-8 from appium import webdriver import time caps = {} #app的包名 caps["appPackage"] = "com.xsteach.appedu" #需要启动的Activity名称 caps["appActivity"] = "com.xsteach.appedu.StartActivity" #系统类 caps["platformName"] = "Android" #系统版本 caps["platformVersion"] = "6" #设置id caps["deviceName"] = "G2W0214B11002712" #使用使用 Unicode 输入法,支持中文 caps["unicodeKeyboard"] = True #隐藏键盘,在设定了 unicodeKeyboard 关键字的 Unicode 测试结束后,重置输入法到原有状态。 #如果单独使用,将会被忽略。默认值 false caps["resetKeyboard"] = True #自动确认警告 caps["autoAcceptAlerts"] = True #会话前重置应用状态 caps["noReset"] = True #设置命令超时时间 caps["newCommandTimeout"] = 6000 #创建driver对象 driver = webdriver.Remote("http://localhost:4723/wd/hub",caps) #获取平面设计元素对象 pm = driver.find_elements_by_id("com.xsteach.appedu:id/rlItemView")[1] pm.click() time.sleep(3) #获取平面设计下的第一个课程 course = driver.find_elements_by_xpath("//*[@class=‘android.widget.ImageView‘]")[1] course .click() time.sleep(3) #也可以直接用图标下的文本定位 #course = driver.find_element_by_android_uiautomator(‘new UiSelector().text("Illustrator普通班课程(录播)")‘) #获取当前课程页面的返回按钮 course_back = driver.find_element_by_id("com.xsteach.appedu:id/iv_back") course_back.click() time.sleep(3) #获取平面设计页面的返回按钮 pm_back = driver.find_elements_by_xpath("//*[@class=‘android.widget.ImageView‘]")[0] pm_back.click() 由于以上两个元素的id和class都不唯一,需要先获取到所有的元素,然后再取某一个, 并且第一个课程的index都是0,此时只好先获取到所有的元素;

Appium的简答使用

上一篇:appium自动化框架项目实战1——app初次使用引导页


下一篇:「docker实战篇」python的docker爬虫技术-fiddler之安卓模拟器如何抓包(九)