- python_selenium自动化测试框架
程序员老鹰
pythonselenium开发语言功能测试软件测试自动化测试程序人生
设计思路本文整理归纳以往的工作中用到的东西,现汇总成基础测试框架提供分享。框架采用python3+selenium3+PO+yaml+ddt+unittest等技术编写成基础测试框架,能适应日常测试工作需要。1、使用PageObject模式将页面定位和业务操作分开,分离测试对象(元素对象)和测试脚本(用例脚本),一个页面建一个对象类,提高用例的可维护性;2、使用yaml管理页面控件元素数据和测试用
- selenium python_Selenium Python 教程
weixin_39790504
seleniumpython
Selenium是一个用电脑模拟人操作浏览器网页,可以实现自动化,测试等!废话不多说,直接干!准备工作安装seleniummpipinstallselenium2.下载浏览器驱动Firefox浏览器驱动:geckodriverOpera浏览器驱动:operadriverPhantomJS浏览器驱动:phantomjs需要把浏览器驱动放入系统路径中,或者直接告知selenuim的驱动路径另外启动浏览
- 【Python_Selenium学习笔记(八)】基于Selenium模块实现滑块验证码破解
禾戊之昂
Python学习笔记#Selenium学习笔记pythonselenium网络爬虫爬虫
基于Selenium模块实现滑块验证码破解前言有些网站页面会在访问时进行滑块验证,针对此问题,此篇文章中会介绍如何基于Selenium模块实现滑块验证码的破解,并以模拟登录豆瓣网,破解其滑块验证码为例进行讲解。正文1、滑块验证码破解原理使用Selenium模块完全模拟人的行为,按住滑块,移动到缺口位置。2、滑块验证码破解步骤先将滑块一次性快速移动到某一位置,再滑块位置到缺口位置的距离划分为五份等距
- 【Python_Selenium学习笔记(三)】基于Selenium模块实现无界面模式 & 执行JS脚本(把滚动条拉到底部)
禾戊之昂
Python学习笔记#Selenium学习笔记pythonselenium爬虫
基于Selenium模块实现无界面模式&执行JS脚本(把滚动条拉到底部)前言此篇文章主要介绍如何使用Selenium模块实现无界面模式&执行JS脚本(把滚动条拉到底部),并以具体的示例进行展示。正文1、Selenium设置无界面模式创建浏览器对象之前,创建options功能对象:options=webdriver.ChromeOptions()添加无界面功能参数:options.add_argum
- python selenium定位元素的方法_Python_Selenium学习笔记(3)-元素定位方法
weixin_39575047
pythonselenium定位元素的方法
元素定位方法想操作浏览器就要先定位浏览器中的元素,常用有8种定位方法注意:无论使用什么方法,一定要确保定位元素方法的唯一性以定位百度首页输入框为例1、find_element_by_id(),通过元素的id属性定位说明:.send_keys()方法是像输入框中输入内容,为演示效果使用fromseleniumimportwebdriverdr=webdriver.Chrome()dr.get("ht
- python浏览器使用教程_Python_Selenium学习笔记(2)-浏览器操作方法
weixin_39519619
python浏览器使用教程
浏览器操作方法1、打开浏览器(Chrome)步骤:从selenium包中导入webdriver模块,使用webdriver模块下的Chrome()方法打开浏览器(打开不同浏览器时替换浏览器的名字),使用变量dr接收打开浏览器的返回值,后面使用这个变量dr操作浏览器注意:操作前需下载谷歌浏览器驱动到系统环境变量目录中fromseleniumimportwebdriverdr=webdriver.Ch
- Python_Selenium学习笔记(1)-Selenium介绍
weixin_34417200
pythonui测试
分层自动化测试共三种:单元自动化测试、接口自动化测试、UI自动化测试Google给出的测试比重:单元自动化测试占70%,接口自动化测试占20%,UI自动化测试占10%selenium属于UI自动化测试学习重点1、编程语言(Python)2、selenium(webdriver)API3、单元测试框架(unittest、pytest)Selenium介绍Selenium是python的第三方库,支持
- 【Python_Selenium学习笔记(七)】基于Selenium模块实现切换frame
禾戊之昂
Python学习笔记#Selenium学习笔记pythonselenium网络爬虫爬虫
基于Selenium模块实现切换frame前言有些网站页面会在网页中嵌套网页,即iframe;iframe是html中常用的一种技术,如果不切换到嵌套的页面中,无法操作其中的节点;为了解决该问题,Selenium模块提供了方法来切换frame,此篇文章中介绍如何基于Selenium模块实现切换frame,并以模拟登录豆瓣网为例进行讲解。正文1、常用方法切换到frame:driver.switch_
- 【Python_Selenium学习笔记(六)】基于Selenium模块实现切换句柄
禾戊之昂
Python学习笔记#Selenium学习笔记pythonselenium网络爬虫爬虫
基于Selenium模块实现切换句柄前言有些网站页面在点开链接后会出现新的窗口,但是浏览器对象browser(driver)还是之前页面的对象,针对此问题,需要切换到不同的窗口进行操作,Selenium模块提供了switch_to.window()方法切换句柄和window_handles属性获取句柄列表,下面详细介绍如何使用Selenium模块完成句柄的切换,并以实际案例进行展示。正文1、常用方
- 【Python_Selenium学习笔记(二)】基于Selenium模块实现网络爬虫
禾戊之昂
Python学习笔记#Selenium学习笔记python爬虫selenium
基于Selenium模块实现网络爬虫前言此篇文章主要介绍如何使用Selenium模块进行简单的网络爬虫,并以具体的示例进行展示。正文1、需求梳理基于Selenium+Chrome抓取中国排行网-行业排名-休闲娱乐下的网站信息2、爬虫思路打开浏览器输入Top100主页地址https://top.chinaz.com/hangye/index_yule.html;使用Selenium的Xpath找到行
- 【Python_Selenium学习笔记(四)】基于Selenium模块实现键盘操作
禾戊之昂
Python学习笔记#Selenium学习笔记pythonselenium
基于Selenium模块实现键盘操作前言在Selenium模块中,提供了一个Keys类,来处理键盘操作;在Selenium模块中,使用send_keys()方法,来模拟键盘输入,此篇文章主要介绍如何使用Keys类和send_keys()方法实现模拟键盘操作,并以具体的示例进行展示。正文1、Keys类常用方法Keys类键盘事件实现功能Keys.BACK_SPACE删除键Keys.SPACE空格键Ke
- 【Python_Selenium学习笔记(一)】Selenium介绍及基本使用方法
禾戊之昂
Python学习笔记#Selenium学习笔记pythonselenium爬虫网络爬虫
Selenium介绍及基本使用方法前言Selenium是一套Web网站的程序自动化操作解决方案,广泛应用于自动化测试及爬虫。此篇文章主要介绍Selenium的安装和基本使用流程。正文1、Selenium安装与导入Selenium框架的安装主要就是安装两样东西:Selenium客户端库和浏览器驱动。1.1、Selenium框架安装使用pip命令安装pipinstallselenium,安装完后直接导
- 【Python_Selenium学习笔记(五)】基于Selenium模块实现鼠标操作
禾戊之昂
Python学习笔记#Selenium学习笔记pythonselenium
基于Selenium模块实现鼠标操作前言为了模拟鼠标操作,Selenium模块提供了Actionchains类,可以模仿人的几乎任何鼠标行为操作;在此篇文章主要介绍Actionchains类的常用方法,使用流程,并以具体的示例进行展示。正文1、Actionchains类常用方法perform():执行ActionChains中存储的行为;context_click(on_element=None)
- python_selenium自动化测试框架
程序员三叔
自动化测试技术分享软件测试pythonselenium测试用例单元测试压力测试
设计思路本文整理归纳以往的工作中用到的东西,现汇总成基础测试框架提供分享。框架采用python3+selenium3+PO+yaml+ddt+unittest等技术编写成基础测试框架,能适应日常测试工作需要。1、使用PageObject模式将页面定位和业务操作分开,分离测试对象(元素对象)和测试脚本(用例脚本),一个页面建一个对象类,提高用例的可维护性;2、使用yaml管理页面控件元素数据和测试用
- Python_Selenium使用
Debug_轩
SpiderCrawlpythonseleniumchrome
文章目录前言selenium(fromseleniumimportwebdriver)1、安装2、基本使用3、声明浏览器对象4、访问页面5、查找节点5.1查找单个节点5.2查找多个节点6、节点交互(操作节点事件)7、动作链7.1鼠标点击7.2鼠标移动7.3鼠标拖拽7.4按键监听8、执行JavaScript脚本9、获取节点信息10、切换iFrame11、延迟等待(显示等待和隐式等待)12、前进与后退
- 2018-09-10_零基础入门python_selenium自动化(控制浏览器)
向往远方的小石头
Selenium主要提供的是操作页面上各种元素的方法,但它也提供了操作浏览器本身的方法,比如浏览器的大小以及浏览器后退、前进按钮等1、控制浏览器的大小在不同的浏览器大小下访问测试站点,对测试页面截图并保存,然后观察或使用图像比对工具对被测页面的前端样式进行评测程序截图2、控制浏览器的前进、后退WebDriver也提供了对应的back()和forward()方法来模拟后退和前进按钮程序截图3、控制浏
- 2018-09-04-零基础入门python_selenium自动化(环境搭建)
向往远方的小石头
做为一个做测试的小白,整天幻想着自己有一天能像美国大片里面的黑客那样coding,殊不知,写一行代码都十分艰难,这翻翻书,那翻翻百度,找找视频的,终于,静下来一个星期,开始学了一下python和selenium,虽然做不到像黑客那样,但是从python、selenium的0基础到入门自动化测试,还是很明显的做到了。以下叙述没有废话,只有干货:一、环境的搭建1、Python:官网下载安装包:http
- python selenium切换窗口_Python_selenium之窗口切换(二)
weixin_39791152
pythonselenium切换窗口
Python_selenium之窗口切换(二)一、思路拆分1.之前有介绍窗口切换,这里加上断言部分2.这里还是以百度新闻为例,获取百度新闻网址http://news.baidu.com/3.同样的获取所有的句柄,然后获取当前的句柄,同之前操作差不多4.最后加上断言部分,page2的信息内容是否包含page1,这里采用assertin语句二、测试脚本1.测试脚本如下:#coding:utf-8fro
- python_selenium之xpath的使用
weixin_34192993
python测试数据结构与算法
python_selenium之xpath的使用一、xpath介绍Xpath:XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言。XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力,XPath很快的被开发者采用来当作小型查询语言。学习地址:http://www.w3school.com.cn/xpath/index.aspSeleni
- python_selenium自动化测试框架
weixin_30588675
设计思路本文整理归纳以往的工作中用到的东西,现汇总成基础测试框架提供分享。框架采用python3+selenium3+PO+yaml+ddt+unittest等技术编写成基础测试框架,能适应日常测试工作需要。1、使用PageObject模式将页面定位和业务操作分开,分离测试对象(元素对象)和测试脚本(用例脚本),一个页面建一个对象类,提高用例的可维护性;2、使用yaml管理页面控件元素数据和测试用
- 使用python_selenium爬取动态网页时要注意的问题
chenpe32cp
python
需要注意定位一个元素:find_element_by_idfind_element_by_namefind_element_by_xpathfind_element_by_link_textfind_element_by_partial_link_textfind_element_by_tag_namefind_element_by_class_namefind_element_by_css_se
- python_selenium元素定位(1)
熊猫可可Z
selenium自动化脚本最基础的就是元素定位和元素操作,下面就以百度为例介绍最常见的定位方式基本定位方式:id、name、class_name、tag_name、link以百度的搜索框为例1fromseleniumimportwebdriver2importtime3driver=webdriver.Chrome()4driver.get("https://www.baidu.com")5dri
- python_selenium自动化测试框架
YinJia
设计思路本文整理归纳以往的工作中用到的东西,现汇总成基础测试框架提供分享。框架采用python3+selenium3+PO+yaml+ddt+unittest等技术编写成基础测试框架,能适应日常测试工作需要。1、使用PageObject模式将页面定位和业务操作分开,分离测试对象(元素对象)和测试脚本(用例脚本),一个页面建一个对象类,提高用例的可维护性;2、使用yaml管理页面控件元素数据和测试用
- Python_Selenium自动化测试实战
florachy
Python3.xSelenium2(Webdriver)
项目背景对http://www.51zxw.net/我要自学网进行登录测试功能实现自动运行用例自动生成测试报告自动断言和截图自动将最新的测试报告发送到指定邮箱PageObject+Unittest项目架构driverdriver.py:fromseleniumimportwebdriverdefbrowser():#driver=webdriver.Firefox()driver=webdrive
- 写python_selenium自动化脚本遇到的问题
简单生活101
学习python_selenium自动化脚本登录功能的编写遇到的问题,运行失败的原因,不知道写的是否对,只能当作自己的一个小的总结,以谷歌浏览器为例1.要把chromedriver.exe放到python的安装目录中2.设置谷歌浏览器的环境变量,具体设置可以百度一下3.chromedriver.exe这个文件要下载对应操作系统的如自己电脑是64位的操作系统那么就要下载对应64为操作系统的这个文件4
- Java 并发包之线程池和原子计数
lijingyao8206
Java计数ThreadPool并发包java线程池
对于大数据量关联的业务处理逻辑,比较直接的想法就是用JDK提供的并发包去解决多线程情况下的业务数据处理。线程池可以提供很好的管理线程的方式,并且可以提高线程利用率,并发包中的原子计数在多线程的情况下可以让我们避免去写一些同步代码。
这里就先把jdk并发包中的线程池处理器ThreadPoolExecutor 以原子计数类AomicInteger 和倒数计时锁C
- java编程思想 抽象类和接口
百合不是茶
java抽象类接口
接口c++对接口和内部类只有简介的支持,但在java中有队这些类的直接支持
1 ,抽象类 : 如果一个类包含一个或多个抽象方法,该类必须限定为抽象类(否者编译器报错)
抽象方法 : 在方法中仅有声明而没有方法体
package com.wj.Interface;
- [房地产与大数据]房地产数据挖掘系统
comsci
数据挖掘
随着一个关键核心技术的突破,我们已经是独立自主的开发某些先进模块,但是要完全实现,还需要一定的时间...
所以,除了代码工作以外,我们还需要关心一下非技术领域的事件..比如说房地产
&nb
- 数组队列总结
沐刃青蛟
数组队列
数组队列是一种大小可以改变,类型没有定死的类似数组的工具。不过与数组相比,它更具有灵活性。因为它不但不用担心越界问题,而且因为泛型(类似c++中模板的东西)的存在而支持各种类型。
以下是数组队列的功能实现代码:
import List.Student;
public class
- Oracle存储过程无法编译的解决方法
IT独行者
oracle存储过程
今天同事修改Oracle存储过程又导致2个过程无法被编译,流程规范上的东西,Dave 这里不多说,看看怎么解决问题。
1. 查看无效对象
XEZF@xezf(qs-xezf-db1)> select object_name,object_type,status from all_objects where status='IN
- 重装系统之后oracle恢复
文强chu
oracle
前几天正在使用电脑,没有暂停oracle的各种服务。
突然win8.1系统奔溃,无法修复,开机时系统 提示正在搜集错误信息,然后再开机,再提示的无限循环中。
无耐我拿出系统u盘 准备重装系统,没想到竟然无法从u盘引导成功。
晚上到外面早了一家修电脑店,让人家给装了个系统,并且那哥们在我没反应过来的时候,
直接把我的c盘给格式化了 并且清理了注册表,再装系统。
然后的结果就是我的oracl
- python学习二( 一些基础语法)
小桔子
pthon基础语法
紧接着把!昨天没看继续看django 官方教程,学了下python的基本语法 与c类语言还是有些小差别:
1.ptyhon的源文件以UTF-8编码格式
2.
/ 除 结果浮点型
// 除 结果整形
% 除 取余数
* 乘
** 乘方 eg 5**2 结果是5的2次方25
_&
- svn 常用命令
aichenglong
SVN版本回退
1 svn回退版本
1)在window中选择log,根据想要回退的内容,选择revert this version或revert chanages from this version
两者的区别:
revert this version:表示回退到当前版本(该版本后的版本全部作废)
revert chanages from this versio
- 某小公司面试归来
alafqq
面试
先填单子,还要写笔试题,我以时间为急,拒绝了它。。时间宝贵。
老拿这些对付毕业生的东东来吓唬我。。
面试官很刁难,问了几个问题,记录下;
1,包的范围。。。public,private,protect. --悲剧了
2,hashcode方法和equals方法的区别。谁覆盖谁.结果,他说我说反了。
3,最恶心的一道题,抽象类继承抽象类吗?(察,一般它都是被继承的啊)
4,stru
- 动态数组的存储速度比较 集合框架
百合不是茶
集合框架
集合框架:
自定义数据结构(增删改查等)
package 数组;
/**
* 创建动态数组
* @author 百合
*
*/
public class ArrayDemo{
//定义一个数组来存放数据
String[] src = new String[0];
/**
* 增加元素加入容器
* @param s要加入容器
- 用JS实现一个JS对象,对象里有两个属性一个方法
bijian1013
js对象
<html>
<head>
</head>
<body>
用js代码实现一个js对象,对象里有两个属性,一个方法
</body>
<script>
var obj={a:'1234567',b:'bbbbbbbbbb',c:function(x){
- 探索JUnit4扩展:使用Rule
bijian1013
java单元测试JUnitRule
在上一篇文章中,讨论了使用Runner扩展JUnit4的方式,即直接修改Test Runner的实现(BlockJUnit4ClassRunner)。但这种方法显然不便于灵活地添加或删除扩展功能。下面将使用JUnit4.7才开始引入的扩展方式——Rule来实现相同的扩展功能。
1. Rule
&n
- [Gson一]非泛型POJO对象的反序列化
bit1129
POJO
当要将JSON数据串反序列化自身为非泛型的POJO时,使用Gson.fromJson(String, Class)方法。自身为非泛型的POJO的包括两种:
1. POJO对象不包含任何泛型的字段
2. POJO对象包含泛型字段,例如泛型集合或者泛型类
Data类 a.不是泛型类, b.Data中的集合List和Map都是泛型的 c.Data中不包含其它的POJO
 
- 【Kakfa五】Kafka Producer和Consumer基本使用
bit1129
kafka
0.Kafka服务器的配置
一个Broker,
一个Topic
Topic中只有一个Partition() 1. Producer:
package kafka.examples.producers;
import kafka.producer.KeyedMessage;
import kafka.javaapi.producer.Producer;
impor
- lsyncd实时同步搭建指南——取代rsync+inotify
ronin47
1. 几大实时同步工具比较 1.1 inotify + rsync
最近一直在寻求生产服务服务器上的同步替代方案,原先使用的是 inotify + rsync,但随着文件数量的增大到100W+,目录下的文件列表就达20M,在网络状况不佳或者限速的情况下,变更的文件可能10来个才几M,却因此要发送的文件列表就达20M,严重减低的带宽的使用效率以及同步效率;更为要紧的是,加入inotify
- java-9. 判断整数序列是不是二元查找树的后序遍历结果
bylijinnan
java
public class IsBinTreePostTraverse{
static boolean isBSTPostOrder(int[] a){
if(a==null){
return false;
}
/*1.只有一个结点时,肯定是查找树
*2.只有两个结点时,肯定是查找树。例如{5,6}对应的BST是 6 {6,5}对应的BST是
- MySQL的sum函数返回的类型
bylijinnan
javaspringsqlmysqljdbc
今天项目切换数据库时,出错
访问数据库的代码大概是这样:
String sql = "select sum(number) as sumNumberOfOneDay from tableName";
List<Map> rows = getJdbcTemplate().queryForList(sql);
for (Map row : rows
- java设计模式之单例模式
chicony
java设计模式
在阎宏博士的《JAVA与模式》一书中开头是这样描述单例模式的:
作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。 单例模式的结构
单例模式的特点:
单例类只能有一个实例。
单例类必须自己创建自己的唯一实例。
单例类必须给所有其他对象提供这一实例。
饿汉式单例类
publ
- javascript取当月最后一天
ctrain
JavaScript
<!--javascript取当月最后一天-->
<script language=javascript>
var current = new Date();
var year = current.getYear();
var month = current.getMonth();
showMonthLastDay(year, mont
- linux tune2fs命令详解
daizj
linuxtune2fs查看系统文件块信息
一.简介:
tune2fs是调整和查看ext2/ext3文件系统的文件系统参数,Windows下面如果出现意外断电死机情况,下次开机一般都会出现系统自检。Linux系统下面也有文件系统自检,而且是可以通过tune2fs命令,自行定义自检周期及方式。
二.用法:
Usage: tune2fs [-c max_mounts_count] [-e errors_behavior] [-g grou
- 做有中国特色的程序员
dcj3sjt126com
程序员
从出版业说起 网络作品排到靠前的,都不会太难看,一般人不爱看某部作品也是因为不喜欢这个类型,而此人也不会全不喜欢这些网络作品。究其原因,是因为网络作品都是让人先白看的,看的好了才出了头。而纸质作品就不一定了,排行榜靠前的,有好作品,也有垃圾。 许多大牛都是写了博客,后来出了书。这些书也都不次,可能有人让为不好,是因为技术书不像小说,小说在读故事,技术书是在学知识或温习知识,有
- Android:TextView属性大全
dcj3sjt126com
textview
android:autoLink 设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接。可选值(none/web/email/phone/map/all) android:autoText 如果设置,将自动执行输入值的拼写纠正。此处无效果,在显示输入法并输
- tomcat虚拟目录安装及其配置
eksliang
tomcat配置说明tomca部署web应用tomcat虚拟目录安装
转载请出自出处:http://eksliang.iteye.com/blog/2097184
1.-------------------------------------------tomcat 目录结构
config:存放tomcat的配置文件
temp :存放tomcat跑起来后存放临时文件用的
work : 当第一次访问应用中的jsp
- 浅谈:APP有哪些常被黑客利用的安全漏洞
gg163
APP
首先,说到APP的安全漏洞,身为程序猿的大家应该不陌生;如果抛开安卓自身开源的问题的话,其主要产生的原因就是开发过程中疏忽或者代码不严谨引起的。但这些责任也不能怪在程序猿头上,有时会因为BOSS时间催得紧等很多可观原因。由国内移动应用安全检测团队爱内测(ineice.com)的CTO给我们浅谈关于Android 系统的开源设计以及生态环境。
1. 应用反编译漏洞:APK 包非常容易被反编译成可读
- C#根据网址生成静态页面
hvt
Web.netC#asp.nethovertree
HoverTree开源项目中HoverTreeWeb.HVTPanel的Index.aspx文件是后台管理的首页。包含生成留言板首页,以及显示用户名,退出等功能。根据网址生成页面的方法:
bool CreateHtmlFile(string url, string path)
{
//http://keleyi.com/a/bjae/3d10wfax.htm
stri
- SVG 教程 (一)
天梯梦
svg
SVG 简介
SVG 是使用 XML 来描述二维图形和绘图程序的语言。 学习之前应具备的基础知识:
继续学习之前,你应该对以下内容有基本的了解:
HTML
XML 基础
如果希望首先学习这些内容,请在本站的首页选择相应的教程。 什么是SVG?
SVG 指可伸缩矢量图形 (Scalable Vector Graphics)
SVG 用来定义用于网络的基于矢量
- 一个简单的java栈
luyulong
java数据结构栈
public class MyStack {
private long[] arr;
private int top;
public MyStack() {
arr = new long[10];
top = -1;
}
public MyStack(int maxsize) {
arr = new long[maxsize];
top
- 基础数据结构和算法八:Binary search
sunwinner
AlgorithmBinary search
Binary search needs an ordered array so that it can use array indexing to dramatically reduce the number of compares required for each search, using the classic and venerable binary search algori
- 12个C语言面试题,涉及指针、进程、运算、结构体、函数、内存,看看你能做出几个!
刘星宇
c面试
12个C语言面试题,涉及指针、进程、运算、结构体、函数、内存,看看你能做出几个!
1.gets()函数
问:请找出下面代码里的问题:
#include<stdio.h>
int main(void)
{
char buff[10];
memset(buff,0,sizeof(buff));
- ITeye 7月技术图书有奖试读获奖名单公布
ITeye管理员
活动ITeye试读
ITeye携手人民邮电出版社图灵教育共同举办的7月技术图书有奖试读活动已圆满结束,非常感谢广大用户对本次活动的关注与参与。
7月试读活动回顾:
http://webmaster.iteye.com/blog/2092746
本次技术图书试读活动的优秀奖获奖名单及相应作品如下(优秀文章有很多,但名额有限,没获奖并不代表不优秀):
《Java性能优化权威指南》