【Appium】 课程全笔记(录播+直播课)链接:
Appium基础3(手势操作和uiautomator查找元素)
webview
纯webview测试(只测试浏览器)的环境准备
- 手机端
- 被测浏览器:(不可以是第三番浏览器)safari for ios and chrome,chromium,or browser for Android
- PC端
- 安装chrome浏览器或者chromium
- 下载对应手机浏览器对应的driver
- 客户端代码:
- desire_cap
- “browserName”:“Browser” 或者 “browserName”:“Chrome” 这个是指定的浏览器
- “chromedriverExecutable”:r"c:\chrome\chromedriver.exe" 这个是指定的chromedriver的路径
- desire_cap
- 如何查找app的版本:adb shell pm dump com.android.browser | findstr version
案例:打开mumu自带的浏览器,访问百度
- 步骤:
- 不通过包来打开浏览器
- 访问百度
- 输入tongtong,并点击搜索
- 注:
- 第一次运行appium,看后台的路径可以找到浏览器的chromedriver的版本,还可以找到 chromedriver的路径
- selenium之 chromedriver与chrome版本映射表(更新至v2.46)_huilan_same的博客-CSDN博客 这个网站的chromedriver和chrome版本的关系更加全
代码
from time import sleep
from appium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
class TestFind():
def setup(self):
self.desire_cap= {
"platformName":"android",
"platformVersion":"6.0",
"deviceName":"127.0.0.1:7555",
#想要使用原生的浏览器就选择,Browser。想要选择chrome浏览器就输入Chrome
"browserName":"Browser",
"noRest":True,
#这里是指定chromedriver的路径,记得路径要全到包括chromedriver.exe
"chromedriverExecutable":r"c:\chrome\chromedriver.exe"
}
self.driver=webdriver.Remote("http://127.0.0.1:4723/wd/hub",self.desire_cap)
self.driver.implicitly_wait(5)
def teardown(self):
self.driver.quit()
def test_browser(self):
#打开移动端的百度浏览器
self.driver.get("http://m.baidu.com")
#显示等待找到搜索框是否可见,expected_conditions里面传的locator必须是一个元祖
WebDriverWait(self.driver,10).until(expected_conditions.visibility_of_element_located((By.CSS_SELECTOR,"#index-kw")))
#搜索框输入tongtong
self.driver.find_element(By.CSS_SELECTOR,"#index-kw").send_keys("tongtong")
sleep(2)
#百度一下点击一下
self.driver.find_element(By.CSS_SELECTOR, "#index-bn").click()
sleep(3)
如何判断页面是不是webview
- 断网查看,如果断网显示网页加载不了就是webview
- 看加载条,有加载条通常是webview
- 看顶部是否有关闭按钮
- 下拉刷新,页面有刷新就是webview
- 下拉刷新的时候是否有网页提供者
- 用工具查看,如果元素显示webview,则是webview
Webview
- 是android系统提供能显示页面的系统控件(特殊的view)
- < android4.4 webview底层实现webkit内部
-
=android4.4 采用chromium作为webview底层支持,支持html5,css3,js
- webaudio:图形化的界面收听音频
- webGL:页面3d效果的渲染
- webRTC:直播等等,美颜
混合webview测试条件
- PC:
- 能够访问google
- 下载对应版本的chromedriver
- 手机端:应用代码需要打开webview的开关
- 代码中要添加chromedriverExecutable
- 有一些webview可以被uiautomatorview查找到,但都不推荐,可能会出现兼容性的问题,比如text的显示字符串会不一样
- 如何查找当前webview的网页
- adb shell
- logcat | grep http
- 就能找到访问的http了
案例1 appium的api的混合webview
- 打开api demo的webview
- 向输入框输入文本
- 点击i am link
- 退出应用
代码
from time import sleep
from appium import webdriver
from appium.webdriver.common.mobileby import MobileBy
class TestFind():
def setup(self):
self.desire_cap= {
"platformName":"android",
"platformVersion":"6.0",
"deviceName":"127.0.0.1:7555",
"noRest":True,
"appPackage": "io.appium.android.apis",
"appActivity":"io.appium.android.apis.view.WebView1",
#想要切换webview,必须得指定chromdriver,或者你的默认地址的chromedriver的版本和手机的版本是对应的
"chromedriverExecutable": r"c:\chrome\chromedriver.exe"
}
self.driver=webdriver.Remote("http://127.0.0.1:4723/wd/hub",self.desire_cap)
self.driver.implicitly_wait(5)
def teardown(self):
self.driver.quit()
def test_appium_api_webview(self):
sleep(3)
#进入到webview页面,直接打印contexts,肯定有两个,一个是原生的,一个是webview
print(self.driver.contexts)
#需要切换到webview的context的,通常是倒数第一个,记得要有chromedriverExecutable
self.driver.switch_to.context(self.driver.contexts[-1])
sleep(2)
#往输入框输入tongtong
self.driver.find_element(MobileBy.ID,"i_am_a_textbox").send_keys("tongtong")
#点击链接
self.driver.find_element(MobileBy.ID,"i am a link").click()
#打印出当前的页面布局,发现是一个webview的html的布局
print(self.driver.page_source)
案例2 雪球webview
- 打开应用
- 点击交易
- 点击A股开户
- 输入用户名和密码
- 点击立即开户
- 退出应用
- 注:打开新的页面其实就是一个新的窗口了,要切换窗口句柄了
#由于chrome识别不到雪球的webview,元素定位有问题,所以代码搞不定
from time import sleep
from appium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
class TestFind():
def setup(self):
self.desire_cap= {
"platformName":"android",
"platformVersion":"6.0",
"deviceName":"127.0.0.1:7555",
#想要使用原生的浏览器就选择,Browser。想要选择chrome浏览器就输入Chrome
"browserName":"Browser",
"noRest":True,
#这里是指定chromedriver的路径,记得路径要全到包括chromedriver.exe
"chromedriverExecutable":r"c:\chrome\chromedriver.exe"
}
self.driver=webdriver.Remote("http://127.0.0.1:4723/wd/hub",self.desire_cap)
self.driver.implicitly_wait(5)
def teardown(self):
self.driver.quit()
def test_browser(self):
#打开移动端的百度浏览器
self.driver.get("http://m.baidu.com")
#显示等待找到搜索框是否可见,expected_conditions里面传的locator必须是一个元祖
WebDriverWait(self.driver,10).until(expected_conditions.visibility_of_element_located((By.CSS_SELECTOR,"#index-kw")))
#搜索框输入tongtong
self.driver.find_element(By.CSS_SELECTOR,"#index-kw").send_keys("tongtong")
sleep(2)
#百度一下点击一下
self.driver.find_element(By.CSS_SELECTOR, "#index-bn").click()
sleep(3)
webview遇到的坑
- 设备
- Android模拟器6.0默认支持webview,mumu直接打开了,不用设置
- 起码模拟器和物理机需要打开app内开关(webview调试开关)
- PC浏览器定位元素
- chrome浏览器-62版本才可以更好的看见webview的内部,其他的版本都有一些bug
- 换成chromium浏览器可以避免很多坑,展示效果和速度要chrome要快
- 代码
- 有的设备可以使用find_element_acessibility_id(), 不同的设备渲染的页面不同,兼容性不适合
- switch_to.context() 切换不同的context,一个页面来说
- switch.to_window() 切换不同的窗口句柄,对不同的页面来说