【Appium】基础6(webview)

【Appium】 课程全笔记(录播+直播课)链接:

Appium基础1(环境搭建和简介)

Appium基础2(元素定位和元素常用方法)

Appium基础3(手势操作和uiautomator查找元素)

Appium基础4(显式等待)

Appium基础5(toast和参数化)

Appium基础6(webview)

Appium_企业微信实战课1(非PO,增加和删除联系人)

Appium_企业微信实战课2(PO–增加联系人)


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的路径
  • 如何查找app的版本:adb shell pm dump com.android.browser | findstr version

案例:打开mumu自带的浏览器,访问百度

代码
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() 切换不同的窗口句柄,对不同的页面来说
1 Like

这下面的code不是关于雪球webview的呀

1 Like