本文来自“汇智动力学院”知乎号。
第一部分:使用测试工具从自动化测试的定义开始,主要讨论自动化测试如何开展的话题。
第二部分:构建测试方案在熟悉自动化测试的基础上,主要讨论如何构建优秀的自动化测试。
写在最前面:目前自动化测试并不属于新鲜的事物,或者说自动化测试的各种方法论已经层出不穷,但是,能够在项目中持之以恒的实践自动化测试的团队,却依旧不是非常多。有的团队知道怎么做,做的还不够好;有的团队还正在探索和摸索怎么做,甚至还有一些多方面的技术上和非技术上的旧系统需要重构…… 本文将会从使用
和实践
两个视角,尝试对基于Web UI
自动化测试做细致的分析和解读,给各位去思考和实践做一点引路,以便各团队能找到更好的方式。1. 使用测试工具 《论语》有云:工欲善其事,必先利其器。在开始具体的自动化测试之前,我们需要做好更多的准备,包括以下几个方面:
认识自动化测试
准备自动化测试工具
使用有效的方式
针对具体的测试对象
接下来的第一部分内容,我们将会从上述的几个方面进行探讨。1.1 自动化测试理论介绍
正如开篇所提到的,自动化测试不再是一个陌生的话题,而是一个具体的存在。作为测试实践活动的一部分,我们首先分析一下自动化测试的方方面面。
G.J.Myers在其经典的著作《软件测试艺术》(The Art of Software Testing)一书中,给出了测试的定义: “程序测试是为了发现错误而执行的过程。” 这个概念产生于30年前,对软件测试的认识还非常有局限性,当然也是因为受瀑布开发模型的影响,认为软件测试是编程之后的一个阶段。只有等待代码开发出来以后,通过执行程序,像用户那样操作软件去发现问题。 自动化测试:以人为驱动的测试行为转化为机器执行的一种过程 自动化测试,就是把手工进行的测试过程,转变成机器自动执行的测试过程。该过程,依旧是为了发现错误而执行。因此自动化测试的关键在于“自动化”三个字。自动化测试的内容,也就相应的转变成如何“自动化”去实现原本手工进行的测试的过程。 所有的“自动化”,依靠的无疑都是程序。 通过程序,可以把手工测试,转变成自动化测试。
自动化测试的开展,依赖于“程序”。那么程序,其实就是由“源代码”构建而来的。那么原则上,只要能做出自动化测试所需要的“程序”的时候,变可以进行自动化测试。但往往,并不是所有的“时候”都是好的“时机”。从这个W
开始,我们将会加入对于成本的顾虑,也正是因为“成本”的存在,才使得下面的讨论,变得有意义。 所有的开销,都是有成本的。构建成“程序”的源代码,也是由工程师写出来的。那么需要考虑这个过程中的成本。基于这个考虑,在能够比较稳定的构建“程序”的时候,不需要花费太多开销在“源代码”的时候,就是开展自动化测试的好时机。这个开销包括编写
和修改
源代码,而源代码指的是构建出用来做自动化测试的程序
的源代码。
自动化测试的执行,依靠的是机器。那么自动化测试必将在“机器”上进行。一般来说,这个机器包括桌面电脑和服务器。通过将写好的源代码
部署在机器上,构建出用来做自动化测试的"程序",并且运行该程序,实现自动化测试。
自动化测试的目标,是被测试的软件。抛开人工智能的成分,手工测试必将在“人工智能”足够普及和足够“智能”之前,替代一大部分不需要“人类智能”的手工测试;以及自动化测试会做一些手工测试无法实施的,或者手工测试无法覆盖的测试。
不需要“人类智能”的普通手工测试
界面的普通操作
通过固定输入和固定操作而进行的流程化测试
重复的普通测试
手工测试无法实施或者覆盖的
大量的数据的输入
大量的步骤的操作
源代码基本的测试
系统模块间接口的调用测试
……
HOW
, 如何开展自动化测试
和所有的其他测试一样,自动化测试的流程也是由“用例”执行和“缺陷”验证组成。差别是需要找到合适的“工具”来替代“人手”。不同目标的自动化测试有不同的测试工具,但是任何工具都无不例外的需要“编程”的过程,实现“源代码”,也可以称之为测试脚本。于是开展自动化测试的方式基本上如下:
准备测试用例
找到合适的自动化测试工具
用准确的编程形成测试脚本
在测试脚本中对目标进行“检查”,即做断言
记录测试日志,生成测试结果
自动化测试的典型金字塔原理( 如有更多关于自动化测试的问题,欢迎进Q群:698224407交流)
谈到自动化测试,就不得不提的一个人和概念就是:Martin Fowler和他的金字塔原理。首先请看金字塔原理的图示如下:
该图说明了三个问题:
自动化测试包括三个方面:UI前端界面,Service服务契约和Unit底层单元
越是底层的测试,运行速度越快,时间开销越少,金钱开销越少
越是顶层的测试,运行速度越慢,时间开销越多,金钱开销越多
这是理想中的金字塔原理。 在实际的项目中,尤其是结合国内的项目实践,其实还隐藏了另一个问题:越是顶层的测试,效果越明显。有句话说“贵的东西,除了贵,其他都是好的!”能够很清晰的阐述这个观点。 金字塔原理在国内的适应性也有一定的问题
自动化测试的起步不是特别早
甚至软件测试很长一段时间都在进行基于业务的手工测试,测试人员的代码能力相对较弱
开发人员在代码中不太习惯写单元测试
近些年基于服务契约的API测试也在兴起
相对来说,在基于UI前端界面的自动化测试反倒是开展和实施的不是特别多。尽管基于界面的测试带来的效果还是能够立竿见影的。对于产品的质量提升,还是比较容易有保证。
自动化测试可以涉及和试用的范围主要在以下方面:
基于Web UI
的浏览器应用的界面测试
基于WebService
或者WebAPI
的服务契约测试
基于WCF
、.net remoting
、Spring
等框架的服务的集成测试
基于APP UI
的移动应用界面测试
基于Java
、C#
等编程文件进行的单元测试
本文集中讨论第一条:基于Web UI
的浏览器应用的界面测试。界面的改动对于测试来说,具有较大的成本风险。主要考虑以下方面:
任务测试明确,不会频繁变动
每日构建后的测试验证
比较频繁的回归测试
软件系统界面稳定,变动少
需要在多平台上运行的相同测试案例、组合遍历型的测试、大量的重复任务
软件维护周期长
项目进度压力不太大
被测软件系统开发比较规范,能够保证系统的可测试性
具备大量的自动化测试平台
测试人员具备较强的编程能力
自动化测试和普通的手工测试遵循的测试流程,与项目的具体实践相关。一般来说,也是需要从测试计划开始涉及自动化测试的。
测试计划:划定自动化测试的范围包含哪些需求,涉及到哪些测试过程
测试策略:确定自动化测试的工具、编程方案、代码管理、测试重点
测试设计:使用测试设计方法对被测试的需求进行设计,得出测试的测试点、用例思维导图等
测试实施:根据测试设计进行用例编写,并且将测试用例用编程的方式实现测试脚本
测试执行:执行测试用例,运行测试脚本,生成测试结果
1.2 自动化测试工具 基于Web UI
的自动化测试工具主要有两大类:付费的商业版工具和免费使用的开源版工具。典型的有两种:
UFT,QTP被惠普收购以后的新名称。
通过程序的录制,可以实现测试的编辑
录制的测试脚本是 VBScript 语法
成熟版的商业付费工具
工具比较庞大,对具体的项目定制测试有难度
SELENIUM,本次选择的开源工具
本身不是测试工具,只是模拟浏览器操作的工具
背后有 Google 维护源代码
支持全部主流的浏览器
支持主流的编程语言,包括:Java、Python、C#、PHP、Ruby、JavaScript等
工具很小,可以实现对测试项目的定制测试方案
基于标准的 WebDriver 语法规范
1.2.1 Selenium 基本介绍 Selenium`是开源的自动化测试工具,它主要是用于Web 应用程序的自动化测试,不只局限于此,同时支持所有基于web 的管理任务自动化。
Selenium is a suite of tools to automate web browsers across many platforms.
runs in many browsers and operating systems
can be controlled by many programming languages and testing frameworks.
Selenium 官网:http://seleniumhq.org/
Selenium Github 主页:https://github.com/SeleniumHQ/selenium
Selenium 是用于测试 Web 应用程序用户界面 (UI) 的常用框架。它是一款用于运行端到端功能测试的超强工具。您可以使用多个编程语言编写测试,并且 Selenium 能够在一个或多个浏览器中执行这些测试。
Selenium 经历了三个版本:Selenium 1,Selenium 2 和 Selenium 3。Selenium 也不是简单一个工具,而是由几个工具组成,每个工具都有其特点和应用场景。
Selenium 诞生于 2004 年,当在 ThoughtWorks
工作的 Jason Huggins 在测试一个内部应用时。作为一个聪明的家伙,他意识到相对于每次改动都需要手工进行测试,他的时间应该用得更有价值。他开发了一个可以驱动页面进行交互的 Javascript 库,能让多浏览器自动返回测试结果。那个库最终变成了 Selenium 的核心,它是 Selenium RC(远程控制)和 Selenium IDE 所有功能的基础。Selenium RC 是开拓性的,因为没有其他产品能让你使用自己喜欢的语言来控制浏览器。这就是 Selenium 1。
然而,由于它使用了基于 Javascript 的自动化引擎,而浏览器对 Javascript 又有很多安全限制,有些事情就难以实现。更糟糕的是,网站应用正变得越来越强大,它们使用了新浏览器提供的各种特性,都使得这些限制让人痛苦不堪。
在 2006 年,一名 Google 的工程师, Simon Stewart 开始基于这个项目进行开发,这个项目被命名为 WebDriver。此时,Google 早已是 Selenium 的重度用户,但是测试工程师们不得不绕过它的限制进行工具。Simon 需要一款能通过浏览器和操作系统的本地方法直接和浏览器进行通话的测试工具,来解决Javascript 环境沙箱的问题。WebDriver 项目的目标就是要解决 Selenium 的痛点。
到了 2008 年,Selenium 和 WebDriver 两个项目合并。Selenium 有着丰富的社区和商业支持,但 WebDriver 显然代表着未来的趋势。两者的合并为所有用户提供了一组通用功能,并且借鉴了一些测试自动化领域最闪光的思想。这就是 Selenium 2。
2016 年,Selenium 3 诞生。移除了不再使用的 Selenium 1 中的 Selenium RC,并且官方重写了所有的浏览器驱动。
Selenium IDE (集成开发环境) 是一个创建测试脚本的原型工具。它是一个 Firefox 插件,实现简单的浏览器操作的录制与回放功能,提供创建自动化测试的建议接口。Selenium IDE 有一个记录功能,能记录用户的操作,并且能选择多种语言把它们导出到一个可重用的脚本中用于后续执行。
Selenium RC 是selenium 家族的核心工具,Selenium RC 支持多种不同的语言编写自动化测试脚本,通过selenium RC 的服务器作为代理服务器去访问应用从而达到测试的目的。 selenium RC 使用分Client Libraries 和Selenium Server。
Client Libraries 库主要主要用于编写测试脚本,用来控制selenium Server 的库。
Selenium Server 负责控制浏览器行为,总的来说,Selenium Server 主要包括3 个部分:Launcher、Http Proxy、Core。
Selenium Grid 使得 Selenium RC 解决方案能提升针对大型的测试套件或者哪些需要运行在多环境的测试套件的处理能力。Selenium Grid 能让你并行的运行你的测试,也就是说,不同的测试可以同时跑在不同的远程机器上。这样做有两个有事,首先,如果你有一个大型的测试套件,或者一个跑的很慢的测试套件,你可以使用 Selenium Grid 将你的测试套件划分成几份同时在几个不同的机器上运行,这样能显著的提升它的性能。同时,如果你必须在多环境中运行你的测试套件,你可以获得多个远程机器的支持,它们将同时运行你的测试套件。在每种情况下,Selenium Grid 都能通过并行处理显著地缩短你的测试套件的处理时间。
WebDriver 是 Selenium 2 主推的工具,事实上WebDriver是Selenium RC的替代品,因为Selenium需要保留向下兼容性的原因,在 Selenium 2 中, Selenium RC才没有被彻底的抛弃,如果使用Selenium开发一个新的自动化测试项目,那么我们强烈推荐使用Selenium2 的 WebDriver进行编码。另外, 在Selenium 3 中,Selenium RC 被移除了。
Python 语言的选择,便捷
测试人员的编程能力普遍不是很强,而Python作为一种脚本语言,不仅功能强大,而且语法优美,支持多种自动化测试工具,而且学习上手比较容易。
Python的社区发展比较好,有着非常多的文档和支持库,另外Python也可以在Web开发、数据处理、科学计算等纵多领域有着非常好的应用前景。
对于有一定编程基础的人员,使用Python作为自动化测试的语言可以非常顺畅的转换,几乎没有学习成本。同时Python是标准的面向对象的编程语言,对于C#、Java等面向对象的语言有着非常好的示例作用,通过Python的示例可以非常轻松的触类旁通,使用其他语言进行Selenium2.0的WebDriver的使用。
读音:/'paɪθən/
Python的创始人为Guido Van Rossum。1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,做为ABC 语言的一种继承。之所以选中Python(大蟒蛇的意思)作为程序的名字,是因为他是一个叫Monty Python的喜剧团体的爱好者。
Python 语言除了在自动化测试领域有出色的表现外,在系统编程,网络编程,web 开发,GUI开发,科学计算,游戏开发等多个领域应用非常广泛,而且具有非常良好的社区支持。也就是说学习和掌握python 编程,其实是为你打开了一道更广阔的大门。
使用的工具集
IDE: Jetbrains PyCharm
语言: Python
工具: Selenium WebDriver
源代码管理: SVN/Git
1.2.2 JetBrains PyCharm 使用
PyCharm 是 JetBrains 公司针对Python推出的IDE(Integrated Development Environment,集成开发环境)。是目前最好的Python IDE之一。目前包含了两个版本:
社区版,Community Edition
专业版,Professional Edition
我们推荐使用免费的社区版本,进行Python脚本的编写和自动化测试执行。 PyCharm可以在官网下载,http://www.jetbrains.com PyCharm 安装后,如果也安装过 Python 环境,可以直接进行操作。否则请在 1.2.3 中安装好 Python,再使用 PyCharm。
创建新的项目,选择项目创建的位置,选择Python的解释器
设置location,项目的路径和名称
名称必须以英文字母开头
名称不可以有空格
位置不可以在 C:\Pytho34
中,应该放到普通的目录中
设置interpreter
一个电脑可以装多个 Python
这里选择一个你需要的 Pythpn
新建Python文件
在创建的文件中编写第一个Python语句 print("hello Python!")
右键该文件,选择Run hello
,运行该语句,在下面的运行框中会显示运行结果 C:\Python35\python.exe D:/Git/WeekendSelenium/untitled/hello.py hello python! Process finished with exit code 0 如图
打开已经存在的项目,比如别人发给你的项目,或者已经创建过的项目
在PyCharm 里,显示行号有两种办法:
临时设置(不推荐)。右键单击行号处,选择 Show Line Numbers
。
但是这种方法,只对一个文件有效,并且,重启PyCharm 后消失。
永久设置。File
--> Settings
-->Editor
-->Appearance
, 之后勾选Show Line Numbers
。
选择 Settings | Editor | Colors & Fonts | Fonts Save AS 主题 选择 Source Code Pro(建议选择,等宽字体)
源代码管理工具(VCS, version control system) 如果TortoiseSVN版本低于 1.8
,需要先升级安装1.8
以上的版本 选择SVN(git)作为代码的源代码管理工具。集成在PyCharm中的步骤如下
代码已经存在在SVN repo中:把代码放到SVN在本地签出(check out)的文件夹目录中,例如 D:\SVN\XXProject\Trunck
代码没有创建:在本地的SVN项目文件夹中新建项目,用PyCharm打开,提交。
用PyCharm打开 刚刚部署的代码
选择PyCharm的 VCS
|Enable VCS integration
,选择 Subversion(svn) 或者 Git
右键项目文件的根目录,选择 Subversion | add to VCS
右键项目文件的根目录,或者选 VCS | Commit Directory...
每天打开代码后,右键项目文件的根目录,首先 Subversion | update project
如果有冲突,先本地手工保存你做的修改(备份你的文件到其他地方,SVN目录之外的地方,然后Revert)
1.2.3 Selenium 的环境搭建
在 Windows 搭建和部署 Selenium 工具
主要包括两个步骤:
Python的官方网站:http://www.python.org Python 目前并行了两套版本,2.x 和 3.x。如果你之前没有 Python 的使用经验,建议使用 Python 3.x 版本。两套版本互相不兼容,并且 Python 从 3.5(含)开始,不再支持 Windows XP 系统,请注意。
选择安装目录
3.4或者3.4以下的版本,都是 C:\python34
3.5以上的目录,默认装个人文件夹,建议用类似上面的目录,比如C:\python35
勾选Add Python.exe to PATH
安装过程中不要关闭弹出来的命令行窗口
关于 Python 的安装,也可以选择一些第三方的Python 安装包,典型的有 Anaconda3
,这样的包有丰富的第三方库,在使用 Python 的过程中会更加方便。
Anaconda 的官网:https://www.continuum.io/anaconda-overview
由于 安装好的 Python 默认有 pip
Python 包管理工具,可以通过 pip
非常方便的安装 Selenium。
启动命令行工具:Win+R | 输入 cmd | 回车
输入命令:
pip install selenium 该命令的执行需要有互联网联网环境。此外该命令有以下几种选项可以使用
安装指定的版本,例如安装指定的 Selenium 3.4.3
pip install selenium==3.4.3
pip install -U selenium # -U 也可以用 --upgrade pip install --upgrade selenium
pip uninstall selenium
当然,如果您的机器处于非接入互联网的环境,您可以事先下载 Selenium 的 Python 安装包,再进行手动安装。
官方下载地址:https://pypi.python.org/pypi/selenium
上述地址会下载最新版的 Selenium,目前最先版的是 3.4.3,您也可以根据以下路径下载指定的 3.4.3
Selenium 3.4.3 下载地址:https://pypi.python.org/pypi/selenium/3.4.3#downloads
下载后,解压该压缩包
然后用命令行进入该压缩包的根目录,输入命令进行安装
python setup.py install
配置 浏览器 和 驱动
Selenium 2 可以默认支持Firefox 46.0或者更低版本,对于其他浏览器需要额外安装驱动。
Selenium 3 对于所有的浏览器都需要安装驱动,本文以 Chrome 和 Firefox、IE为例设置浏览器和驱动。
ChromeDriver下载地址:http://chromedriver.storage.googleapis.com/index.html
ChromeDriver 与 Chrome 对应关系表:
ChromeDriver版本支持的Chrome版本 v2.31v58-60v2.30v58-60v2.29v56-58v2.28v55-57v2.27v54-56v2.26v53-55v2.25v53-55v2.24v52-54v2.23v51-53v2.22v49-52v2.21v46-50v2.20v43-48
GeckoDriver下载地址:https://github.com/mozilla/geckodriver/releases
GeckoDriver 与 Firefox 的对应关系表:
GeckoDriver版本支持的Firefox版本 v0.18.0v56v0.17.0v55v0.16.0v54,需要Selenium 3.4或者以上v0.15.0v53,需要Selenium 3.3或者以上
IEDriverServer下载地址:http://selenium-release.storage.googleapis.com/index.html
IEDriverServer 的版本需要与 Selenium 保持严格一致。
浏览器驱动的配置
首先,将下载好的对应版本的浏览器安装。
其次,在 Python 的根目录中,放入浏览器驱动。
最好再重启电脑,一般情况下不重启也可以的。
1.3 Selenium 的最简脚本 通过上一节的环境安装成功以后,我们可以进行第一个对Selenium 的使用,就是最简脚本编写。脚本如下:# 声明一个司机,司机是个Chrome类的对象 driver = webdriver.Chrome() # 让司机加载一个网页 driver.get("http://demo.ranzhi.org") # 给司机3秒钟去打开 sleep(3) # 开始登录 # 1. 让司机找用户名的输入框 we_account = driver.find_element_by_css_selector('#account') we_account.clear() we_account.send_keys("demo") # 2. 让司机找密码的输入框 we_password = driver.find_element_by_css_selector('#password') we_password.clear() we_password.send_keys("demo") # 3. 让司机找 登录按钮 并 单击 driver.find_element_by_css_selector('#submit').click() sleep(3) 实际上一段20行的代码,也不能算太少了。但是这段代码的使用,确实体现了 Selenium 的最简单的使用。我们在下面内容进行阐述。
通过前面的介绍,我们知道 Selenium 支持多种语言,并且推荐使用面向对象的方式进行编程。接下来我们将着重介绍如何使用面向对象的方式进行编程。 我们利用 Python 进行面向对象编程,需要首先了解一个概念:类
类是任何面向对象编程的语言的基本组成,描述了使用的基本方法。我们可能在目前,还不是特别明白类的含义,但是我们可以通过类的使用,来进一步了解。
类,通过实例化进行使用。比如有一个类: Driver
,该类有一个方法: head(road)
那么关于这个类的使用,只需要两个步骤:
实例化该类:d = Driver()
调用类的方法:d.head("中山路")
了解上述例子和使用以后,我们来看具体的 Selenium 的使用。
在面向对象的理念看来,任何的编码,都是由对象而来的,这里也不例外。和之前介绍 WebDriver 时候的描述对应,我们需要用到两种主要的类,并将其实例化。
WebDriver 类:主要靠直接实例化该类为对象,然后用其对象直接调用该类的方法和属性
WebElement 类:主要通过 WebDriver 类实例化的对象,通过对页面元素的查找,得到 WebElement 类的对象,然后调用该类的方法和属性。
上述代码中,使用了一个 WebDriver 类 的对象,即第2行,声明了该类的对象,并赋值给变量 driver,接着变量 driver 作为 WebDriver 类的对象,使用了多个 WebDriver 类的方法。 注意:Chrome 是 WebDriver 的子类,是 WebDriver 类的一种
get(url): 第5行,打开网址
find_element_by_css_selector(selector): 第12、17、22行都使用了该方法,同时通过对该方法的调用,分别各产生了一个 WebElement类的对象,we_account
,we_password
和最后一个匿名的对象,并通过产生的三个对象,调用 WebElement 类的方法
clear():清理页面元素中的文字
send_keys(text):给页面元素中,输入新的文字
click():鼠标左键点击页面元素
正是通过这样的面向对象的方式,产生 Web司机(WebDriver类的对象),并且通过 Web司机不懈的努力,寻找到各种 Web元素(WebElement类的对象)进行操作,这样便实现了 Selenium WebDriver 作为一款出色的浏览器测试工具,进行浏览器UI界面的自动化测试的代码编写和用例执行。
1.4 Selenium WebDriver API 的使用 通过上述最简脚本的使用,我们可以来进一步了解 Selenium 的使用。事实上,上一节用的,便是 Selenium 的 WebDriver API。API(Application Programming Interface,应用程序编程接口,即通过编程语言,操作 WebDriver 的方法集合)
Selenium WebDriver API 官方参考:http://seleniumhq.github.io/selenium/docs/api/py/ 具体API文档地址:https://seleniumhq.github.io/selenium/docs/api/py/api.html
API 使用: 用现成的类(大部分情况)的方法进行编程
1.4.1 控制浏览器 浏览器的控制也是自动化测试的一个基本组成部分,我们可以将浏览器最大化,设置浏览器的高度和宽度以及对浏览器进行导航操作等。
1.4.2 元素定位操作 WebDriver提供了一系列的定位符以便使用元素定位方法。常见的定位符有以下几种:
id
name
class name
tag
link text
partial link text
xpath
css selector
那么我们以下的操作将会基于上述的定位符进行定位操作。 对于元素的定位,WebDriver API可以通过定位简单的元素和一组元素来操作。在这里,我们需要告诉Selenium如何去找元素,以至于他可以充分的模拟用户行为,或者通过查看元素的属性和状态,以便我们执行一系列的检查。 在Selenium2中,WebDriver提供了多种多样的find_element_by
方法在一个网页里面查找元素。这些方法通过提供过滤标准来定位元素。当然WebDriver也提供了同样多种多样的find_elements_by
的方式去定位多个元素。 尽管上述的方式,可以进行元素定位,实际上我们也是更多的用组合的方式进行元素定位。方法Method描述Description参数Argument示例Example id
该方法通过ID的属性值去定位查找单个元素id: 需要被查找的元素的IDfind_element_by_id('search')name
该方法通过name的属性值去定位查找单个元素name: 需要被查找的元素的名称find_element_by_name('q')class name
该方法通过class的名称值去定位查找单个元素class_name: 需要被查找的元素的类名find_element_by_class_name('input-text')tag_name
该方法通过tag的名称值去定位查找单个元素tag: 需要被查找的元素的标签名称find_element_by_tag_name('input')link_text
该方法通过链接文字去定位查找单个元素link_text: 需要被查找的元素的链接文字find_element_by_link_text('Log In')partial_link_text
该方法通过部分链接文字去定位查找单个元素link_text: 需要被查找的元素的部分链接文字find_element_by_partial_link_text('Long')xpath
该方法通过XPath的值去定位查找单个元素xpath: 需要被查找的元素的xpathfind_element_by_xpath('//*[@id="xx"]/a')css_selector
该方法通过CSS选择器去定位查找单个元素css_selector: 需要被查找的元素的IDfind_element_by_css_selector('#search')
接下来的列表将会详细展示find_elements_by
的方法集合。这些方法依据匹配的具体标准返回一系列的元素。方法Method描述Description参数Argument示例Example id
该方法通过ID的属性值去定位查找多个元素id: 需要被查找的元素的IDfind_elements_by_id('search')name
该方法通过name的属性值去定位查找多个元素name: 需要被查找的元素的名称find_elements_by_name('q')class_name
该方法通过class的名称值去定位查找多个元素class_name: 需要被查找的元素的类名find_elements_by_class_name('input-text')tag_name
该方法通过tag的名称值去定位查找多个元素tag: 需要被查找的元素的标签名称find_elements_by_tag_name('input')link_text
该方法通过链接文字去定位查找多个元素link_text: 需要被查找的元素的链接文字find_elements_by_link_text('Log In')partial_link_text
该方法通过部分链接文字去定位查找多个元素link_text: 需要被查找的元素的部分链接文字find_elements_by_partial_link_text('Long')xpath
该方法通过XPath的值去定位查找多个元素xpath: 需要被查找的元素的xpathfind_elements_by_xpath("//div[contains(@class,'list')]")css_selector
该方法通过CSS选择器去定位查找多个元素css_selector: 需要被查找的元素的IDfind_element_by_css_selector('.input_class')
依据ID查找 请查看如下HTML的代码,以便实现通过ID的属性值去定义一个查找文本框的查找:
根据上述代码,这里我们使用find_element_by_id()
的方法去查找搜索框并且检查它的最大长度maxlength
属性。我们通过传递ID的属性值作为参数去查找,参考如下的代码示例:
如果使用find_elements_by_id()
方法,将会返回所有的具有相同ID属性值的一系列元素。
依据名称name查找 这里还是根据上述ID查找的HTML代码,使用find_element_by_name
的方法进行查找。参考如下的代码示例:
同样,如果使用find_elements_by_name()
方法,将会返回所有的具有相同name属性值的一系列元素。
依据class name查找 除了上述的ID和name的方式查找,我们还可以使用class name的方式进行查找和定位。 事实上,通过ID,name或者类名class name查找元素是最提倡推荐的和最快的方式。当然Selenium2 WebDriver也提供了一些其他的方式,在上述三类方式条件不足,查找无效的时候,可以通过这些其他方式来查找。这些方式将会在后续的内容中讲述。 请查看如下的HTML代码,通过改代码进行练习和理解。
根据上述代码,使用find_element_by_class_name()
方法去定位元素。
同样的如果使用find_elements_by_class_name()
方法去定位元素,将会返回所有的具有相同name属性值的一系列元素。
依据标签名tag name查找 利用标签的方法类似于利用类名等方法进行查找。我们可以轻松的查找出一系列的具有相同标签名的元素。例如我们可以通过查找表中的来获取行数。 下面有一个HTML的示例,这里在无序列表中使用了
标签。
这里面我们使用find_elements_by_tag_name()
的方式去获取全部的图片,在此之前,我们将会使用find_element_by_class_name()
去获取到指定的
。 具体代码如下:
依据链接文字link查找 链接文字查找通常比较简单。使用find_element_by_link_text
请查看以下示例
测试代码如下:
依据部分链接文字partial text查找 这里依旧使用上述的列子进行代码编写:
1.6 为什么需要封装 Selenium
封装是一个面向对象编程的概念,是面向对象编程的核心属性,通过将代码内部实现进行密封和包装,从而简化编程。对Selenium进行封装的好处主要有如下三个方面:
不需要要求所有的测试工程师会熟练使用Selenium,而只需要会使用封装以后的代码
不需要对所有的测试工程师进行完整培训。也避免工作交接的成本。
测试人员使用统一的代码库
通过封装,在代码发生大范围变化和迁移的时候,不需要维护所有代码,只需要变更封装的部分即可
维护代码不需要有大量的工程师,只需要有核心的工程师进行封装的维护即可
对作为第三方的Selenium进行封装,是代码安全的基础。
对于任何的代码的安全隐患,必须由封装来解决,使得风险可控。
使用者并不知道封装内部的代码结构。
自动化测试在路上
[探讨]单元测试在敏捷开发的场景下对技术和产品的影响?
技术人员需要掌握的技术栈
企业产品的质量度量与提升
你可能感兴趣的:(干货,软件测试,自动化测试,Selenium,软件测试,自动化测试,Selenium)
Git 从入门到进阶 (只有干货,没有废话)
2401_84153158
程序员 git elasticsearch 大数据
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门,即可获取!1.2.2已有的项目gitstash保存当前修改gitpull拉取远程最新代码与本地合并gitstashpop取出当前最新修改gitadd文件列表追踪文件gitcommit-m提交信息向仓库提交代码gitpushorigin分支名称推送至远程仓库具体的分支二、Git进阶操作=============
selenium实现chrome多开
0x8g1T9E
python chrome 前端 python
selenium实现chrome多开有时候为了避开登录验证所带来的麻烦,先登录后用selenium预加载之前的用户配置及cookie信息会极大便利自动化目标的实现,但受限于selenium及chrome的用户配置文件加锁机制,每次只能有一个进程操作大大限制了自动化目标的实施。所幸可以通过chrome的多用户可以完成selenium多任务同时加载cookie信息1、添加多个chrome用户2、分别用
CVPR‘24 | 百度开源DETRs在实时目标检测中胜过YOLOs
3D视觉工坊
3D视觉从入门到精通 百度 目标检测 人工智能 计算机视觉
点击下方卡片,关注「3D视觉工坊」公众号选择星标,干货第一时间送达来源:3D视觉工坊添加小助理:dddvision,备注:目标检测,拉你入群。文末附行业细分群论文题目:DETRsBeatYOLOsonReal-timeObjectDetection作者:WenyuLv,YianZhao等作者机构:BaiduInc.论文链接:https://arxiv.org/pdf/2304.08069.pdf代
Selenium自动化测试入门:浏览器多窗口切换
测试杂货铺
selenium 测试工具 软件测试 自动化测试 python 职场和发展 测试用例
点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快有时web应用会打开多个浏览器窗口,当我们要定位新窗口中的元素时,我们需要将webDriver的handle(句柄)指定到新窗口。什么意思?假设我们打开web应用,在系统运行过程中重新打开一个新窗口(可以是页签,当前浏览器存在两个窗口),这时我们webDriver对浏览器的操作指针(句柄)还再原窗口,如果需要操作新窗口元素就要将handl
接口自动化测试框架设计之参数传递
测试杂货铺
python 软件测试 自动化测试 测试工具 职场和发展 测试用例 接口测试
点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快在我们设计自动化测试框架的时候,我们会经常将测试数据保存在外部的文件(如Excel、YAML)中,实现测试脚本与测试数据解耦,方便后期维护。当涉及到业务场景接口用例时,由于接口与接口存在关联关系,需要从上游接口取出来相关字段传递给下游接口作为入参使用,比如在Excel中我们会这样做:在excel中新增一列【提取响应】,将上游接口的响应字段
软件测试技术之跨平台的移动端UI自动化测试(上)
学掌门
软件测试 IT ui 软件测试
摘要:本文提出一种跨平台的UI自动化测试方案,一方面使用像素级的截图对比技术,解决传统UI自动化测试难以验证页面样式的问题;另一方面用统一部署在服务器端的JavaScript测试代码代替Android和iOS测试代码,大大提高编写测试代码的效率。该方案经过实际验证,具有效率高、质量好、便于维护等多方面优点,文中将阐述具体设计思路以及各关键步骤的实现方法,为同类测试提供借鉴。一、背景当前金融服务数字
太厉害了,清华大学出品的这个ai学习教程火出圈。
2501_90658343
人工智能 AIGC 学习 AI写作 AI编程
最近疯传的《DeepSeek:从入门到精通》教程ppt,我已经搞到了。它是由清华大学博士后团队撰写。总共104页,详细的介绍了DeepSeek是什么,有什么用,以及如何正确高效使用DeepSeek的核心干货。完整版ppt资料已经帮大家整理好了,免费领取。领取链接:https://pan.quark.cn/s/c589f1a1982b
基于pytest+requests+allure+yaml实现接口自动化测试框架
csdn950212
测试开发 pytest 接口自动化测试
1.项目背景和目标:这是一个基于Python的接口自动化测试框架,主要目标是:-提供一个稳定、可维护的接口测试解决方案-实现测试用例与测试数据的解耦-提供详细的测试报告和日志记录-支持多环境配置和灵活的用例管理2.技术栈选型框架采用了以下核心技术:pytest:作为测试执行引擎,提供了强大的用例管理和参数化能力requests:处理HTTP请求,支持各种接口调用场景allure:生成美观的测试报告
《炸裂!掌握这些 Spring Boot 干货,面试直接 “开挂”!》
@孤随
JAVA spring boot 面试 后端
SpringBoot重点、面试题及答案详细整理一、SpringBoot重点知识(一)核心概念1.自动配置SpringBoot自动配置基于类路径中的依赖、配置文件以及应用上下文里的Bean情况,借助条件注解来自动设置Spring应用的配置。例如,当类路径中存在spring-data-jpa和数据库驱动时,会自动配置数据源、JPA实体管理器工厂和事务管理器。可通过@EnableAutoConfigur
selenium的使用细节
演技拉满的白马
爬虫 工具 selenium python chrome
selenium的使用实战本节目标:通过selenium得到搜索答案selenium的安装详解本节阅读需要(20)min。本节实操需要(20)min。selenium官网前言selenium的本质是操纵浏览器模拟用户行为!!!这样才能处理需要交互行为的动态网页.所以总结起来可以分为几个大点.控制浏览器操作浏览器等待某个变化出现获取元素的值一、一般的格式#-*-coding:utf-8-*-from
Selenium 对页面元素的操作动作及其语法
静静在思考
# Selenium selenium 测试工具
Selenium提供了丰富的操作动作,用于模拟用户在浏览器中的各种交互行为。以下为你详细介绍常见操作动作及其语法,并结合百度网站为例给出Python代码示例。1.打开网页语法:使用driver.get(url)方法,其中driver是浏览器驱动实例,url是要打开的网页地址。示例代码:fromseleniumimportwebdriverdriver=webdriver.Chrome()drive
题解 | #数组中出现次数超过一半的数字#哈希最简单的解法
2301_79125642
java
前端要转测试大佬们,我是软件工程专业的,毕业后又培训了半年前端,现在公司要我转软件测试,初中级都可以,学着麻烦吗?大概得多长时间?转转java凉面一个数组基本有序应该采用哪种排序方法为什么要有线程池,线程太多会怎么样??阻塞队列与普通队列的区别是?递归与非递归区别是什么?各自的优缺点?递归如何转为非递归题解|#数组中出现次数超过一半的数字#哈希最简单的解法classSolution{public:
阅读Android源码的一些姿势
weixin_34405332
2019独角兽企业重金招聘Python工程师标准>>>前面吐槽了有没有必要阅读Android源码,后面觉得只吐槽不太好,还是应该多少弄点干货。需要说明的是,Android每个系统版本的源码都会有变动,而且代码中时不时Java和Native互相穿插,追求完全看透源码意义不大,把目的定在“理解代码设计的思路,弄清各个生命周期方法调用的顺序”比较实际。日常开发中怎么阅读源码找到正确的源码IDE是日常经常
python爬虫模拟点击和输入,python爬虫实战--selenium模拟登录并自动点击
半夜梳长长的头发
python爬虫模拟点击和输入
爬虫实战项目。爬虫利器:selenium的使用。任务介绍最近刚刚注册了某个网站:HDHome,该站有新手考核任务,其中有一项是需要达到魔力值5000。在魔力值获取方式中,我们看到这一项:“说谢谢=0.5个魔力值”,而网站存活种子数量达到16000+,也就意味着对每个种子说一下谢谢,轻松达到8000+的魔力值,于是,这个项目应运而生。实现思路:获取种子的页面,在每个页面中找到说谢谢的按钮,并点击后,
爬虫实践——selenium、bs4
lucky_chaichai
Python爬虫 selenium requests 爬虫 selenium python
目录一、浏览器的一般设置二、打开网页并获取网页源码的方式1、基于requests库2、基于urlib库3、基于selenium三、HTML解析1、BeautifulSoup2、Selenium动态渲染爬虫:模拟动态操作网页,加载JS(webdriver)3、scrapy框架四、反爬虫操作五、一些常见的异常处理六、url接口调用问题——get、post操作1、get请求2、post请求fromsel
selenium驱动Edge报错解决办法
Dream D
selenium python edge
selenium驱动Edge报错解决办法selenium使用Edge运行时报错Message:‘MicrosoftWebDriver.exe’executableneedstobeinPATH//Anhighlightedblockselenium.common.exceptions.WebDriverException:Message:'MicrosoftWebDriver.exe'execut
DevOps 进化论:腾讯云 CODING-TM 如何助力企业敏捷转型?
Anna_Tong
devops 腾讯云 运维 代码托管 项目管理 ci/cd 敏捷开发
在当今数字化竞争激烈的时代,企业的软件开发模式正经历从传统开发向敏捷开发、DevOps转型的深刻变革。如何在保证代码质量的同时,加快开发、测试与交付流程,成为众多企业研发团队面临的核心挑战。腾讯云CODING-TM作为一站式DevOps平台,提供了从代码托管、持续集成、自动化测试、持续交付到项目管理的全链路解决方案,助力企业高效落地敏捷开发,实现研发效能的全面提升。为什么企业需要DevOps?敏捷
python的selenium库模拟输入和点击
mangge08
selenium 测试工具
使用python打开已经登录的谷歌浏览器,模拟录入文本提交数据。1、执行命令行,系统会打开浏览器,手工登录"C:\ProgramFiles\Google\Chrome\Application\chrome.exe"--remote-debugging-port=9223--user-data-dir="C:\tmp"2、下载谷歌驱动,先看谷歌版本,再谷歌地址栏输入:chrome://setting
干货:DeepSeek+SpringAI实现流式对话!
液态不合群
deepseek
前面一篇文章我们实现了《炸裂:SpringAI内置DeepSeek啦!》,但是大模型的响应速度通常是很慢的,为了避免用户用户能够耐心等待输出的结果,我们通常会使用流式输出一点点将结果输出给用户。那么问题来了,想要实现流式结果输出,后端和前端要如何配合?后端要使用什么技术实现流式输出呢?接下来本文给出具体的实现代码,先看最终实现效果:解决方案在SpringBoot中实现流式输出可以使用Sse(Ser
prompt技术结合大模型 生成测试用例
小赖同学啊
自动化测试(app pc API) python prompt 测试用例
要利用prompt技术结合大模型对目标B/S架构软件系统进行测试,以下以使用Python调用OpenAI的GPT模型进行功能测试用例生成,再借助Selenium库执行测试为例,给出一个完整的实现示例。前提条件安装依赖库:你需要安装openai和selenium库,可以使用以下命令进行安装:pipinstallopenaiselenium获取OpenAIAPI密钥:你需要在OpenAI平台上注册并获
自动化测试常见问题详解
测试老哥
测试用例 软件测试 自动化测试 职场和发展 测试工具 python 接口测试
点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快选择适合自己的,落地应用,是当下我们应该做的。目前国内的互联网行业,大环境来说,还处在一个快速发展,需要流程化标准化的时期,如何跟上不断变幻发展的节奏,除了不断了解接触新的东西,还需要不断学习,提升自身,以内在的驱动力,去紧跟时代浪潮。即使做不了弄潮儿,也不能变成时代淘汰的那一批。一、自动化测试简介1、为什么要进行自动化测试?①黑盒测试回
TikTok营销实操干货:如何让你的外贸生意快速出圈?
AIsocial
AI社媒引流王 人工智能 大数据
TikTok,作为全球下载量最高的短视频平台,已经成为外贸企业获取海外客户的强大工具。相比传统社交媒体,TikTok凭借其短视频传播的高效性和娱乐性,为外贸营销提供了新的增长机会。那么,外贸人应该如何玩转TikTok,让生意快速出圈?今天就分享一套TikTok营销实操干货技巧,助你打造爆款内容,精准获取客户!1.找准目标市场,明确定位TikTok覆盖全球200多个国家,每个地区的用户喜好和文化都不
掌握好这几个模块,进大厂就稳了!!多个大厂SSP选手超详细分享
后端
作者介绍浙江大学软件工程硕士生淘天后端研发工程师秋招斩获阿里、字节、快手、京东、美团等多个大厂研发ssp/sp持续分享秋招经验分享、高频八股问题、最新大厂面经、硬核技术干货……全网同号,欢迎关注本文罗列了后端研发进入大厂或者拿大厂SSP的几个重要模块‼️,供大家自检~关注【码间烟火录】,可以获取最新的技术干货!1、学历与奖项重要程度:学历与奖项是进入大厂的敲门砖,面试过程中依然看的是展现出来的技术
vue3 关于插槽的使用
加班是不可能的,除非双倍日工资
vue3 vue.js
插槽的使用最近把Vue3重新复习了一下,发现之前掌握的还不够清楚.所以这里做一下笔记以免忘记,话不多说直接上干货.关于Vue3的插槽插槽的使用,用过Vue的人都清楚,就是在需要插入的地方挖个坑,然后你把想要的内容放坑里面,坑就会根据你的内容自动填充,但是插槽也是有区别的:-插槽有好几种:-匿名插槽-具名插槽-作用域插槽-匿名作用域插槽-具名作用域插槽-条件插槽-动态插槽-暂时还是没弄明白插槽这么多
三节课产品经理P1 学习总结
kyle_1111
PDM产品管理 Certificate证书
完成三节课产品经理P1课程,以全优成绩毕业。课程目标用户,是未入行及2年内的初级产品经理,目的是打牢基本功,培养基本产品感。方式是每周线上课程(录像)+作业,助教会对每次作业进行点评,鼓励迭代修改。课程共六周,分别为:产品视角用户需求功能&流程原型功能点&产品调研需求文档对于自身,课程的最大帮助在于实践。因为教材干货,网上资料很多,但容易只看不练。看了很多、很深入,但等到要输出时照样两眼放白。通过
《构建之法》 –读书笔记
Lishq2004
读书笔记 软件开发 软件工程 读书笔记 构建
《构建之法》–读书笔记lishq为什么读这本书:这是一本非常接地气的讲《软件工程》的书,第一次了解到这本书是从豆瓣上看到,看了下密密麻麻的正面评论,觉得内容应该不错。翻阅了几个章节,发现干货确实挺多。为方便大家了解,摘抄作者简介以及部分书评如下。---------------------------------------------------------------------------
selenium 控制内嵌table滚动条的方法
qq_492448446
Web自动化 selenium 测试工具
selenium控制内嵌table滚动条的方法我们经常会遇到selenium无法捕获到对应元素的问题,其中有一个原因是由于页面中存在滚动条,而需要操作的元素需要滑动滚动条后才能捕获到。之前有使用过如下方式:document.getElementById('id').scrollTop=10000但是当出现需要操作内嵌table的滚动条时,这种方式就不可用了。正确的操作方式如下,遇到这种情况时,需要
python自动化框架pytest_全功能Python测试框架:pytest
weixin_39637646
python通用测试框架大多数人用的是unittest+HTMLTestRunner,这段时间看到了pytest文档,发现这个框架和丰富的plugins很好用,所以来学习下pytest.image.pngpytest是一个非常成熟的全功能的Python测试框架,主要有以下几个特点:简单灵活,容易上手支持参数化能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动
print不起作用 pytest_全功能Python测试框架:pytest
吕欲知
print不起作用 pytest
python通用测试框架大多数人用的是unittest+HTMLTestRunner,这段时间看到了pytest文档,发现这个框架和丰富的plugins很好用,所以来学习下pytest.pytest是一个非常成熟的全功能的Python测试框架,主要有以下几个特点:简单灵活,容易上手支持参数化能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化
Python测试框架:pytest 入门
互联网杂货铺
职场和发展 python 自动化测试 测试工具 软件测试 pytest 测试用例
点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快pytest是一个功能强大而易于使用的Python测试框架。它提供了简单的语法和灵活的功能,用于编写和组织测试代码。1、简单易用:pytest的语法简洁明了,使得编写测试用例更加直观和易于理解。它使用assert语句来验证预期结果,让测试代码更加简洁易读。2、自动发现测试:pytest能够自动发现并执行测试文件和测试函数。它遵循命名规则(
SQL的各种连接查询
xieke90
UNION ALL UNION 外连接 内连接 JOIN
一、内连接
概念:内连接就是使用比较运算符根据每个表共有的列的值匹配两个表中的行。
内连接(join 或者inner join )
SQL语法:
select * fron
java编程思想--复用类
百合不是茶
java 继承 代理 组合 final类
复用类看着标题都不知道是什么,再加上java编程思想翻译的比价难懂,所以知道现在才看这本软件界的奇书
一:组合语法:就是将对象的引用放到新类中即可
代码:
package com.wj.reuse;
/**
*
* @author Administrator 组
[开源与生态系统]国产CPU的生态系统
comsci
cpu
计算机要从娃娃抓起...而孩子最喜欢玩游戏....
要让国产CPU在国内市场形成自己的生态系统和产业链,国家和企业就不能够忘记游戏这个非常关键的环节....
投入一些资金和资源,人力和政策,让游
JVM内存区域划分Eden Space、Survivor Space、Tenured Gen,Perm Gen解释
商人shang
jvm内存
jvm区域总体分两类,heap区和非heap区。heap区又分:Eden Space(伊甸园)、Survivor Space(幸存者区)、Tenured Gen(老年代-养老区)。 非heap区又分:Code Cache(代码缓存区)、Perm Gen(永久代)、Jvm Stack(java虚拟机栈)、Local Method Statck(本地方法栈)。
HotSpot虚拟机GC算法采用分代收
页面上调用 QQ
oloz
qq
<A href="tencent://message/?uin=707321921&Site=有事Q我&Menu=yes">
<img style="border:0px;" src=http://wpa.qq.com/pa?p=1:707321921:1></a>
一些问题
文强chu
问题
1.eclipse 导出 doc 出现“The Javadoc command does not exist.” javadoc command 选择 jdk/bin/javadoc.exe 2.tomcate 配置 web 项目 .....
SQL:3.mysql * 必须得放前面 否则 select&nbs
生活没有安全感
小桔子
生活 孤独 安全感
圈子好小,身边朋友没几个,交心的更是少之又少。在深圳,除了男朋友,没几个亲密的人。不知不觉男朋友成了唯一的依靠,毫不夸张的说,业余生活的全部。现在感情好,也很幸福的。但是说不准难免人心会变嘛,不发生什么大家都乐融融,发生什么很难处理。我想说如果不幸被分手(无论原因如何),生活难免变化很大,在深圳,我没交心的朋友。明
php 基础语法
aichenglong
php 基本语法
1 .1 php变量必须以$开头
<?php
$a=” b”;
echo
?>
1 .2 php基本数据库类型 Integer float/double Boolean string
1 .3 复合数据类型 数组array和对象 object
1 .4 特殊数据类型 null 资源类型(resource) $co
mybatis tools 配置详解
AILIKES
mybatis
MyBatis Generator中文文档
MyBatis Generator中文文档地址:
http://generator.sturgeon.mopaas.com/
该中文文档由于尽可能和原文内容一致,所以有些地方如果不熟悉,看中文版的文档的也会有一定的障碍,所以本章根据该中文文档以及实际应用,使用通俗的语言来讲解详细的配置。
本文使用Markdown进行编辑,但是博客显示效
继承与多态的探讨
百合不是茶
JAVA面向对象 继承 对象
继承 extends 多态
继承是面向对象最经常使用的特征之一:继承语法是通过继承发、基类的域和方法 //继承就是从现有的类中生成一个新的类,这个新类拥有现有类的所有extends是使用继承的关键字:
在A类中定义属性和方法;
class A{
//定义属性
int age;
//定义方法
public void go
JS的undefined与null的实例
bijian1013
JavaScript JavaScript
<form name="theform" id="theform">
</form>
<script language="javascript">
var a
alert(typeof(b)); //这里提示undefined
if(theform.datas
TDD实践(一)
bijian1013
java 敏捷 TDD
一.TDD概述
TDD:测试驱动开发,它的基本思想就是在开发功能代码之前,先编写测试代码。也就是说在明确要开发某个功能后,首先思考如何对这个功能进行测试,并完成测试代码的编写,然后编写相关的代码满足这些测试用例。然后循环进行添加其他功能,直到完全部功能的开发。
[Maven学习笔记十]Maven Profile与资源文件过滤器
bit1129
maven
什么是Maven Profile
Maven Profile的含义是针对编译打包环境和编译打包目的配置定制,可以在不同的环境上选择相应的配置,例如DB信息,可以根据是为开发环境编译打包,还是为生产环境编译打包,动态的选择正确的DB配置信息
Profile的激活机制
1.Profile可以手工激活,比如在Intellij Idea的Maven Project视图中可以选择一个P
【Hive八】Hive用户自定义生成表函数(UDTF)
bit1129
hive
1. 什么是UDTF
UDTF,是User Defined Table-Generating Functions,一眼看上去,貌似是用户自定义生成表函数,这个生成表不应该理解为生成了一个HQL Table, 貌似更应该理解为生成了类似关系表的二维行数据集
2. 如何实现UDTF
继承org.apache.hadoop.hive.ql.udf.generic
tfs restful api 加auth 2.0认计
ronin47
目前思考如何给tfs的ngx-tfs api增加安全性。有如下两点:
一是基于客户端的ip设置。这个比较容易实现。
二是基于OAuth2.0认证,这个需要lua,实现起来相对于一来说,有些难度。
现在重点介绍第二种方法实现思路。
前言:我们使用Nginx的Lua中间件建立了OAuth2认证和授权层。如果你也有此打算,阅读下面的文档,实现自动化并获得收益。SeatGe
jdk环境变量配置
byalias
java jdk
进行java开发,首先要安装jdk,安装了jdk后还要进行环境变量配置:
1、下载jdk(http://java.sun.com/javase/downloads/index.jsp),我下载的版本是:jdk-7u79-windows-x64.exe
2、安装jdk-7u79-windows-x64.exe
3、配置环境变量:右击"计算机"-->&quo
《代码大全》表驱动法-Table Driven Approach-2
bylijinnan
java
package com.ljn.base;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.uti
SQL 数值四舍五入 小数点后保留2位
chicony
四舍五入
1.round() 函数是四舍五入用,第一个参数是我们要被操作的数据,第二个参数是设置我们四舍五入之后小数点后显示几位。
2.numeric 函数的2个参数,第一个表示数据长度,第二个参数表示小数点后位数。
例如:
select cast(round(12.5,2) as numeric(5,2))  
c++运算符重载
CrazyMizzz
C++
一、加+,减-,乘*,除/ 的运算符重载
Rational operator*(const Rational &x) const{
return Rational(x.a * this->a);
}
在这里只写乘法的,加减除的写法类似
二、<<输出,>>输入的运算符重载
&nb
hive DDL语法汇总
daizj
hive 修改列 DDL 修改表
hive DDL语法汇总
1、对表重命名
hive> ALTER TABLE table_name RENAME TO new_table_name;
2、修改表备注
hive> ALTER TABLE table_name SET TBLPROPERTIES ('comment' = new_comm
jbox使用说明
dcj3sjt126com
Web
参考网址:http://www.kudystudio.com/jbox/jbox-demo.html jBox v2.3 beta [
点击下载]
技术交流QQGroup:172543951 100521167
[2011-11-11] jBox v2.3 正式版
- [调整&修复] IE6下有iframe或页面有active、applet控件
UISegmentedControl 开发笔记
dcj3sjt126com
// typedef NS_ENUM(NSInteger, UISegmentedControlStyle) {
// UISegmentedControlStylePlain, // large plain
&
Slick生成表映射文件
ekian
scala
Scala添加SLICK进行数据库操作,需在sbt文件上添加slick-codegen包
"com.typesafe.slick" %% "slick-codegen" % slickVersion
因为我是连接SQL Server数据库,还需添加slick-extensions,jtds包
"com.typesa
ES-TEST
gengzg
test
package com.MarkNum;
import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.annotation
为何外键不再推荐使用
hugh.wang
mysql DB
表的关联,是一种逻辑关系,并不需要进行物理上的“硬关联”,而且你所期望的关联,其实只是其数据上存在一定的联系而已,而这种联系实际上是在设计之初就定义好的固有逻辑。
在业务代码中实现的时候,只要按照设计之初的这种固有关联逻辑来处理数据即可,并不需要在数据库层面进行“硬关联”,因为在数据库层面通过使用外键的方式进行“硬关联”,会带来很多额外的资源消耗来进行一致性和完整性校验,即使很多时候我们并不
领域驱动设计
julyflame
VO DAO 设计模式 DTO po
概念:
VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。
DTO(Data Transfer Object):数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,我泛指用于展示层与服务层之间的数据传输对
单例设计模式
hm4123660
java Singleton 单例设计模式 懒汉式 饿汉式
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
&nb
logback
zhb8015
log logback
一、logback的介绍
Logback是由log4j创始人设计的又一个开源日志组件。logback当前分成三个模块:logback-core,logback- classic和logback-access。logback-core是其它两个模块的基础模块。logback-classic是log4j的一个 改良版本。此外logback-class
整合Kafka到Spark Streaming——代码示例和挑战
Stark_Summer
spark storm zookeeper PARALLELISM processing
作者Michael G. Noll是瑞士的一位工程师和研究员,效力于Verisign,是Verisign实验室的大规模数据分析基础设施(基础Hadoop)的技术主管。本文,Michael详细的演示了如何将Kafka整合到Spark Streaming中。 期间, Michael还提到了将Kafka整合到 Spark Streaming中的一些现状,非常值得阅读,虽然有一些信息在Spark 1.2版
spring-master-slave-commondao
王新春
DAO spring dataSource slave master
互联网的web项目,都有个特点:请求的并发量高,其中请求最耗时的db操作,又是系统优化的重中之重。
为此,往往搭建 db的 一主多从库的 数据库架构。作为web的DAO层,要保证针对主库进行写操作,对多个从库进行读操作。当然在一些请求中,为了避免主从复制的延迟导致的数据不一致性,部分的读操作也要到主库上。(这种需求一般通过业务垂直分开,比如下单业务的代码所部署的机器,读去应该也要从主库读取数