- current_package,包名,aapt,元素定位给
- current_activity,后面切换有用,==>url
- context,上下文,web窗口切换,h5测试,获取上下文,driver.switch_to.context
- contexts,所有的上下文,==>window_handlers
- current_context,获取现在的上下文,获取当前窗口current_window_handler
- page_source,源代码,html,driver.page_source
- capabilities
- device_time,设备时间
- location,定位
# 获取现在的app页面的名称 print(driver.current_activity) # 获取现在的app页面的源代码 xml print(driver.page_source) # 定位 print(driver.location) # 获取caps参数信息 print(driver.capabilities) # 获取窗口大小,屏幕尺寸 print(driver.get_window_size())2.获取元素属性
- el.rect,获取元素的尺寸,包括元素的宽度高度和起始点的坐标
- el.text,获取元素的文本
- el.get_attribute(),获取元素的属性值
el = driver.find_element("id", "com.lemon.lemonban:id/navigation_my") # 获取元素的文本 print(el.text) # 获取元素的尺寸,包含元素的高度宽度和起始点的坐标 print(el.rect)3.用户 *** 作
- el.click()
- el.send_keys(),注意,appium中输入中文,必须要配置caps中的参数
"unicodeKeyboard": True, "resetKeyboard": True, 使用真机 *** 作时,需要修改手机配置的输入法后再进行输入
- tap,相当于全局的click,适合封装在basepage中
- move_to
- press
- long_press
- release
- wait
- flick
- driver.swipe()
在 Appium 中提供 swipe() 方法来模拟用户滑动屏幕。
swipe() 实现过程 是先通过在屏幕上标记两个坐标,然后再从开始坐标移动到结束坐标。
time.sleep(10) # 滑动 *** 作 # get_window_size()获取屏幕尺寸 width = driver.get_window_size()['width'] height = driver.get_window_size()['height'] driver.swipe(start_x=width * 0.9, start_y=height * 0.5, end_x=width * 0.1, end_y=height * 0.5) driver.swipe(start_x=width * 0.9, start_y=height * 0.5, end_x=width * 0.1, end_y=height * 0.5) driver.swipe(start_x=width * 0.9, start_y=height * 0.5, end_x=width * 0.1, end_y=height * 0.5)
封装basepage代码:
class Page: def __init__(self, driver): self.driver = driver def width(self): """获取app的宽度""" return self.driver.get_window_size()['width'] def height(self): """获取app的高度""" return self.driver.get_window_size()['height'] def swipe_left(self): """从右往左滑动""" width = self.width() height = self.height() self.driver.swipe(start_x=width * 0.9, start_y=height * 0.5, end_x=width * 0.1, end_y=height * 0.5) def swipe_right(self): """从左往右滑动""" width = self.width() height = self.height() self.driver.swipe(start_x=width * 0.1, start_y=height * 0.5, end_x=width * 0.9, end_y=height * 0.5) def swipe_up(self): """从下往上滑动""" width = self.width() height = self.height() self.driver.swipe(start_x=width * 0.5, start_y=height * 0.9, end_x=width * 0.5, end_y=height * 0.1) def swipe_down(self): """从上往下滑动""" width = self.width() height = self.height() self.driver.swipe(start_x=width * 0.5, start_y=height * 0.1, end_x=width * 0.5, end_y=height * 0.9)
调用封装方法:
Page(driver).swipe_left()6.按键 *** 作
先通过功能查对应的事件数字
driver.press_keycode(8)
按键的数字代表的意义可参考:
Appium---Android的keycode键值 - 简书
但是这样可读性很差,谁知道这个数字具体是什么意思呢?可以进行封装,增强可读性:
封装类:
class MobileKey: ENTER = 66 VOLUME_UP = 24 HOME = 3
调用封装类及属性:
driver.press_keycode(MobileKey.VOLUME_UP)7.toastd框
前提
登录:Toast是viewer识别不到的,但是我们需要确认文本是否正确。
- appium server 1.6.3以上
- 代码中必须定制automationName为:UiAutomator2
- UiAutomator2只支持安卓版本5.0+
- jdk1.8 64位以上,配置JAVA_HOME环境变量
定位表达式
- xpath定位://*[contains(@text,'手机号码格式不正确')]
- find_element("xpath","//android.widget.Toast")
# 出现toastd框 el = driver.find_element('xpath', '//android.widget.Toast') assert el.text == "手机号码格式不正确"8.start_activity进入页面
app的路径依赖是很严重的,如果需要测试某个单纯的页面,但是进入这个页面有很长的路径,则会严重影响效率,而且路径过长,会让测试程序不稳定。
start_activity可以快速进入指定界面,只需要指定activity的名称。
获取当前页面的名称:
adb shell dumpsys activity | find "mResumedActivity"
driver.start_activity('com.lemon.lemonban','.activity.LoginActActivity')
9.混合应用测试Hybrid App原生应用是使用系统原生的组件开发的app,需要特定的语言,比如android的java,ios的swift。
H5技术可以使用web技术开发app,原生和h5的组合就成了混合应用。
混合应用不是在app上直接写html页面,而是把H5页面放在一个webview控件当中。
webview是原生应用的一种控件,还有其他的imageview等等。webview能做到和web页面交互的功能。
常用的混合应用技术框架有:
- Cordova Apache
- React Native,RN
- Ionic
- Flutter,谷歌出的
如何判断进入一个web网页:
- 进度条
- 下拉页面,背面会出现一个网址
- 有 X 图标
- 通过辅助工具观察class是否为webview
- 通过远程的网页定位工具(1.谷歌浏览器输入chrome://inspect;2.uc-devtools UC 开发者调试工具及使用;3.edge浏览器输入edge://inspect;三种都可以)是发现是不是进入webview最可靠的工具
注意点:
使用uc-devtools工具时【设置】选择:本地 Devtools Inspector UI 资源
混合应用测试准备条件:
- apk设置,找开发开启webview调试模式。app设置setWebContentsDebuggingEnabled=True
- Webdriver/chromedriver.exe(安卓内置谷歌内核,网页定位工具有显示手机端浏览器的版本号,下载的驱动版本号需要与手机端保持一致)
- 调试工具
测试的步骤:
- 先是原生界面的 *** 作
- 某个时刻,进入了webview,此时就需要进行切换,从原生到webview
- 进行网页 *** 作
- 退回到原生环境,webview切换到原生界面
案例:
import time from appium.webdriver import Remote caps = { "platformName": "Android", "udid": "emulator-5554", "app": r"D:lemon_app_webview_debug.apk", "chromedriverExecuteDir": r"D:PycharmProjectschromedriver" } driver = Remote(command_executor='http://127.0.0.1:4723/wd/hub', desired_capabilities=caps) # 隐性等待 driver.implicitly_wait(10) # 找到师资团队的按钮 driver.find_element('xpath', '//*[@text="师资团队"]').click() # 进入到webview网页环境 print(driver.contexts) driver.switch_to.context("WEBVIEW_com.lemon.lemonban") # driver.switch_to.context(driver.contexts[-1]) # 切换到的webview环境,此时driver表示浏览器 driver.find_element('xpath', "//*[@id='m-header__nav']").click() time.sleep(3) driver.quit()
注意事项:
- chromedriver根据版本下载到某个目录
- caps中使用属性chromedriverExecuteDir指定驱动的目录,如
"chromedriverExecuteDir": r"D:PycharmProjectschromedriver"
- 当从原生进入到网页后,driver.switch_to.context()
小程序和公众号 网页:
- 在微信的原生页面 *** 作
- 当点击进入小程序后,进行小程序环境(网页)
- 切换 driver.switch_to.context()
- 网页的自动化测试
- 元素定位,id,text,xpath
- 辅助工具,appium inspector,uiautomatorviewer
- 点击,输入 *** 作,swipe(封装),toast,start_activity
- 混合应用
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)