第 1章 如何加快测试速度 1
1.1 使开发人员易于运行测试 2
1.2 使用Apache Maven构建测试项目 2
1.3 并行执行测试 8
1.4 使用TestNG进行并行测试 11
1.5 不存在银弹 21
1.6 多浏览器支持 22
1.7 自动下载WebDriver二进制文件 30
1.8 后台模式 38
1.9 总结 43
第 2章 如何正确处理失败的测试 44
2.1 测试代码的位置 44
2.2 测试是一种实时文档 45
2.3 测试的可靠性 47
2.3.1 孤立的自动化团队 47
2.3.2 时好时坏的测试 48
2.4 增强测试的可靠性 49
2.4.1 Git 50
2.4.2 Subversion 51
2.5 关键在于持续集成 52
2.5.1 设置TeamCity 55
2.5.2 设置Jenkins 61
2.6 使用Selenium-Grid扩展功能 68
2.7 一图胜过千言万语 73
2.8 别畏惧庞大的错误栈追踪信息 79
2.9 总结 83
第3章 必知的异常 84
3.1 NoSuchElementException异常 84
3.2 NoSuchFrameException异常 86
3.3 NoSuchWindowException异常 86
3.4 ElementNotVisibleException异常 87
3.5 StaleElementReferenceException异常 87
3.6 InvalidElementStateException异常 90
3.7 UnsupportedCommandException异常 90
3.8 UnreachableBrowserException异常 91
3.9 SessionNotFoundException异常 93
3.10 WebDriverException异常—元素此时不可单击 93
3.11 NoAlertPresentException异常 94
3.12 总结 94
第4章 等待的艺术 95
4.1 页面真的准备好了吗 95
4.2 影响页面加载的外部因素 96
4.2.1 计算机规格因素 96
4.2.2 服务器规格因素 96
4.2.3 JavaScript引擎性能因素 97
4.2.4 网络因素 97
4.3 解决问题的思路 97
4.4 Selenium内置的等待机制 98
4.4.1 页面加载超时机制 99
4.4.2 脚本超时机制 99
4.4.3 隐式等待超时机制 100
4.5 使用显式等待 104
4.6 显式等待的核心——流式等待 106
4.6.1 函数 108
4.6.2 Java 8 Lambda表达式 111
4.7 总结 112
第5章 使用高效的页面对象 113
5.1 为何不断做重复的事情 113
5.2 一切始于页面对象 121
5.3 页面对象关注点的分离 123
5.4 Java PageFactory类简介 125
5.4.1 使用PageFactory注释 125
5.4.2 初始化代理对象 127
5.4.3 PageFactory类存在的问题 129
5.5 Query对象简介 130
5.6 选择PageFactory类还是Query对象 133
5.7 创建可扩展的页面对象 133
5.8 将页面对象转换为易读的DSL 137
5.9 流式页面对象 140
5.10 总结 144
第6章 使用高级用户交互API 145
6.1 API简介 146
6.2 使用API解决困难问题 147
6.2.1 使用悬停菜单 147
6.2.2 使用拖放操作 151
6.2.3 使用偏移量 155
6.2.4 使用快捷访问键 162
6.2.5 高级交互API并非绝对有效 170
6.3 总结 171
第7章 使用Selenium执行JavaScript代码 172
7.1 JavaScript执行器简介 172
7.2 JavaScript执行器的误用与滥用 175
7.3 JavaScript执行器的正确用法 176
7.4 更复杂的案例 177
7.5 JavaScript库的导入方式 184
7.6 JavaScript库的导入原则 186
7.7 如何执行异步脚本 186
7.8 自动实现用户交互 188
7.9 总结 191
第8章 实事求是 192
8.1 使用Selenium下载文件 192
8.1.1 使用场景 192
8.1.2 面临的问题 193
8.1.3 下一步的行动 193
8.1.4 真需要下载文件吗 194
8.1.5 检查链接是否有效 194
8.1.6 下载文件的办法 202
8.1.7 使用Selenium协助下载文件 204
8.2 通过Selenium无法跟踪网络流量 211
8.3 跟踪网络流量的办法 212
8.4 使用Selenium编写性能测试 222
8.5 使用Selenium进行渗透测试 225
8.6 总结 228
第9章 将Docker整合到Selenium中 229
9.1 Docker简介 229
9.2 通过Docker启动Selenium-Grid 232
9.3 在新的Selenium-Grid上运行测试 237
9.4 将Docker容器的启动作为构建的一部分 238
9.5 使用Docker Maven插件 242
9.6 使用Docker Compose 245
9.7 Docker的不足之处 247
9.8 总结 247
第 10章 展望Selenium的未来 249
10.1 机器学习—全新的追求 249
10.2 视觉验证 251
10.2.1 Applitools Eyes 253
10.2.2 引入人工智能 260
10.3 自我修复测试 262
10.4 自动编写测试 264
10.5 总结 264
附录A 如何进一步完善Selenium 265
附录B 使用JUnit 280
附录C Appium简介 288