• (function() {
    
        handleAddListener('load', getTiming)
    
        function handleAddListener(type, fn) {
            if(window.addEventListener) {
                window.addEventListener(type, fn())
            } else {
                window.attachEvent('on' + type, fn)
            }
        }
    
        function getTiming() {
            try {
                var time = performance.timing;
                var timingObj = {};
    
                var loadTime = (time.loadEventEnd - time.loadEventStart) / 1000;
    
                if(loadTime < 0) {
                    setTimeout(function() {
                        getTiming();
                    }, 200);
                    return;
                }
    
                timingObj['重定向时间'] = (time.redirectEnd - time.redirectStart) / 1000;
                timingObj['DNS解析时间'] = (time.domainLookupEnd - time.domainLookupStart) / 1000;
                timingObj['TCP完成握手时间'] = (time.connectEnd - time.connectStart) / 1000;
                timingObj['HTTP请求响应完成时间'] = (time.responseEnd - time.requestStart) / 1000;
                timingObj['DOM开始加载前所花费时间'] = (time.responseEnd - time.navigationStart) / 1000;
                timingObj['DOM加载完成时间'] = (time.domComplete - time.domLoading) / 1000;
                timingObj['DOM结构解析完成时间'] = (time.domInteractive - time.domLoading) / 1000;
                timingObj['脚本加载时间'] = (time.domContentLoadedEventEnd - time.domContentLoadedEventStart) / 1000;
                timingObj['onload事件时间'] = (time.loadEventEnd - time.loadEventStart) / 1000;
                timingObj['页面完全加载时间'] = (timingObj['重定向时间'] + timingObj['DNS解析时间'] + timingObj['TCP完成握手时间'] + timingObj['HTTP请求响应完成时间'] + timingObj['DOM结构解析完成时间'] + timingObj['DOM加载完成时间']);
    
                for(item in timingObj) {
                    console.log(item + ":" + timingObj[item] + '毫秒(ms)');
                }
            } catch(e) {
                console.log(timingObj+".")
            }
        }
    })();
    

    用上面的脚本测试了下,timingObj['页面完全加载时间'] 的值输出是几毫秒与实际对不上.因为一个页面有 N 个接口加起来耗时已经 5s 左右了

  • 感谢,我看网上有一些脚本可以计算指标;不让开发干预的情况下,怎么自己写 js 脚本获取到打开 web 页面时拿到性能数据并生成报告

  • 商品秒杀库存 10 个
    A 只能买 1 个
    B 只能买 2 个
    C 只能买 3 个
    D 只能买 4 个
    不超卖,每个用户购买数量不大于自身限制量,库存大于等于 0
    不少卖,每个用户购买数量不大于自身限制量,且库存为 0

    逻辑这样判断对吗?

  • 从开发角度,逻辑判断条件怎么写呢

  • 真的打算在测试行业做一辈子吗?互联网行业,年纪大了进不了管理层是否没人要?如何转行?

  • 也许这是每个人的机缘,不同的机缘,不一样的人生!这句话体会最深
    十年的时间从 2k 多到 20K 多,以楼主的努力及能力换个方向看世界或许个人成就更大。祝愿楼主越来越好

  • android app fps 计算 at 2016年02月19日

    #7 楼 @monkey
    1.如果按照 1000/消耗时间算,我单位时间 1s 内取出 28 帧,这 28 帧渲染总共耗费 299.89ms,得出结果为 1000/299.89=3fps???
    2.基于 unity 游戏 dump 出来的是空的,你可以试试。

  • android app fps 计算 at 2016年02月19日

    #5 楼 @monkey 这个帖子我看过了,adb shell dumpsys SurfaceFlinger --latency com.tencent.assistantv2.activity.MainActivity 这种方法在我的真机 nexus5/三星 note4(系统都是 5.1.1)上都只返回一行 16666667 数据即系统刷新周期,没有返回一些帧相关数据。而且里面的算法不知道他为什么会那么去算,依据是什么?能否按你理解的说下呢?
    对于 service call SurfaceFlinger 1013 这种计算方法已经理解了。但是只能 root 下用。
    另外 gfxinfo 貌似不能 dump 出游戏的帧数据,只能是 APP

  • android app fps 计算 at 2016年02月19日

    #1 楼 @monkey 你是指人工操作会影响哪部分数据?另外,我是单位时间 1s 取出帧数量/帧绘制耗费的总时间计算出 fps 的,还是说 fps 就是这 1s 取出的帧数量

  • #1 楼 @chenhengjie123
    恩,改了下帖子
    1.Method(noxdriver.getDriver()) 这个是修改后的 Method 类接受一个参数,noxdriver.getDriver() 等价于 webdriver.Remote(self.baseUrl, self.desired_caps)
    2.这个意思是说两个脚本文件 case1 跟 case2 都是一样的代码
    3.其实要的效果是 driver 实例都在 case 里面生成,每个 case 的 driver 实例独立互不干扰(且能调用 method 类方法)。或者 case 的 driver 实例都从 Method 来,但是能达到每次运行关闭脚本都能创建 session--关闭 session 效果。
    4.这个是贴代码时贴了最后一次修改的代码,已经修改帖子部分内容
    还请恒洁看看

  • #6 楼 @zsx10110
    我加你 QQ 吧,告诉我

  • #4 楼 @zsx10110
    contexts 打印出来的是 [u'NATIVE_APP', u'WEBVIEW_com.tencent.mm:tools']
    你可以在下面的代码里增加步骤打开一个公众号页面
    微信是不是要安装 TBS 打开调试页面才可以?

    #coding=utf-8
    import unittest
    from appium import webdriver
    #By定义了若干查找控件的方法
    from appium.webdriver.mobilecommand import MobileCommand
    from selenium.webdriver.common.by import By
    from appium.webdriver.common.touch_action import TouchAction
    from time import sleep
    from appium import webdriver
    import sys
    reload(sys)
    sys.setdefaultencoding('utf-8')
    #点击坐标
    #self.driver.tap([(810,1210)])
    #混合输入
    #self.driver.find_element(by=By.CLASS_NAME, value="android.widget.EditText").send_keys(u"去玩儿123qwert~!@#$%^&*()_+")
    
    class Testsuit(unittest.TestCase):
        def setUp(self):
            desired_caps = {}
            desired_caps['platformName'] = 'Android'
            desired_caps['platformVersion'] = '5.0.1'
            desired_caps['deviceName'] = 'note4'
            desired_caps['appPackage'] = 'com.tencent.mm'
            desired_caps['appActivity'] = '.ui.LauncherUI'
            desired_caps['newCommandTimeout'] = '15'
            desired_caps['unicodeKeyboard'] = 'True'
            desired_caps['resetKeyboard'] = 'True'
            self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
            self.driver.implicitly_wait(time_to_wait="15")
    
        def tearDown(self):
            self.driver.quit()
    
        def test_OpenYouWei(self):
            self.driver.find_element(by=By.NAME, value="通讯录").click()
            self.driver.find_element(by=By.NAME, value="公众号").click()
            print self.driver.contexts
            sleep(5)
            self.driver.execute(MobileCommand.SWITCH_TO_CONTEXT, {"name": "WEBVIEW_com.tencent.mm:tools"})
            self.driver.find_element_by_xpath("html/body/div/div[1]/div/ul[2]/li[1]/div[2]/div[2]/div/button").click()
    
    if __name__ == '__main__':
        suite = unittest.TestLoader().loadTestsFromTestCase(Testsuit)
        unittest.TextTestRunner(verbosity=2).run(suite)
    
  • #1 楼 @zsx10110

    > info: [debug] Getting a list of available webviews
    > info: [debug] executing cmd: D:\sdk\platform-tools\adb.exe -s 127.0.0.1:62001 shell "cat /proc/net/unix"
    > info: [debug] WEBVIEW_5542 mapped to pid 5542
    > info: [debug] Getting process name for webview
    > info: [debug] executing cmd: D:\sdk\platform-tools\adb.exe -s 127.0.0.1:62001 shell "ps"
    > info: [debug] Parsed pid: 5542 pkg: com.tencent.mm:tools
    > info: [debug] from: u0_a47,5542,147,1665296,132748,ffffffff,b767f01b,S,com.tencent.mm:tools
    > info: [debug] returning process name: com.tencent.mm:tools
    > info: [debug] Available contexts: NATIVE_APP,WEBVIEW_com.tencent.mm:tools
    > info: [debug] ["WEBVIEW_com.tencent.mm:tools"]
    > info: [debug] Available contexts: NATIVE_APP,WEBVIEW_com.tencent.mm:tools
    > info: [debug] Connecting to chrome-backed webview
    > info: Chromedriver: Changed state to 'starting'
    > info: Chromedriver: Set chromedriver binary as: D:\Program Files (x86)\Appium\node_modules\appium\node_modules\appium-chromedriver\chromedriver\win\chromedriver.exe
    > info: Chromedriver: Killing any old chromedrivers, running: FOR /F "usebackq tokens=5" %a in (`netstat -nao ^| findstr /R /C:"9515 "`) do (FOR /F "usebackq" %b in (`TASKLIST /FI "PID eq %a" ^| findstr /I chromedriver.exe`) do (IF NOT %b=="" TASKKILL /F /PID %a))
    > info: Chromedriver: Successfully cleaned up old chromedrivers
    > info: Chromedriver: Spawning chromedriver with: D:\Program Files (x86)\Appium\node_modules\appium\node_modules\appium-chromedriver\chromedriver\win\chromedriver.exe --url-base=wd/hub --port=9515
    > info: Chromedriver: [STDOUT] Starting ChromeDriver 2.20.353145 (343b531d31eeb933ec778dbcf7081628a1396067) on port 9515
    > Only local connections are allowed.
    > info: JSONWP Proxy: Proxying [GET /status] to [GET http://127.0.0.1:9515/wd/hub/status] with no body
    > info: JSONWP Proxy: Got response with status 200: {"sessionId":"","status":0,"value":{"build":{"version":"alpha"},"os":{"arch":"x86_64","name":"Windows NT","version":"6.1 SP1"}}}
    > info: JSONWP Proxy: Proxying [POST /session] to [POST http://127.0.0.1:9515/wd/hub/session] with body: {"desiredCapabilities":{"chromeOptions":{"androidPackage":"com.tencent.mm","androidUseRunningApp":true,"androidDeviceSerial":"127.0.0.1:62001"}}}
    > info: [debug] Didn't get a new command in 15 secs, shutting down...
    > info: Shutting down appium session
    

    貌似没有执行查找元素的这一步
    self.driver.find_element_by_xpath("html/body/div/div[1]/div/ul[2]/li[1]/div[2]/div[2]/div/button").click()

  • #5 楼 @lylyliuyu 感谢了,已解决

  • #2 楼 @lylyliuyu
    我用的也是夜神模拟器,能不能说下你的具体操作方法?

  • Appium+python 框架 (二) at 2015年11月20日

    #12 楼 @tongshanshanshan
    请问怎么取出某个元素点击?我取出后都不能调用 click 方法了,都是一些里列表调用方法了。
    另外就是,xpath 的路径太长,怎么写简短有效?
    如果第一次的路径被找出来了,第二次又多了相同的元素,这种情况如何处理?只能修改脚本吗?

  • Appium+python 框架 (二) at 2015年11月06日

    请教个 appium 问题,事先已经网搜过,了解过定位方法
    页面底部 “吃饭”“讨饭”“我的” 按钮,红框中三个属性都相
    只有 text 属性不同,怎么定位?

  • 期待新书上市

  • 请问调用微信授权登陆的页面怎么获取如图的元素

  • 楼主的脚本运行后启动不了 APK,但是在 monkeyrunner 命令行里同样的命令可以启动 APK

  • 测试服务端到 APP 端的数据可以使用此方法吗?有 APP 的代码跟服务端 API

  • 如何用不同的 IP 与 UA 头去点击一个链接

  • CrashMonkey4Android at 2015年06月11日

    直接在 CTS.XML 配置文件参数化。执行 run cts --plan Monkey。不会打开指定 APP
    #61 楼 @doctorq 是注释掉的,但是控制台还是提示链接,另外:
    信息: Error starting command: monkey --port 12345
    com.android.ddmlib.ShellCommandUnresponsiveException
    at com.android.ddmlib.AdbHelper.executeRemoteCommand(AdbHelper.java:408)
    at com.android.ddmlib.Device.executeShellCommand(Device.java:435)
    at com.android.chimpchat.adb.AdbChimpDevice$1.run(AdbChimpDevice.java:104)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
    这是什么?指定端口 12345?

  • CrashMonkey4Android at 2015年06月11日

    06-11 11:59:58 I/DeviceNetWorkListener: please connect wifi : 58-guest
    为什么提示我链接这个 wifi?

  • CrashMonkey4Android at 2015年06月05日

    #45 楼 @doctorq 就等 windows 了啊