如果第一篇在运行代码的时候出现问题,建议参考我的上一篇文章解决。
1、APP界面信息获取
adb logcat|grep -i displayed
代码含义是获取当前应用的包名和界面名。
根据日志信息修改代码当中的包名和界面名,就可以跳转对应的界面。
2、界面元素获取
所需工具
下载链接
下载地址
安装步骤
安装教学地址
基本配置及入门操作指南
参考操作指南
3、APPium+Python的常规操作
Appium 是一个开源工具,用于自动化测试移动应用程序(iOS 和 Android)。结合 Python 使用时,它可以帮助你编写脚本以自动执行各种操作。下面是一些基本的元素获取方式和常规操作介绍。
元素获取方式
-
通过ID查找元素
如果你知道某个元素的资源ID,可以使用find_element_by_id
方法来定位它。element = driver.find_element_by_id("resource_id")
-
通过类名查找元素
当你想通过元素的类名来定位它时,可以使用find_elements_by_class_name
方法。elements = driver.find_elements_by_class_name("android.widget.EditText")
-
通过XPath查找元素
XPath 是一种强大的路径语言,用于在 XML 文档中查找信息。同样适用于 HTML 和 XML 格式的 UI 层级结构。element = driver.find_element_by_xpath("//android.widget.TextView[@text='登录']")
-
通过Accessibility ID查找元素
Accessibility ID 提供了一种独立于平台的方式标识元素,对于跨平台测试非常有用。element = driver.find_element_by_accessibility_id("accessibility_id")
-
swipe滑动
按手机界面绝对坐标滑动,对于不同手机而言,绝对坐标会发生变化,需要使用相对坐标(获取元素坐标,根据这个元素的坐标来滑动)。
driver.swipe(start_x,start_y,end_x,end_y,duration=None)
- scroll滑动
从一个元素滑动到另一个元素,直到页面自动停止,惯性很大。
driver.scroll(origin_el, destination_el) # 参数一,滑动开始的元素,参数二滑动结束的元素。
- drag_and_drop拖拽
从一个元素滑动到另一个元素,第二个元素替代第一个元素原本屏幕上的那个位置,没有惯性。
driver.drag_and_drop(origin_el,destination _el)
常用手势操作
1. 滑动(Swipe)
滑动操作可以用来滚动页面或列表。你可以指定起始点和结束点来执行滑动动作。
# 使用 TouchAction 实现滑动
from appium.webdriver.common.touch_action import TouchActionaction = TouchAction(driver)
action.press(x=100, y=200).move_to(x=100, y=500).release().perform()
2. 长按(Long Press)
长按某个元素或屏幕上的某一点,可以模拟用户的长按操作。
# 长按一个元素
element = driver.find_element_by_id("some_element_id")
action = TouchAction(driver)
action.long_press(el=element, duration=3000).release().perform()
3. 轻敲(Tap)
轻敲是模拟用户点击屏幕的行为,可以通过坐标或直接对元素进行轻敲。
# 对元素进行轻敲
element = driver.find_element_by_id("some_element_id")
action = TouchAction(driver)
action.tap(element=element).perform()# 通过坐标进行轻敲
action = TouchAction(driver)
action.tap(x=100, y=200).perform()
4. 缩放(Pinch and Zoom)
缩放操作涉及到两个手指的动作,通常用于放大或缩小图片或地图等内容。
- 放大(Pinch Open)
driver.execute_script('mobile: pinchOpen', {'scale': 2.0, 'velocity': -1})
- 缩小(Pinch Close)
driver.execute_script('mobile: pinchClose', {'scale': 0.5, 'velocity': 1})
请注意,这些命令可能需要特定的设置或设备支持,并且不同版本的 Appium 可能会有不同的实现方式。
5. 拖拽(Drag and Drop)
拖拽是指将一个元素从一个位置拖到另一个位置。
element1 = driver.find_element_by_id("source_element_id")
element2 = driver.find_element_by_id("destination_element_id")
action = TouchAction(driver)
action.long_press(el=element1).move_to(el=element2).release().perform()
常规操作
-
点击元素
element.click()
-
输入文本
element.send_keys("Hello World!")
-
清除文本
element.clear()
-
获取元素文本
text = element.text
-
等待元素出现
在进行元素交互之前,有时需要等待元素加载完成。可以使用显式等待:from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import Bywait = WebDriverWait(driver, 10) element = wait.until(EC.presence_of_element_located((By.ID, "resource_id")))
获取手机网络状态并进行设置
在使用 Appium 进行移动应用自动化测试时,获取和设置设备的网络连接状态是一个常见的需求。Appium 提供了相应的 API 来实现这些操作。以下是如何使用 Python 和 Appium 来获取和设置手机网络连接的具体方法。
获取手机网络连接状态
你可以使用 network_connection
方法来获取当前设备的网络连接状态。不过需要注意的是,这个功能主要适用于 Android 设备,并且需要确保设备支持相应的功能。
# 获取网络连接状态
connection_status = driver.network_connection
print(f"Current network connection status: {connection_status}")
返回的状态值是一个整数,它表示当前启用的网络类型组合。例如:
0
: No network (飞行模式)1
: Airplane Mode (飞行模式)2
: Wifi enabled4
: Data enabled6
: Wifi and Data enabled
设置手机网络连接状态
要设置设备的网络连接状态,可以使用 set_network_connection
方法。你需要传递一个表示所需网络类型的整数值或通过位运算组合多个网络类型。
from appium.webdriver.connectiontype import ConnectionType# 设置为仅开启Wi-Fi
driver.set_network_connection(ConnectionType.WIFI_ONLY)# 设置为仅开启数据连接
driver.set_network_connection(ConnectionType.DATA_ONLY)# 同时开启Wi-Fi和数据连接
driver.set_network_connection(ConnectionType.ALL_NETWORK_ON)# 开启飞行模式(关闭所有网络)
driver.set_network_connection(ConnectionType.AIRPLANE_MODE)
示例代码
下面是一个完整的示例,展示了如何获取并设置设备的网络连接状态:
from appium import webdriver
from appium.webdriver.connectiontype import ConnectionType# 配置Desired Capabilities
desired_caps = {'platformName': 'Android','deviceName': 'your_device_name','appPackage': 'your_app_package','appActivity': 'your_app_activity'
}# 初始化WebDriver
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)try:# 获取当前网络连接状态current_connection = driver.network_connectionprint(f"Initial network connection status: {current_connection}")# 设置网络连接状态为仅Wi-Fidriver.set_network_connection(ConnectionType.WIFI_ONLY)print("Set network to WIFI_ONLY")# 重新获取网络连接状态以确认更改updated_connection = driver.network_connectionprint(f"Updated network connection status: {updated_connection}")finally:# 结束会话driver.quit()
注意事项
- 权限:确保你的应用或者测试脚本有足够的权限来更改网络设置。
- 平台限制:上述方法主要用于 Android 平台。对于 iOS 平台,由于系统限制,直接修改网络设置的功能可能不被支持。
- Appium 版本:确保你使用的 Appium 版本支持这些功能,某些旧版本可能不完全支持所有的网络设置选项。
在使用 Appium 进行移动应用自动化测试时,press_keycode
方法可以用来模拟物理按键的按下操作。这对于需要与设备硬件交互的场景非常有用,比如按下音量键、返回键等。
按键操作
使用 press_keycode
press_keycode
方法允许你通过指定 Android 的键码来模拟按键操作。每个按键都有一个对应的键码值,这些值可以在 Android SDK 的 KeyEvent
类中找到。
示例代码
下面是一个简单的 Python 示例,展示了如何使用 press_keycode
来模拟按下某个按键:
from appium import webdriver# 配置Desired Capabilities
desired_caps = {'platformName': 'Android','deviceName': 'your_device_name','appPackage': 'your_app_package','appActivity': 'your_app_activity'
}# 初始化WebDriver
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)try:# 模拟按下返回键(键码为4)driver.press_keycode(4)print("Back button pressed")# 模拟按下Home键(键码为3)driver.press_keycode(3)print("Home button pressed")# 模拟按下音量加键(键码为24)driver.press_keycode(24)print("Volume up button pressed")# 模拟按下音量减键(键码为25)driver.press_keycode(25)print("Volume down button pressed")finally:# 结束会话driver.quit()
常用键码
以下是一些常用的 Android 键码及其对应的按键:
- 返回键:
4
- Home键:
3
- 菜单键:
82
- 音量增加:
24
- 音量减少:
25
- 电源键:
26
- 相机键:
27
- 搜索键:
84
传递额外参数
有时候你可能需要传递额外的参数,比如 metastate
(元状态),用于组合按键(如 Shift + A)。你可以通过传递额外的参数来实现这一点:
# 按下组合键(例如Shift+A)
driver.press_keycode(29, metastate=64) # 29 是 'A' 键,64 是左 Shift 键的状态
注意事项
- 确保设备连接:确保你的设备已经正确连接,并且可以通过
adb devices
命令识别到。 - 权限问题:某些按键(如电源键)可能需要特殊的权限或设备处于解锁状态才能正常工作。
- Appium 版本:确保你使用的 Appium 版本支持这些功能,某些旧版本可能不完全支持所有的按键操作。
iOS 设备
对于 iOS 设备,由于系统限制,直接模拟物理按键的功能较少。不过,你可以使用其他方法来实现类似的效果,例如通过 execute_script
方法执行特定的 JavaScript 脚本来触发某些行为。
获取通知栏并进行操作
在使用 Appium 进行移动应用自动化测试时,直接操作通知栏并不是其核心功能之一。不过,Appium 提供了一些方法来与设备的通知系统进行交互,特别是在 Android 设备上。对于 iOS 设备,由于系统的封闭性和限制,直接通过 Appium 操作通知栏的功能较为有限。
在 Android 上打开通知栏
在 Android 上,你可以使用 open_notifications()
方法来打开通知栏,并与其中的通知进行交互。以下是如何使用 Python 和 Appium 来实现这一功能的详细步骤和示例代码。
示例代码
下面是一个完整的示例,展示了如何使用 open_notifications
方法来打开通知栏,并与特定的通知进行交互:
from appium import webdriver# 配置Desired Capabilities
desired_caps = {'platformName': 'Android','deviceName': 'your_device_name','appPackage': 'your_app_package', # 如果需要启动一个特定的应用'appActivity': 'your_app_activity', # 如果需要启动一个特定的应用'noReset': True # 防止重置应用状态
}# 初始化WebDriver
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)try:# 打开通知栏driver.open_notifications()print("Notifications panel opened")# 查找并点击某个特定的通知(假设通知文本包含 "Your Notification Text")notification = driver.find_element_by_xpath('//android.widget.TextView[contains(@text, "Your Notification Text")]')notification.click()print("Notification clicked")# 可以在此处添加更多操作,比如验证是否正确跳转到目标页面等finally:# 结束会话driver.quit()
注意事项
-
确保通知存在:在尝试与通知交互之前,确保目标通知已经存在于通知栏中。可以通过手动触发通知或等待一段时间来确保通知已显示。
-
定位通知元素:通知栏中的元素可能具有动态内容,因此使用固定的资源ID可能不总是有效。通常情况下,可以使用文本内容(如上面示例中的 XPath)来定位通知。
-
权限问题:确保你的应用或测试脚本有足够的权限来访问通知栏。某些设备或系统版本可能需要额外的权限设置。
iOS 设备上的通知操作
对于 iOS 设备,由于系统的封闭性,直接通过 Appium 操作通知栏的功能非常有限。目前没有直接的方法可以通过 Appium 打开通知中心或与通知进行交互。不过,你仍然可以通过模拟用户的手势(例如从屏幕顶部向下滑动来打开通知中心),但这并不是直接操作通知的方式。
模拟手势打开通知中心(iOS)
尽管不能直接操作通知栏,但你可以尝试通过模拟手势来打开通知中心:
from appium.webdriver.common.touch_action import TouchAction# 创建TouchAction实例
action = TouchAction(driver)# 从屏幕顶部向下滑动来打开通知中心
action.press(x=100, y=50).move_to(x=100, y=500).release().perform()
请注意,这种方法的效果可能因设备型号、屏幕尺寸以及 iOS 版本的不同而有所差异。
总结
- Android:使用
driver.open_notifications()
方法可以直接打开通知栏,并通过标准的元素定位方法与通知进行交互。 - iOS:由于系统限制,无法直接通过 Appium 操作通知栏,但可以通过模拟手势来尝试打开通知中心。