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
安装 Appium 客户端
1 pip install Appium-Python-Client
运行服务端
安装驱动
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 webdriverfrom 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 MobileByfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECelement = 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 MobileByelement = 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 MobileByfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECtry : 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 webdriverfrom appium.options.android import UiAutomator2Optionsfrom appium.webdriver.common.appiumby import AppiumByfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECcapabilities = 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 pytestfrom appium import webdriverfrom appium.options.android import UiAutomator2Optionsfrom appium.webdriver.common.appiumby import AppiumByfrom selenium.webdriver.support.ui import WebDriverWaitfrom 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()