其他测试框架 求助 如果一个 App 中包含 WebView,应该怎么测试,该怎么搞?

codeskyblue · 2016年09月18日 · 最后由 123456 回复于 2017年03月01日 · 4503 次阅读

测试内置包含 WebView 的应用,比如 HTML5 应用,HyBrid 这类应用。

打开 App,发现里面出来的都是网页。

不知道有没有人搞过这一块,可否分享一下相关的经验?

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 31 条回复 时间 点赞

问题描述的太模糊

@codeskyblue 参考 macaca-ios macaca-android 的实现

#2 楼 @xdf 有木有使用的例子,如何测试 HyBird 应用的,这种

@codeskyblue 参考Appium Python API 中文版 先获取 context
然后切换到 H5,driver.switch_to.context("WEBVIEW")
测试完了在切换回来,driver.switch_to.context("NATIVE_APP")

#5 楼 @xinxjxjxj 奥,这玩意跟 seledroid 的 API 好像呀

#7 楼 @xdf 能不能说说后面是用什么实现的?代码实在不好找在哪里实现的

  1. 安卓 or iOS ?
  2. 原生 WebView 还是第三方的?

测试 WebView 本质上和测试一个网页差不多,可以参考下怎么用 selenium 做 Web 测试。至于部分和原生应用有交互的点,那就得用类似 appium 这种可以自由切换的工具来做了。

#9 楼 @chenhengjie123 我其实就是想知道 appium 实现的方法

@codeskyblue 短的几句描述不清,可以看 Macaca 源码如何用 Node.js 实现的

#10 楼 @codeskyblue 大致原理是先检测 app 是否带有 WebView(Android 可以查看有没有 chrome 进程,iOS 具体方法没探究过),然后通过对应的工具(Android 是 ChromeDriver ,iOS 是 ios-webkit-debug-proxy)去和 WebView 通讯,让 WebView 的浏览器内核执行对应的操作。

因为都是遵循 WebDriver 规范的,所以大部分命令可以直接从 appium server 转发给对应的 WebView 控制工具去控制。

#13 楼 @chenhengjie123 很详细,多谢,我在研究下

貌似必须手机安装了 chrome 浏览器才行

就是 app 用 Html5 写 有一个 手机内核 叫啥的 忘记了

@codeskyblue
希望有帮助😀

import os
import glob
import unittest
from time import sleep

from appium import webdriver

# Returns abs path relative to this file and not cwd
PATH = lambda p: os.path.abspath(
    os.path.join(os.path.dirname(__file__), p)
)

class AndroidWebViewTests(unittest.TestCase):

    def setUp(self):
        desired_caps = {}
        desired_caps['app'] = PATH('../apps/webview.apk')
        desired_caps['platformName'] = 'Android'
        desired_caps['platformVersion'] = '4.4.4'
        desired_caps['deviceName'] = '274b3f06'
        desired_caps['noSign'] = 'true'
        desired_caps['unicodeKeyboard'] = 'true'
        desired_caps['resetKeyboard'] = 'true'
        desired_caps['noReset'] = 'false'

        self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

    def tearDown(self):
        # end the session
        self.driver.quit()

    def test_webview(self):
        self.driver.switch_to.context('WEBVIEW_com.testerhome.webview')

        input_field = self.driver.find_element_by_name('word')
        searchButton = self.driver.find_element_by_id('index-bn')
        sleep(1)
        input_field.clear()
        input_field.send_keys('Appium User')
        searchButton.click()
        sleep(2)

        source = self.driver.page_source
        self.assertNotEqual(1, source.find('"TesterHome"'))

if __name__ == '__main__':
    suite = unittest.TestLoader().loadTestsFromTestCase(AndroidWebViewTests)
    unittest.TextTestRunner(verbosity=2).run(suite)

macaca 可以支持非原生的 webview 吗?

#2 楼 @xdf macaca 支持 crosswalk 框架非原生 webview 吗?

@heyyuyu webkit-remote-debug 协议支持就行,不支持无解

@xdf 我用的 5.1 系统,没有写 desired_caps['automationName']='Selendroid'这一句,然后切换后提示
File "./testCase/test_device.py", line 121, in test_play
self.device_add()
File "./testCase/test_device.py", line 53, in device_add
els=self.driver.find_elements_by_class_name("choose_device_btn_color")
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/selenium/webdriver/remote/webdriver.py", line 425, in find_elements_by_class_name
return self.find_elements(by=By.CLASS_NAME, value=name)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/selenium/webdriver/remote/webdriver.py", line 778, in find_elements
'value': value})['value']
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/selenium/webdriver/remote/webdriver.py", line 236, in execute
self.error_handler.check_response(response)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/appium/webdriver/errorhandler.py", line 29, in check_response
raise wde
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/appium/webdriver/errorhandler.py", line 24, in check_response
super(MobileErrorHandler, self).check_response(response)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/selenium/webdriver/remote/errorhandler.py", line 192, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: no such session
(Driver info: chromedriver=2.21.371459 (36d3d07f660ff2bc1bf28a75d1cdabed0983e7c4),platform=Mac OS X 10.11.6 x86_64)

和曦 回复


大神,指导一下,这样的 H5 页面,怎么写测试框架呀?

和曦 回复

您的这个运行成功了吗,我试了一下,怎么总是不行啊?

123456 回复

没想到还是我提问的帖子,简单的说,就是装一个 chromedriver,浏览器配置下

codeskyblue 回复

大神,那些准备工作我都已经做好了,我是用 Python 语言的,但是如何切换到 webview 和如何 List 元素,我还不会弄,可以帮助分享一下吗,最好是您的测试模板
这是我写的切换,但是运行不成功
,都折腾了一个多星期了,也没搞出来,百爪闹心啊

123456 回复

你这是 python 还是 Java

codeskyblue 回复

我的是 Python 啊,由于是第一次,完全没有模板可以参考,都是摸着石头过河,公司就我一个人搞这块,大神帮帮忙,详细一些,都搞了一个星期了

123456 回复

参考下这个 https://testerhome.com/topics/7232 其实没这么复杂了啦

codeskyblue 回复

大神,我这个搞了一个星期了,可以给我个模板分享一下吗,我看了那个链接,不是很懂

陈恒捷 回复

大神,你有成功的代码可以分享一下吗,我是用 Python 测试 Android 的

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册