(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 多,以楼主的努力及能力换个方向看世界或许个人成就更大。祝愿楼主越来越好
#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
#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.这个是贴代码时贴了最后一次修改的代码,已经修改帖子部分内容
还请恒洁看看
#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)
> 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
我用的也是夜神模拟器,能不能说下你的具体操作方法?
#12 楼 @tongshanshanshan
请问怎么取出某个元素点击?我取出后都不能调用 click 方法了,都是一些里列表调用方法了。
另外就是,xpath 的路径太长,怎么写简短有效?
如果第一次的路径被找出来了,第二次又多了相同的元素,这种情况如何处理?只能修改脚本吗?
请教个 appium 问题,事先已经网搜过,了解过定位方法
页面底部 “吃饭”“讨饭”“我的” 按钮,红框中三个属性都相
只有 text 属性不同,怎么定位?
期待新书上市
请问调用微信授权登陆的页面怎么获取如图的元素
楼主的脚本运行后启动不了 APK,但是在 monkeyrunner 命令行里同样的命令可以启动 APK
测试服务端到 APP 端的数据可以使用此方法吗?有 APP 的代码跟服务端 API
如何用不同的 IP 与 UA 头去点击一个链接
直接在 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?
06-11 11:59:58 I/DeviceNetWorkListener: please connect wifi : 58-guest
为什么提示我链接这个 wifi?