Appium2.0:发生了哪些重大厘革?

打印 上一主题 下一主题

主题 989|帖子 989|积分 2967

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Appium2.0发生了哪些厘革

1. 平台驱动独立

在Appium 2.0中,平台驱动(driver)与Appium Server实现了分离。这意味着驱动可以独立安装和升级,不再依靠于Appium Server的更新。例如,Android平台的UIAutomator和iOS平台的XCUITest等驱动,都可以根据需要单独举行安装和更新。这一厘革提高了Appium的灵活性和可扩展性,使得开发者能够更容易地应对不同平台和设备的测试需求。
2. 插件生态体系的引入

Appium 2.0引入了插件生态体系,将一些非焦点组件功能转移到了插件中。这不仅简化了Appium的焦点功能,还使得开发者能够通过插件扩展更多的新功能。例如,通过官方的images插件,开发者可以使用图像识别来定位元素;而使用第三方插件appium
-device-farm,则可以集中管理测试设备。插件生态体系的引入为Appium带来了更多的大概性和灵活性。
3. 严格遵照W3C协议

Appium 2.0严格遵照W3C协议,与Selenium 4类似。这意味着在编写测试脚本时,需要遵照W3C标准来填写capabilities。例如,在Appium 2.0中,非标准的W3C协议中的capabilities需要添加appium
:前缀。这一厘革使得Appium更加符合国际标准,提高了与其他测试工具的兼容性。
4. 安装与配置的厘革

Appium 2.0的安装和配置也发生了一些厘革。首先,Appium 2.0需要基于Node.js情况举行安装,并对Node.js的版本有特定要求。其次,在安装Appium 2.0时,需要使用appium
@next参数举行安装(在正式发布后可使用appium
参数)。此外,Appium 2.0还引入了Appium Extension CLI模式,用于扩展安装各种平台驱动和插件。
5. 测试脚本的编写与运行

在Appium 2.0中,测试脚本的编写与运行也发生了一些厘革。首先,由于Appium Server的访问地点发生了厘革(不再需要后缀/wd/hub),因此需要更新测试脚本中的访问地点。其次,由于Appium 2.0引入了插件和驱动分离的概念,因此需要根据需要安装和配置相应的驱动和插件。最后,由于Appium 2.0严格遵照W3C协议,因此需要更新测试脚本中的capabilities格式,以确保与Appium Server的兼容性。
情况搭建


  • 安装Node.js
    首先,确保你的体系上安装了Node.js。可以从Node.js官网下载并安装最新版本的Node.js。
  • 安装Appium
    使用npm安装Appium。打开下令行工具,输入以下下令:
    1. npm install -g appium
    复制代码
    这将全局安装Appium,使其可以在下令行中直接使用。
  • 安装Appium客户端库
    根据你选择的编程语言,安装相应的Appium客户端库。例如,如果你使用Python,可以安装Appium-Python-Client:
    1. pip install Appium-Python-Client
    复制代码
  • 启动Appium服务器
    在下令行中输入以下下令启动Appium服务器:
    1. appium
    复制代码
    大概,你也可以使用Appium Desktop,一个图形化工具,用于启动和管理Appium服务器,以及举行元素定位和调试。
基本使用方法


  • 设置Desired Capabilities
    Desired Capabilities是一个JSON对象,用于描述测试会话的配置信息,如平台名称、设备名称、应用路径等。以下是一个示例:
    1. {
    2.   "platformName": "Android",
    3.   "platformVersion": "10",
    4.   "deviceName": "emulator-5554",
    5.   "app": "/path/to/your/app.apk",
    6.   "appPackage": "com.example.app",
    7.   "appActivity": ".MainActivity"
    8. }
    复制代码
  • 初始化Appium Driver
    使用Appium客户端库初始化Appium Driver,并毗连到Appium服务器。以下是一个Python示例:
    1. from appium
    2. import webdriverfrom appium
    3. .options.common.base import AppiumOptionsoptions = AppiumOptions()options.load_capabilities({  'platformName': 'Android',  'platformVersion': '10',  'deviceName': 'emulator-5554',  'app': '/path/to/your/app.apk',  'appPackage': 'com.example.app',  'appActivity': '.MainActivity'}) driver = webdriver.Remote('http://localhost:4723/wd/hub', options=options)
    复制代码
  • 定位元素
    Appium支持多种元素定位方式,如通过ID、Name、XPath、Class Name等。以下是一些常用的定位方式:

    • 通过图片定位:
      1. # 将图像文件转换为base64编码的字符串
      2. def image_to_base64(image_path, format='.png'):
      3.     with open(image_path, "rb") as image_file:
      4.         encoded_string = base64.b64encode(image_file.read()).decode('utf-8')
      5.     return format.format(**{'base64': encoded_string})
      6. # 图像文件的路径
      7. image_path = 'path/to/your/image.png'
      8. # 转换为base64字符串
      9. base64_image = image_to_base64(image_path)
      10. element = driver.find_element(by=AppiumBy.IMAGE, value=base64_image)
      复制代码
    • 通过ID定位:
      1. element = driver.find_element(by=AppiumBy.ID, value='ID')
      复制代码
    • 通过Name和Accessibility ID定位:
      1. element = driver.find_element(by=AppiumBy.ACCESSIBILITY_ID, value='ACCESSIBILITY_ID')
      2. element = driver.find_element(by=AppiumBy.NAME, value='NAME')
      复制代码
    • 通过XPath定位:
      1. element = driver.find_element(by=AppiumBy.XPATH, value='//*[@text="xpath"]')
      复制代码
    • 通过Class Name定位(注意:这里使用的是CSS选择器语法):
      1. element = driver.find_element_by_css_selector("button[class='btn-class']")
      复制代码
    • 汇总:
      1. ID = "id"XPATH = "xpath"LINK_TEXT = "link text"PARTIAL_LINK_TEXT = "partial link text"NAME = "name"TAG_NAME = "tag name"CLASS_NAME = "class name"CSS_SELECTOR = "css selector"IOS_PREDICATE = '-ios predicate string'IOS_CLASS_CHAIN = '-ios class chain'ANDROID_UIAUTOMATOR = '-android uiautomator'ANDROID_VIEWTAG = '-android viewtag'ANDROID_DATA_MATCHER = '-android datamatcher'ANDROID_VIEW_MATCHER = '-android viewmatcher'ACCESSIBILITY_ID = 'accessibility id'IMAGE = '-image'CUSTOM = '-custom'# For Flutter integration usage https://github.com/AppiumTestDistribution/appium
      2. -flutter-integration-driver/tree/mainFLUTTER_INTEGRATION_SEMANTICS_LABEL = '-flutter semantics label'FLUTTER_INTEGRATION_TYPE = '-flutter type'FLUTTER_INTEGRATION_KEY = '-flutter key'FLUTTER_INTEGRATION_TEXT = '-flutter text'FLUTTER_INTEGRATION_TEXT_CONTAINING = '-flutter text containing'
      复制代码

  • 模拟用户操作

    • 点击操作:
      1. element.click()
      2. dirver.tap([(400, 400)], 1000) #按坐标点击,(400,400)是坐标点,1000是点击时长
      复制代码
    • 输入操作:
      1. element.clear()  # 清空输入框
      2. element.send_keys("Hello World")  # 输入文本
      复制代码
    • 获取元素信息:
      1. text = element.text  # 获取元素的文本内容
      2. location = element.location  # 获取元素的位置
      3. size = element.size  # 获取元素的大小
      4. attribute = element.get_attribute("attribute_name")  # 获取元素的属性值
      5. id = element.id # 获取元素id
      6. parent = element.parent # 获取父级元素
      7. accessible_name = element.accessible_name # 获取元素accessible_name
      8. # 其他信息可查看源码
      复制代码

  • 滑动页面
    TouchAction在Appium2.0以后已经被弃用了:
    1. # appium
    2. 2.0前action = TouchAction(driver)action.press(x=100, y=150).move_to(x=100, y=500).release().perform()# appium
    3. 2.0后element = driver.find_element(by=AppiumBy.ID, value='ID')
    4. actions = ActionChains(driver)actions.move_to_element(element)actions.click(hidden_submenu)actions.perform()
    复制代码
  • 等待元素加载
    在自动化测试中,经常需要等待某个元素加载出来后再举行操作。Appium支持多种等待方式:

    • 固定等待:
      1. import time
      2. time.sleep(10)  # 等待10秒
      复制代码
    • 表现等待:
      1. from selenium.webdriver.support.ui import WebDriverWait
      2. from selenium.webdriver.support import expected_conditions as EC
      3. wait = WebDriverWait(driver, 10)
      4. element = wait.until(EC.visibility_of_element_located(("id", "your_element_id")))
      复制代码
    • 隐式等待:
      1. driver.implicitly_wait(10)  # 设置隐式等待时间为10秒
      复制代码

  • 获取手机截图和网络状态

    • 获取手机截图:
      1. driver.get_screenshot_as_file("screenshot.png")
      2. driver.get_screenshot_as_base64("screenshot.png")
      3. driver.get_screenshot_as_png("screenshot.png")
      4. driver.fullscreen_window("screenshot.png")
      5. driver.get_screenshot_as_file("screenshot.png")
      6. element.screenshot("screenshot.png")
      复制代码
    • 获取网络状态:
      1. network_connection = driver.network_connection
      2. print(f"Current network connection: {network_connection}")
      3. # 设置网络状态
      4. driver.set_network_connection(1)  # 设置为WiFi连接
      复制代码

  • 模拟键盘操作和手机关照栏操作

    • 模拟键盘操作:
      1. driver.press_keycode()  # 按下手机物理键
      复制代码
    • 手机关照栏操作:
      1. driver.open_notifications()  # 打开通知栏
      复制代码

示例代码:启动Android模拟器并举行基本测试

以下是一个完整的Python示例代码,用于启动一个Android模拟器并举行基本的自动化测试:
  1. from appium
  2. import webdriverfrom appium
  3. .options.common.base import AppiumOptionsfrom appium
  4. .webdriver.common.appium
  5. by import AppiumByimport time # 设置optionsoptions = AppiumOptions()options.load_capabilities({  'platformName': 'Android',  'platformVersion': '10',  'deviceName': 'emulator-5554',  'app': '/path/to/your/app.apk',  'appPackage': 'com.example.app',  'appActivity': '.MainActivity',  'resetKeyboard': True,  # 重置设备的输入键盘  'unicodeKeyboard': True  # 接纳unicode编码输入}) # 初始化Appium Driverdriver = webdriver.Remote('http://localhost:4723/wd/hub', options=options) try:  # 等待应用加载  time.sleep(5)   # 通过ID定位元素并点击  element = driver.find_element(by=AppiumBy.XPATH, value='//*[@text="xpath"]')
  6.   element.click()   # 通过XPath定位元素并输入文本  input_element = driver.find_element(by=AppiumBy.XPATH, value='//*[@text="xpath"]')
  7.   input_element.clear()  input_element.send_keys("Hello World")   # 获取元素的文本内容并打印  text = input_element.text  print(f"输入框元素的文本信息是: {text}") finally:  # 关闭驱动  driver.quit()
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用户国营

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表