本文来自“汇智动力学院”知乎号。
第一部分:使用测试工具从自动化测试的定义开始,主要讨论自动化测试如何开展的话题。
第二部分:构建测试方案在熟悉自动化测试的基础上,主要讨论如何构建优秀的自动化测试。
写在最前面:目前自动化测试并不属于新鲜的事物,或者说自动化测试的各种方法论已经层出不穷,但是,能够在项目中持之以恒的实践自动化测试的团队,却依旧不是非常多。有的团队知道怎么做,做的还不够好;有的团队还正在探索和摸索怎么做,甚至还有一些多方面的技术上和非技术上的旧系统需要重构…… 本文将会从使用
和实践
两个视角,尝试对基于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)
母亲节如何做小红书营销
美橙传媒
小红书的一举一动引起了外界的高度关注。通过爆款笔记和流行话题,我们可以看到“干货”类型的内容在小红书中偏向实用的生活经验共享和生活指南非常受欢迎。根据运营社的分析,这种现象是由小红书用户心智和内容社区背后机制共同决定的。首先,小红书将使用“强搜索”逻辑为用户提供特定的“搜索场景”。在“我必须这样生活”中,大量使用了满足小红书站用户喜好和需求的内容。内容社区自制的高质量内容也吸引了寻找营销新途径的品
Python神器!WEB自动化测试集成工具 DrissionPage
亚丁号
python 开发语言
一、前言用requests做数据采集面对要登录的网站时,要分析数据包、JS源码,构造复杂的请求,往往还要应付验证码、JS混淆、签名参数等反爬手段,门槛较高。若数据是由JS计算生成的,还须重现计算过程,体验不好,开发效率不高。使用浏览器,可以很大程度上绕过这些坑,但浏览器运行效率不高。因此,这个库设计初衷,是将它们合而为一,能够在不同须要时切换相应模式,并提供一种人性化的使用方法,提高开发和运行效率
【Python搞定车载自动化测试】——Python实现车载以太网DoIP刷写(含Python源码)
疯狂的机器人
Python搞定车载自动化 python DoIP UDS ISO 14229 1SO 13400 Bootloader tcp/ip
系列文章目录【Python搞定车载自动化测试】系列文章目录汇总文章目录系列文章目录前言一、环境搭建1.软件环境2.硬件环境二、目录结构三、源码展示1.DoIP诊断基础函数方法2.DoIP诊断业务函数方法3.27服务安全解锁4.DoIP自动化刷写四、测试日志1.测试日志五、完整源码链接前言随着智能电动汽车行业的发展,汽车=智能终端+四个轮子,各家车企都推出了各自的OTA升级方案,本章节主要介绍如何使
00. 这里整理了最全的爬虫框架(Java + Python)
有一只柴犬
爬虫系列 爬虫 java python
目录1、前言2、什么是网络爬虫3、常见的爬虫框架3.1、java框架3.1.1、WebMagic3.1.2、Jsoup3.1.3、HttpClient3.1.4、Crawler4j3.1.5、HtmlUnit3.1.6、Selenium3.2、Python框架3.2.1、Scrapy3.2.2、BeautifulSoup+Requests3.2.3、Selenium3.2.4、PyQuery3.2
【自动化测试】UI自动化的分类、如何选择合适的自动化测试工具以及其中appium的设计理念、引擎和引擎如何工作
Lossya
ui 自动化 测试工具 自动化测试 appium
引言UI自动化测试主要针对软件的用户界面进行测试,以确保用户界面元素的交互和功能符合预期文章目录引言一、UI自动化的分类1.1基于代码的自动化测试1.2基于录制/回放的自动化测试1.3基于框架的自动化测试1.4按测试对象分类1.5按测试层次分类1.6按测试执行方式分类1.7按测试目的分类二、如何选择合适的自动化测试工具2.1项目需求分析2.2工具特性评估2.3成本考虑2.4团队技能2.5试用和评估
干货|自我介绍这三个坑,99%的概率你踩过!
夏麦生命的魔术师
自我介绍——每个人都需要的一张名片。图片源自网络从2018年到现在,在做演讲俱乐部的2年时间里,我在演讲活动现场听过1000+人的自我介绍,自我介绍做得超棒的人真不多!最近,我花了近几个月时间,仔细研究了500+人线上场景的自我介绍,发现优秀的自我介绍也不多!为什么做一张优秀的自我介绍就这么难呢?这个问题,在我帮几十个人打造了自我介绍的过程一直困扰着我。经过了几个月的时间思考与实践,终于发现三个—
使用selenium调用firefox提示Profile Missing的问题解决
歪歪的酒壶
selenium 测试工具 python
在Ubuntu22.04环境中,使用python3运行selenium提示ProfileMissing,具体信息为:YourFirefoxprofilecannotbeloaded.Itmaybemissingorinaccessible在这个问题的环境中firefox浏览器工作正常。排查中,手动在命令行执行firefox可以打开浏览器,但是出现如下提示Gtk-Message:15:32:09.9
小学科学课堂管理规培有感
31c6a3d23d4e
今天进行了这学期的第一次新教师规培,又是干货满满的一次学习,两位有经验的老教师分享了自己很多年来有关科学教学的经验。苏老师的语言风趣幽默,通过他的课堂管理规则,懂得了语言的艺术。艳姐分享的培养小助手,对我的帮助很多,小组长,(做记录、整理材料、管理卫生)。既培养了学生,又减轻老师的工作量,还有评价表,学起来学起来!
app推广一手资源在哪里找?盘点2024年必备的八大app拉新渠道
U客直谈APP
在2024年即将来临之际,还是有许多小伙伴表示不知道app推广一手资源在哪里找,又要从哪里去了解各个资源渠道的不同特性。好消息来啦,本篇文章就将带大家盘点24年必备的八大app拉新渠道,全文干货,拆解分析点评一步到位,还不快快收藏起来~1.app推广一手资源来源:U客直谈U客直谈是一个资源对接平台,专注于为推广人员提供海量丰富的app拉新任务。其具有数量丰富且类型多样的app拉新任务,使得U客直谈
自动化测试工程师面试,常问的问题有哪些?
自动化测试 老司机
软件测试 测试工程师 自动化测试 面试 职场和发展 软件测试 selenium 测试工具 android 测试工程师
自动化测试工程师面试是非常重要的环节,面试官会通过一系列的问题来评估候选人的技能和经验。下面是一些常见的问题,以及如何详细而规范地回答这些问题的建议。1.请介绍一下你的自动化测试经验。回答这个问题时,可以从项目经验、使用的自动化测试工具、编写的测试脚本等方面来介绍自己的经验。重点强调你在自动化测试领域的技能和擅长的领域。2.你在自动化测试中使用的编程语言是什么?为什么选择这种语言?回答这个问题时,
Playwright 自动化验证码教程
吉小雨
python库 自动化 数据库 运维 python
Playwright自动化点击验证码教程在自动化测试中,Playwright是一个流行的浏览器自动化工具,支持多种浏览器的高效操作。验证码(如图片验证码、滑动验证码等)是网页中常见的反自动化机制,常常需要特别处理。我们将介绍如何使用Playwright自动化点击验证码,并提供几种常见验证码的处理方案。官方文档链接:Playwright官方文档一、Playwright环境搭建1.1安装Playwri
平衡计分卡从4个维度,让你的员工从管理思维,转变为经营思维
思想会
关注【本号】更多关于企业管理、员工激励、薪酬制度、绩效激励等内容免费与你分享!私信“绩效”送您关于员工管理、绩效薪酬的干货视频。作者:刁老师(CQZHHC1980)基于平衡计分卡的考核体系截至2000年年底,美国、英国和斯堪的纳维亚地区(瑞典、丹麦、挪威、冰岛的泛称)的许多公司都在使用平衡计分卡,而且还有许多公司打算很快使用平衡计分卡。多种数据显示,平衡计分卡自产生以来,已经成为绩效管理领域较为主
软件测试/测试开发/全日制 |利用Django REST framework构建微服务
霍格沃兹-慕漓
django 微服务 sqlite
霍格沃兹测试开发学社推出了《Python全栈开发与自动化测试班》。本课程面向开发人员、测试人员与运维人员,课程内容涵盖Python编程语言、人工智能应用、数据分析、自动化办公、平台开发、UI自动化测试、接口测试、性能测试等方向。为大家提供更全面、更深入、更系统化的学习体验,课程还增加了名企私教服务内容,不仅有名企经理为你1v1辅导,还有行业专家进行技术指导,针对性地解决学习、工作中遇到的难题。让找
软件测试缺陷的管理流程(上):构成要素与流程说明
程序员笑笑
软件测试 自动化测试 软件测试 功能测试 程序人生 职场和发展
实施测试活动过程中,针对缺陷开展有效跟踪管理是测试工程师质量保证活动的重点。因此,在一个成熟的测试团队或组织内,缺陷管理流程的完善与否直接决定了测试活动的质量。缺陷管理流程通常由角色定义、流程定义、工具应用、缺陷分析模型等几个关键因素构成:角色定义:表述了在缺陷管理流程中所涉及的若干角色及其职责内容,从而清晰明确定义每个流程节点中角色所需完成的事务。流程定义:规定了在项目或产品实施测试活动时所需遵
两种方法判断Python的位数是32位还是64位
sanqima
Python编程 电脑 python 开发语言
Python从1991年发布以来,凭借其简洁、清晰、易读的语法、丰富的标准库和第三方工具,在Web开发、自动化测试、人工智能、图形识别、机器学习等领域发展迅猛。 Python是一种胶水语言,通过Cython库与C/C++语言进行链接,通过Jython库与Java语言进行链接。 Python是跨平台的,可运行在多种操作系统上,包括但不限于Windows、Linux和macOS。这意味着用Py
新媒体人#自媒体魂!新手到入门|一篇足矣
ph萝卜
最近已学习《新媒体写作平台策划与运营》课程,先梳理梳理学习感悟,后上满满的干货!希望阅读文章的你可以带来一丝想法,目的就达到了!想干成一件事,最靠谱的就是去认识一个已经做成了这件事情的人,或是认识与这件事情相关的人。做到不耻下问,足或有所长,你找他们聊天一小时,足以比你看多少书来的实际,就打个比方,我想利用我的空余时间做微信公众平台,我想到的是学习相关知识,包括编辑,美化,排版,运营,与其同时,我
mysql case 干货
lack倪酱
这是我舍友@某人提供的是为了做酒店时判断每个楼栋有几间空房子的。房间表与数据楼栋表与数据查询楼栋房间总数查询空房间数当时就在想怎么把后一个单列的数据合并到前面那三列的数据里呢?又是百度,又是谷歌,都是什么“unitall”。。表示我要的不是这个。有点难为我小脑瓜,实在是对数据库不了解,只会日常操作。最后是我舍友想出了解决办法直接贴图好了,如果想要了解case是什么,你可以自行查资料。学习查东西也是
职场内卷,太累了!7个方法让你“破局”(收藏)
张涔汐
文|张涔汐上上个周,涔汐做了一场直播,关于个人如何快速成长的话题。涔汐实力宠粉,把直播干货分享给大家了。话不多说,上干货。我们先思考一个问题,为什么有些人在职场三年五载,还是老样子呢?因为他们总是指望别人能教他,就如同《天道》的王庙村村民,没事儿往教堂跑,指望上帝保佑发财,期待高人指点脱贫致富一个道理。如果你想要在短短时间内,获得成长。01摒弃指望别人教你成长的观念,保持成长思维很多人面试的过程中
容易陷入的两性误区:男女恋爱,女人有哪些雷区不能踩?
清晨白鹿
在知乎看到有人讨论:男女交往时最忌讳的恋爱误区。对这个话题我觉得有必要好好聊一聊。很多人都追求过喜欢的人,或者谈过恋爱。但谈过恋爱并不代表就获得了爱情,也不是每个人都能拥有甜甜的恋爱。由于很多人对两性关系的认知存在偏差,导致了错失喜欢的人,糟糕的恋爱体验,或者分手。那么,男女恋爱,有哪些雷区不能踩?男女交往时,恋爱误区都有哪些呢?今天就为大家献上男女相处的干货分享。希望能帮到你们,走出一些误区,收
5条实操干货有效打造你的个人品牌
长安行动派
这是ZerK的第46篇原创相信大家对个人品牌这个词已经不在陌生。尤其是在知识付费的年代,你的个人品牌,就是你的标签!在《深度工作》中说到,在未来有三种人会越来越贵第一种人:能与机器对话,操纵机器的人。人工智能时代的到来,机器毕竟部分取代人类。第二种人:IP,知识产权或者文学潜在财产就像有些网上课程一周卖出的钱和一个机构卖一年一样多。价值99元的课程,10万人购买,是很常见的。爱产出大概就是10万✖
鲨鱼线锻炼方法,全是干货
无可替代的everytime
图片发自App图片发自App图片发自App图片发自App图片发自App图片发自App图片发自App图片发自App图片发自App图片发自App图片发自App图片发自App图片发自App
大数据毕业设计hadoop+spark+hive知识图谱租房数据分析可视化大屏 租房推荐系统 58同城租房爬虫 房源推荐系统 房价预测系统 计算机毕业设计 机器学习 深度学习 人工智能
2401_84572577
程序员 大数据 hadoop 人工智能
做了那么多年开发,自学了很多门编程语言,我很明白学习资源对于学一门新语言的重要性,这些年也收藏了不少的Python干货,对我来说这些东西确实已经用不到了,但对于准备自学Python的人来说,或许它就是一个宝藏,可以给你省去很多的时间和精力。别在网上瞎学了,我最近也做了一些资源的更新,只要你是我的粉丝,这期福利你都可拿走。我先来介绍一下这些东西怎么用,文末抱走。(1)Python所有方向的学习路线(
软件测试面试题
爱学习的执念
面试 软件测试面试 软件测试 服务器 软件测试面试 软件测试 面试
1、测试矿泉水瓶外观界面测试:瓶子外观界面测试主要是测试瓶子的大小、瓶身所体现的各种信息(如字体、颜色)等瓶子的外观特征是否满足公司的最初对瓶子的设计要求。1.瓶身广告和图案的背景颜色是否符合公司设计要求。2.瓶身上所有字体、颜色是否符合公司的设计要求,是否有错别字。3.带广告的图案遇水后是否会掉色或变模糊,广告与图案内容是否合法。4.瓶身是否有防止烫伤、垃圾回收、年龄限制等提示。5.瓶身图标布局
“深圳红树林外国语小学”教育戏剧的师资培训
我爱教育戏剧
2020年8月17日-18日,骑士教育戏剧为红树林外国语小学的老师们进行了一场师训,这篇文章由红树林外国语小学官方微信公众号撰写,骑士转载,以期更多学校了解教育戏剧走进校园的情况。暑假研修教育戏剧专场2020年8月16日-21日,红树林举行了为期六天的入职研修培训各位教育大咖空降来袭,带来了满满的干货讲座你以为红树林的培训只是听讲座吗?NO!NO!NO!在这里,红树林的培训还是这样的:还有这样的!
如何找到自己的优势
小小世界大大精彩
今天来跟大家聊一聊如何寻找自我优势的话题!首先发现优势有什么意义呢?如果只是弥补自己的短板只是会让自己成为一个普通人,而如果发掘自己的优势并将它发挥到极致的时候才能够脱颖而出。那么问题来了,在职场中很多时候我们不清楚自己擅长什么,优势到底在哪?今天就来帮助大家解决如何寻找自己的优势的问题,闲话少叙,直接来干货!1.成就事件法。首先在纸上记下曾经你觉自己做过的有成就或者别人认可的三件事。然后问自己为
Python库之PyAutoGUI的简介、安装、使用方法详细攻略
shadowtalon
爬虫 Python python 爬虫 学习 开发语言
Python库之PyAutoGUI的简介、安装、使用方法详细攻略简介PyAutoGUI是一个Python模块,它可以用来控制鼠标和键盘,实现自动化操作用户界面的功能。它适用于Windows、macOS和Linux操作系统。PyAutoGUI可以用于自动化测试、数据录入、自动化演示等场景。安装PyAutoGUI可以通过pip命令轻松安装。打开你的命令行工具(例如CMD、Terminal或者shell
科锐国际(计算机类),汤臣倍健,中建三局,宁德时代,途游游戏,得物,顺丰,康冠科技24春招内推
weixin_53585422
c++ 算法 python java c语言
科锐国际(计算机类),汤臣倍健,中建三局,宁德时代,途游游戏,得物,顺丰,康冠科技24春招内推①汤臣倍健【内推岗位】:市场类、营销类、研发类、电商类、职能类、IT技术类、商业分析类、生产运营类【内推链接】https://sourl.cn/JSDhLU【推荐码】ES3W2T②科锐国际(OD项目组--计算机专场)【招聘岗位】软件开发工程师、软件测试工程师、大数据开发工程师、运维工程师等计算机类岗位,2
如何通过学习经典,写出一篇优质的情感爆款文【续集】
小夭读书
昨天文章中说到的都是如何通过阅读经典后,再对比自我写作中总结出的盲点,今天就要详细说说爆款文的干货内容了。首先是爆款文的选题:如果你大量去阅读一些类似的文章,你就会发现所有的文章都有套路,只要你能用心去归类总结,就一定能找到你想要写的主题。
把时间花在刀刃上
方糖0427
上周读了《小强升职记》,里面讲述了不少时间管理术,简称“GTD方法”,告诉我们如何才能既出色地完成工作,又快乐地享受生活,可谓干货满满,所以有了这期文章,来归纳一些提高人生效率和质量的锦囊。首先,提出一个概念“时间黑洞”,指的是,我们无意识浪费时间的情况,比如工作累了想休息一下,开始刷手机,刷完了朋友圈,又忍不住刷微博,刷豆瓣,刷抖音,不知不觉时间就流失了一大半。如果我们做事情不够主动,目的性不强
土巴兔“兔友约” 落地中原 共商数字化发展大计
快消日日谈
10月13日,土巴兔联合大自然家居举办的“兔友约·精英汇”装企学习交流活动在郑州举办,当地近百名装企代表报名参加,全国知名家居建材与家电品牌代表出席并进行了干货满满的分享。活动采取“线上直播+线下交流”的方式。首先,土巴兔电商运营负责人彭惠清为大家带来《后疫情时代装企行业的变与不变》主题演讲,以用户角度为切入点,深入分析了解用户过去和现在需求的不同,装企需要以用户为基础,以市场为导向,转变为互联网
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层,要保证针对主库进行写操作,对多个从库进行读操作。当然在一些请求中,为了避免主从复制的延迟导致的数据不一致性,部分的读操作也要到主库上。(这种需求一般通过业务垂直分开,比如下单业务的代码所部署的机器,读去应该也要从主库读取数