Appium萌新教程智障版

本教程最终实现目标:让智障会使用appium实现app自动化,并写出pytest脚本

0x01 : 环境配置

需要的软件
1
2
3
4
5
1.nodejs
2.pycharm
3.python
4.jdk
5.adb (https://developer.android.com/tools/releases/platform-tools?hl=zh-cn)

官网:https://appium.io/docs/en/latest/quickstart/install/

仓库地址:https://github.com/appium/appium

安装步骤

安装Appium

1
npm install -g appium

安装 Appium 客户端

1
pip install Appium-Python-Client

运行服务端

1
appium

安装驱动

1
appium driver install uiautomator2

运行测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from appium import webdriver
from appium.webdriver.common.mobileby import MobileBy
'''
- **platformName**: 测试平台名称,例如 'Android' 或 'iOS'。
- **platformVersion**: 操作系统版本,例如 '11.0'。
- **deviceName**: 设备名称或设备 ID,例如 'MyDevice'。
- **app**: 应用程序的路径(绝对路径)或包名。对于 iOS,可以是 .ipa 文件路径;对于 Android,可以是 .apk 文件路径。
- **appPackage**: Android 应用的包名。例如,'com.example'.
- **appActivity**: Android 应用的主活动名称。例如,'.MainActivity'。
- **automationName**: 自动化框架名称,例如 'UiAutomator2'(Android)或 'XCUITest'(iOS)
'''
desired_caps = {
'platformName': 'Android',
'platformVersion': '11.0',
'deviceName': 'MyDevice',
'appPackage': 'com.example',
'appActivity': '.MainActivity',
'automationName': 'UiAutomator2'
}

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

# 关闭驱动
driver.quit()

常见错误:

1
2
3
1.首次运行会安装apk 到手机中,若安装失败则直接手动安装即可
2.手机需要启动usb调试
3.启动时对应的参数错误 (安卓版本信息,包名错误,activity错误...等)

获取包名,activity,手机信息

1
2
3
4
5
6
7
8
9
10
11
#包名:
1) 获取到第三方安装包
adb shell pm list package -3 -f

#activity
adb shell logcat *:S ActivityManager:V
adb shell dumpsys activity recents |find "intent={"

#(安卓版本信息
手机中查看

0x02 : 定位元素找到对应元素属性

appium-inspector

帮助文档:https://appium.io/docs/en/latest/guides/caps/

1
2
3
#必填项:
platformName 托管应用程序或浏览器的平台类型
automationName 要使用的 Appium 驱动程序的名称

demo实例

1
2
automationName       uiautomator2
platformName android

运行软件 > 点击启动会话即可

0x03 : 操作元素

通过元素属性定位元素

1
2
3
4
5
6
7
8
9
ID:使用元素的唯一 ID,例如 driver.find_element_by_id("element_id")。

XPath:使用元素的 XPath 路径,例如 driver.find_element_by_xpath("//tagname[@attribute='value']")。

Class Name:根据元素的类名定位,例如 driver.find_element_by_class_name("classname")。

Accessibility ID:利用可访问性 ID,例如 driver.find_element_by_accessibility_id("accessibility_id")。

Name:根据元素的名称进行定位,例如 driver.find_element_by_name("name")。

等待元素出现

1
2
3
4
5
6
7
8
from appium.webdriver.common.mobileby import MobileBy
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 等待元素出现,最长等待 10 秒
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((MobileBy.ID, "element_id"))
)

点击元素

1
2
3
4
5
6
7
from appium.webdriver.common.mobileby import MobileBy

# 定位元素
element = driver.find_element(MobileBy.ID, "element_id")

# 点击元素
element.click()

判断元素是否出现等操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from appium.webdriver.common.mobileby import MobileBy
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

try:
# 等待元素出现,最长等待 10 秒
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((MobileBy.ID, "element_id"))
)
# 点击元素
element.click()
except TimeoutException:
# 如果超时则进行其他操作
print("元素未出现,执行其他操作")
# 这里添加你希望执行的其他操作

整体demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
from appium import webdriver
from appium.options.android import UiAutomator2Options
from appium.webdriver.common.appiumby import AppiumBy
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

capabilities = dict(
platformName='Android',
automationName='uiautomator2',
deviceName='V1938T',
appPackage='com.ophone.reader.ui',
appActivity='com.cmread.bplusc.bookshelf.LocalMainActivity',
language='en',
locale='US',
)

appium_server_url = 'http://localhost:4723'
#启动程序
driver=webdriver.Remote(appium_server_url, options=UiAutomator2Options().load_capabilities(capabilities))
#等待元素出现
Agree_Buttun = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((AppiumBy.ID, "com.ophone.reader.ui:id/tv_sure"))
)
#点击元素
Agree_Buttun.click()
#等待随便看看按钮出现
pass_buttun = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((AppiumBy.XPATH, '(//android.widget.ImageView[@resource-id="com.ophone.reader.ui:id/iv_next"])[5]'))
)
#点击随便看看
pass_buttun.click()
#等待弹窗出现

Dwindows = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((AppiumBy.ID, 'com.ophone.reader.ui:id/member_expiration_reminder_close'))
)
#关闭痰喘
Dwindows.click()

#点击分类按钮
select_l = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((AppiumBy.XPATH, '(//android.widget.ImageView[@resource-id="com.ophone.reader.ui:id/fixed_bottom_navigation_anim"])[3]'))
)
select_l.click()

pytest版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import pytest
from appium import webdriver
from appium.options.android import UiAutomator2Options
from appium.webdriver.common.appiumby import AppiumBy
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

@pytest.fixture(scope="module")
def driver():
capabilities = dict(
platformName='Android',
automationName='uiautomator2',
deviceName='V1938T',
appPackage='com.ophone.reader.ui',
appActivity='com.cmread.bplusc.bookshelf.LocalMainActivity',
language='en',
locale='US',
)

appium_server_url = 'http://localhost:4723'
driver = webdriver.Remote(appium_server_url, options=UiAutomator2Options().load_capabilities(capabilities))
yield driver
driver.quit()

#是测试函数,执行你之前的测试步骤。
def test_interact_with_app(driver):
# 等待元素出现
agree_button = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((AppiumBy.ID, "com.ophone.reader.ui:id/tv_sure"))
)
# 点击元素
agree_button.click()

# 等待随便看看按钮出现
pass_button = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((AppiumBy.XPATH, '(//android.widget.ImageView[@resource-id="com.ophone.reader.ui:id/iv_next"])[5]'))
)
# 点击随便看看
pass_button.click()

# 等待弹窗出现
windows = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((AppiumBy.ID, 'com.ophone.reader.ui:id/member_expiration_reminder_close'))
)
# 关闭弹窗
windows.click()

# 点击分类按钮
select_l = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((AppiumBy.XPATH, '(//android.widget.ImageView[@resource-id="com.ophone.reader.ui:id/fixed_bottom_navigation_anim"])[3]'))
)
select_l.click()