一,Android纯web页面的测试
1,环境准备
手机端:
- 被测浏览器:(不可以是第三方浏览器) 'Safari' for iOS and 'Chrome', 'chromium', or 'brower' for Android.
PC端:
- 安装Chrome浏览器(或Chromium),并且能访问https://www.google.com
- 下载对应手机浏览器的driver版本
(1)国内镜像地址:http://npm.taobao.org/mirrors/chromedriver/
(2)国内镜像地址:http://chromedriver.storage.googleapis.com/index.html
客户端代码:
- desirecapability
(1) "browser" = "Brower" 或者 "browser" = "Chrome"
(2) "chromedriverExecutable" = "指定driver地址"(如果没有这一项,需要把下载的chromedriver放在默认目录下)
2,查看Chrome版本
1,通过adb命令(这种方式不适于被封装的自带浏览器)
adb shell pm list package |findstr chrome
adb shell pm dump com.android.chrome |findstr version
2,通过Chrome浏览器的inspect工具
浏览器打开:chrome://inspect
3,用例示例
import pytest
from appium import webdriver
from hamcrest import *
class Test01(object):
def setup(self):
desired_caps = {
"platformName": "Android",
"deviceName": "127.0.0.1:5555", # 设备
"platformVersion": "6.0",
"browserName": "Browser",
"noReset": "True", # 不重置APP
"chromedriverExecutable": "/driver/chromedriver"
}
self.driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)
self.driver.implicitly_wait(60) # 隐式等待
def teardown(self):
self.driver.quit()
def test_01(self):
"""搜索"""
self.driver.get("http://m.baidu.com")
self.driver.find_element_by_id("index-kw").click()
self.driver.find_element_by_id("index-kw").send_keys("appium")
search_locator = (By.ID, "index-bn")
WebDriverWait(self.driver, 10).until(expected_conditions.visibility_of_element_located(search_locator)) # 显式等待
self.driver.find_element(*search_locator).click()
二,Android混合页面的测试(在原生app中嵌入H5)
1,如何判断页面时webview
- 断网查看
- 看加载条
- 看顶部是否又关闭按钮
- 下拉刷新 页面是否刷新
- 下拉刷新 的时候有网页提供方
- 用工具查看(appium inspector工具查看,包含webview元素)
2,前提条件
PC:
- 浏览器能访问https://www.google.com
- 下载chromedriver对应版本
手机端
- 应用代码需要打开webview开关(所以只能用debug包,或者让开发给留个后门,传某个字段就打开webview开关)
ps: 部分模拟器用andriod6.0版本可能不需要打开webview开关
客户端代码
- desirecapability
(1)appPackage, appActivity
(2) "chromedriverExecutable" = "指定driver地址"(如果没有这一项,需要把下载的chromedriver放在默认目录下)
3,切换上下文
1,切换到列表的最后一个
self.driver.contexts # 当前context
self.driver.switch_to.context(self.driver.contexts[-1])
2,或者可以在操作前后达到上下文列表,操作后,判断不在列表中的进行切换;
三,可能遇到的坑
1,设备
- android模拟器6.0默认支持webview操作(部分不可以,比如mumu,genimotion和sdk自带的emulator可以)
- 其他模拟器和物理机需要打开app内开关(webview调试开关)
WebView.setWebContentsDebuggingEnabled( true );
2,PC浏览器定位元素
- chrome浏览器-Chrome62可以更哈的看见webview的内部
- 换成chromium可以避免很多坑,展示效果和速度比chrom要快
3,代码
- 有的设备可以直接用find_element_by_accessibility_id(),不同的设备渲染的页面不同,兼容性不合适
- switch_to.context()
- switch_to.window()
4,chromedriver放置位置
- 放在默认目录下
- desirecapability设置:"chromedriverExecutable" = "指定driver地址"
- 如果不同app的内置版本不一致导致有多个版本的chromedriver
(1)可设置desirecapability:
"chromedriverExecutableDir" : "放置多个版本的目录文件夹"
"chromedriverChromeMappingFile" : "对应关系json文件"
(2)创建一个对应关系json文件在项目目录下,内容格式为:
{
"2.42": "63.0.3239",
"2.41": "62.0.3202"
}