Jump to content
  • Hello visitors, welcome to the Hacker World Forum!

    Red Team 1949  (formerly CHT Attack and Defense Team) In this rapidly changing Internet era, we maintain our original intention and create the best community to jointly exchange network technologies. You can obtain hacker attack and defense skills and knowledge in the forum, or you can join our Telegram communication group to discuss and communicate in real time. All kinds of advertisements are prohibited in the forum. Please register as a registered user to check our usage and privacy policy. Thank you for your cooperation.

    TheHackerWorld Official

Recommended Posts

1、Desired Capabilities

  appium 在启动 session 时,需要提供 Desired Capabilities。Desired Capabilities 本质上是字典对象,由客户端生成并发送给服务器(appium Desktop),告诉服务器 App 运行的环境。

from appium import webdriver
# 定义 Android 运行环境
desired_caps = {
    'deviceName': 'Android Emulator',
    'automationName': 'appium',
    'platformName': 'Android',
    'platformVersion': '7.0',
    'appPackage': 'com.android.calculator2',
    'appActivity': '.Calculator',
    'noReset': True, 
}

driver = webdriver.Remote(command_executor='http://localhost:4723/wd/hub',desired_capabilities=desired_caps)
…

  1. deviceName:启动的设备、真机或模拟器,如 iPhone Simulator、Android Emulator、Galaxy S4 等。

  2. automationName:使用的自动化引擎,如 appium(默认)或 Selendroid(兼容 AndroidAPI 17 以下)。

  3. platformName:使用的移动平台,如 iOS 或 Android。

  4. platformVersion:指定平台的系统版本,如 Android 平台,版本为 7.0。

  5. appPackage:被测试 App 的 Package 名,如 com.example.android.myApp、com.android.settings 等。

  6. appActivity:被测试 App 的 Activity 名,如 Calculator、MainActivity、.Settings 等。

  7. noReset:在会话前重置应用状态。当设置为 True 时,会跳过安装指引;默认为false。

  

  appium 在启动 App 时必须要设置 appPackage 和 appActivity 两个参数。  

  方式一:通过 adb 工具抓取日志进行分析。

  (1)运行“adb logcat>D:/log.txt”命令,将 adb 抓取的日志写入 D:/log.txt 文件。

  (2)在 Android 模拟器或设备中打开要测试的 App,并做一些操作。

  (3)按快捷键 Ctrl+c 结束日志的捕捉。

  (4)打开 D:/log.txt 文件,搜索“Displayed”关键字,查找 App 的 Package 和 Activity。

  方式二:通过 aapt 查看信息。

  aapt 即 Android Asset Packaging Tool,在 SDK 的 build-tools 目录下。该工具既可以查看、创建、更新 zip 格式的文档附件(zip、jar、apk),也可以将资源文件编译成二进制文件。

 

2、控件定位 

  可以借助 Android SDK 自带的 UI Automator Viewer 工具对 Android 设备式模拟器中的控件进行定位。该工具位于…\tools\bin\目录下的 uiautomatorviewer.bat 文件中可以双击启动,也可以在 Windows 命令提示符下输入“uiautomatorviewer”命令启动。

  1. id 定位

  id 定位是使用控件的 resource-id 进行定位的。

driver.find_element_by_id()

  2. Class Name 定位

  Class Name 定位是使用控件的 class 属性进行定位的。

 driver.find_elements_by_class_name()

  3. XPath 定位 

  根据 WebDriver 上的 XPath 使用经验,查找层级标签名是错误的,正确的方式是获取控件的 class 属性,来代替标签名。

driver.find_element_by_xpath("//android.view.ViewGroup/android.widget.Button")

  4. Accessibility id 定位 

  该方法属于 appium 扩展的定位方法,它采用一个字符串表示附加到给定元素的可访问id 或标签,例如,iOS 中的可访问标识符,或 Android 中的内容描述等。核心是找到控件的 contentDescription 属性。
driver.find_element_by_accessibility_id("plus")

  5. Android uiautomator 定位 

  该方法属于 appium 的扩展定位方法,并且只支持 Android 平台。一个元素的任意属性都可以通过 Android uiautomator 方法来进行定位,使用方法如下。

# text 属性
driver.find_element_by_android_uiautomator('new UiSelector().text("clr")')
# content-desc 属性
driver.find_element_by_android_uiautomator('new UiSelector().description("equals")')
# id 属性
driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.android.calculator2:id/digit_1")')
# class 属性
driver.find_element_by_android_uiautomator('new UiSelector().className("android.widget.Button")')

  6. 其他定位

  (1)在 appium 的 Native App 中没有使用的方法如下。
driver.find_element_by_name()
driver.find_element_by_tag_name()
driver.find_element_by_link_text()
driver.find_element_by_partial_link_text()
driver.find_element_by_css_selector()
  (2)在 appium 中没有详细介绍的定位方法如下。   前三个定位方法是针对 iOS 平台控件的,后 4 个方法目前并不常用。
driver.find_element_by_ios_uiautomation()
driver.find_element_by_ios_predicate()
driver.find_element_by_ios_class_chain()
driver.find_element_by_android_viewtag()
find_element_by_android_data_matcher()
driver.find_element_by_image()
driver.find_element_by_custom()

 

3、appium 的常用 API 

  1. 应用操作

  (1)安装应用
install_app()
  安装应用到设备中,需要指定 apk 包的路径。
driver.install_app("D:\\android\\apk\\ContactManager.apk")
  (2)卸载应用
remove_app()
  从设备中卸载某个指定的应用,需要指定 App 包名。
driver.remove_app('com.example.android.apis')
  (3)关闭应用
close_app()
  (4)启动应用
launch_app()
  (5)检查应用是否已经安装
is_app_installed()
  检查应用是否已经安装,需要指定应用的包名。返回结果为 True 或 False。
result = driver.is_app_installed('com.example.android.apis')
print(result)
  (6)将应用置于后台   将当前应用置于后台,需要指定将应用置于后台的时间,默认时间单位为秒。
background_app()
  (7)应用重置   类似于清除应用缓存。
reset()

  2. 上下文操作 

  在计算机技术中,对进程而言,上下文就是进程执行时的环境,具体来说就是各个变量和数据,包括所有的寄存器变量、进程打开的文件和内存信息等。    (1)获取当前所有可用上下文
driver.contexts
  (2)获取当前上下文。
driver.current_context
  (3)切换上下文。
switch_to.context()

  3. 键盘操作

  (1)输入字符串
send_keys()
  (2)模拟按键。
keyevent()

  4. 触摸操作 

  (1)单击控件

  对一个控件或坐标点(x,y)执行单击操作。tap()方法中有一个 count 参数,用于设置控件的单击次数,默认为 1 次。
tap(self, element=None, x=None, y=None, count=1)
  (2)长按控件   长按一个控件或坐标点(x,y)。long_press()方法中有一个 duration 参数,用来控制按压的时间。duration 以毫秒为单位,其用法与 tap()方法相同。
long_press(self, el=None, x=None, y=None, duration=1000)
  (3)移动   将光标移动到新的元素或坐标点(x,y)
move_to(self, el=None, x=None, y=None)
  (4)暂停   暂停脚本的执行。ms 参数表示时间,单位为毫秒。
wait(self, ms=0)
  appium 不仅可以执行一个动作,还可以同时执行多个动作,形成动作链,以模拟多指动作。appium 是通过构建一个 MultiAction 对象来实现执行多个动作的,该对象包含多个单独的 TouchAction 对象,每个“手指”对应一个。
from appium.webdriver.common.multi_action import MultiAction
from appium.webdriver.common.touch_action import TouchAction
…
# 执行动作链
els = driver.find_elements_by_class_name('listView')
a1 = TouchAction()
a1.press(els[0])\
    .move_to(x=10, y=0)\
    .move_to(x=10, y=-75)\
    .move_to(x=10, y=-600)\
     .release()

a2 = TouchAction()
a2.press(els[1]) \
    .move_to(x=10, y=10)\
    .move_to(x=10, y=-300)\
     .move_to(x=10, y=-600)\
    .release()

ma = MultiAction(driver, els[0])
ma.add(a1, a2)
ma.perform()

  5. 特有操作 

  (1)熄屏

  单击电源键熄灭屏幕。seconds 参数表示时间,单位为秒,默认为 None。
lock(self, seconds=None)

  (2)获取当前 package

  获取当前 App 的包名(package),仅支持 Android。

package = driver.current_package
print(package)

  (3)获取当前 activity

  获取当前 App 的 activity,仅支持 Android。

activity = driver.current_activity
print(activity)
  (4)收起虚拟键盘
driver.hide_keyboard() # 收起虚拟键盘

  (5)获取屏幕宽高

  当需要通过坐标(x,y)对屏幕进行操作时,就需要获取屏幕的宽高。

windows = driver.get_window_size()
print(windows["width"])
print(windows["height"])

  (6)拉取文件

  从真机或模拟器中拉取文件。path 参数指定文件的路径。

pull_file(self, path)
  (7)推送文件
push_file(self, path, base64data)
  path 参数指定 PC 中的文件路径,base64data 参数指定写入文件的内容的编码为 base64。
data = "some data for the file"
path = "/data/local/tmp/file.txt"
driver.push_file(path, data.encode('base64'))

 

Link to post
Link to comment
Share on other sites

 Share

discussion group

discussion group

    You don't have permission to chat.
    • Recently Browsing   0 members

      • No registered users viewing this page.
    ×
    ×
    • Create New...