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

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

测试内置包含 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)

和曦 #18 回复


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

和曦 #18 回复

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

123456 #24 回复

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

大神,那些准备工作我都已经做好了,我是用 Python 语言的,但是如何切换到 webview 和如何 List 元素,我还不会弄,可以帮助分享一下吗,最好是您的测试模板
这是我写的切换,但是运行不成功

,都折腾了一个多星期了,也没搞出来,百爪闹心啊

123456 #26 回复

你这是 python 还是 Java

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

123456 #28 回复

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

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

陈恒捷 #13 回复

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

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