测试内置包含 WebView 的应用,比如 HTML5 应用,HyBrid 这类应用。
打开 App,发现里面出来的都是网页。
不知道有没有人搞过这一块,可否分享一下相关的经验?
问题描述的太模糊
@codeskyblue 参考 macaca-ios macaca-android 的实现
#1 楼 @xinxjxjxj 更新
@codeskyblue 参考Appium Python API 中文版 先获取 context
然后切换到 H5,driver.switch_to.context("WEBVIEW")
测试完了在切换回来,driver.switch_to.context("NATIVE_APP")
#5 楼 @xinxjxjxj 奥,这玩意跟 seledroid 的 API 好像呀
测试 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 吗?
@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)
大神,那些准备工作我都已经做好了,我是用 Python 语言的,但是如何切换到 webview 和如何 List 元素,我还不会弄,可以帮助分享一下吗,最好是您的测试模板
这是我写的切换,但是运行不成功
,都折腾了一个多星期了,也没搞出来,百爪闹心啊
我的是 Python 啊,由于是第一次,完全没有模板可以参考,都是摸着石头过河,公司就我一个人搞这块,大神帮帮忙,详细一些,都搞了一个星期了