Hybrid App 测试

基本介绍

WebView 控件在 Appium 中的抽象
  • Native 层面支持

    • uiautomator 解析 WebView 中的内容并映射为原生控件

    • getPageSource 为 DOM 结构可发现 WebView 组件和控件

  • 切换为 WebView 上下文

    • 切换后才是正规的 Web

    • getPageSource 为 HTML

    • 可以使用 CSS 定位等

Hybrid 测试流程

• 首先进去带有 WebView 的页面

• 使用 Contexts API 寻找 WebView

• 使用 Context 切换到 WebView

• 使用 CSS 等 Web 定位方式

• 使用 Context 重回 Native


  • 真机进行 WebView 测试
    开启webview调试代码
  • 低于 API 27的模拟器默认支持

实操

  • 打开有webview的界面,在PC chrome浏览器输入 chrome://inspect/#devices

需要翻墙
DevTools
通过Chrome的devtools可以调试手机的网页,但是要翻墙
图中2处是设备名称,图中3处是设备的webview版本,图中3处是html页面点击 inspect查看布局元素

DevTools查看页面布局
点击菜单栏的箭头, 滑到界面上,可以锁定输入栏的标签元素,可以根据id,type,class,name单个或者组合形式定位元素。

编写用例
class WebViewPage(BasePage):

    def search_baidu(self):
        print(self.driver.contexts)#打印driver的上下文,基本是这样的 ['NATIVE_APP', 'WEBVIEW_com.mintegral.sdk.demo'] 
        sleep(3)
        self.driver.switch_to.context(self.driver.contexts[1])# 切换到webview上下文
        print(self.driver.current_context)#打印当前上下文

        self.driver.find_element_by_css_selector('input').send_keys('庄达菲')#通过selector为input定位百度输入栏,输入要搜索的内容
        sleep(2)
        self.driver.find_element_by_css_selector("button#index-bn[type='submit']").click()#通过selector/id/type组合定位‘百度一下’的按钮,并点击
        sleep(2)
        self.driver.switch_to.context(self.driver.contexts[0])#切换回native上下文
        print(self.driver.current_context)
        sleep(20)

跑起来可能失败,查看下面常见问题。

另外补充一些关于css selector定位元素的姿势:

一:单一属性定位

1type selector

driver.find_element_by_css_selector(input)

2id 定位

driver.find_element_by_css_selector(#index-kw’)

3class 定位

driver.find_element_by_css_selector(.se-input .adjust-input)

4:其他属性定位

driver.find_element_by_css_selector("[name=‘word’]")

driver.find_element_by_css_selector("[type=‘search’]")

二:组合属性定位

1id组合属性定位

driver.find_element_by_css_selector(input#index-kw”)

2class组合属性定位

driver.find_element_by_css_selector(input.se-input)

3:其他属性组合定位

driver.find_element_by_css_selector("input[name=‘word’]")

4:仅有属性名,没有值也可以

driver.find_element_by_css_selector(input[name])

5:两个其他属性组合定位

driver.find_element_by_css_selector("[name=‘word’][autocomplete=‘off’]")

常见问题

1 chromedriver not found

2 chrome version must be >=

3 chrome not reachable

4 selenium.common.exceptions.WebDriverException: Message: An unknown server-side error occurred while processing the command. Original error: No Chromedriver found that can automate Chrome ‘37.0.0’. You could also try to enable automated chromedrivers download server feature. See https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/web/chromedriver.md for more details

上述四个问题,原因是你本地的chromedriver不可用。 根据前面截图里的devtools确定你的设备webview版本, 然后根据 https://raw.githubusercontent.com/appium/appium-chromedriver/master/config/mapping.json (key为chromedriver版本,value为webview版本)里找到你的webview版本应该使用的chromedriver版本。比如我的webview是78.0.3904.108,找不到该版本 ,那就找相近的 低于78.0.3904.108的78.0.3904.105版本,对应的chromedriver版本也是78.0.3904.105. 如下图所示:

webview:chromedriver对应关系

确定要用的chromedriver版本后,去https://chromedriver.storage.googleapis.com/index.html (翻墙)或 https://npm.taobao.org/mirrors/chromedriver(淘宝镜像,不用翻墙)去下载chromedriver。 下载下来的是zip包,解压到你保存的目录,我的是/Users/damon/temp/chromedriver/78.0.3904.105/,该路径需要用到。
必须要解压,需要chromedriver可执行程序,否则会报WebDriverException: Message: An unknown server-side error occurred while processing the command. Original error: Process didn’t end after 10000ms (cmd: ‘/Users/damon/temp/chromedriver/78.0.3904.105/chromedriver_mac64.zip --url-base=wd/hub --port=8000 --adb-port=5037 --verbose’)

在appium driver初始化的地方加入caps

caps["showChromedriverLog"] = True

# chromedriver可执行程序的完整路径,appium根据该路径去使用chromedriver
caps['chromedriverExecutable'] = '/Users/damon/temp/chromedriver/78.0.3904.105/chromedriver'

5 WebDriverException(‘An unknown server-side error occurred while processing the command. Original error: There must be at least one Chromedriver executable available for use if the current Chrome version cannot be determined’)

本地没有找到可用的chromedriver,如果已经下载好了可用的chromedriver,需要配置下capability chromedriverExecutable ,让appium能够找到。


6 InvalidArgumentException: Message: invalid argument: invalid locator
E (Session info: chrome=78.0.3904.108)

使用错了find_element_by_id。 建议使用find_element_by_css_selector 通过css定位符定位控件元素。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值