WEB测试的测试点

这里给大家分享篇关于WEB测试的测试点的文章
                               一、功能测试
对于网站的测试而言,每一个独立的功能模块需要单独的测试用例的设计导出,主要依据为《需求规格说明书》及《详细设计说明书》,对于应用程序模块需要设计者提供基本路径测试法的测试用例。
    1、链接测试
链接是Web应用系统的一个主要特征,它是在页面之间切换和指导用户去一些不知道地址的页面的主要手段。链接测试可分为三个方面:
1)测试所有链接是否按指示的那样确实链接到了该链接的页面;
2)测试所链接的页面是否存在;
3)保证Web应用系统上没有孤立的页面,所谓孤立页面是指没有链接指向该页面,只有知道正确的URL地址才能访问。
链接测试可以自动进行,现在已经有许多工具可以采用。链接测试必须在集成测试阶段完成,也就是说,在整个Web应用系统的所有页面开发完成之后进行链接测试。
Xenu——主要测试链接的正确性的工具
可惜的是对于动态生成的页面的测试会出现一些错误。
 2、表单测试
当用户给Web应用系统管理员提交信息时,就需要使用表单操作,例如用户注册、登陆、信息提交等。在这种情况下,我们必须测试提交操作的完整性,以校验提交给服务器的信息的正确性。例如:用户填写的出生日期与职业是否恰当,填写的所属省份与所在城市是否匹配等。如果使用了默认值,还要检验默认值的正确性。如果表单只能接受指定的某些值,则也要进行测试。例如:只能接受某些字符,测试时可以跳过这些字符,看系统是否会报错。
要测试这些程序,需要验证服务器能正确保存这些数据,而且后台运行的程序能正确解释和使用这些信息。
B/S结构实现的功能可能主要的就在这里,提交数据,处理数据等如果有固定的操作流程可以考虑自动化测试工具的录制功能,编写可重复使用的脚本代码,可以在测试、回归测试时运行以便减轻测试人员工作量。
我们对UM子系统中各个功能模块中的各项功能进行逐一的测试,主要测试方法为:边界值测试、等价类测试,以及异常类测试。测试中要保证每种类型都有2个以上的典型数值的输入,以确保测试输入的全面性。
3、Cookies测试
Cookies通常用来存储用户信息和用户在某应用系统的操作,当一个用户使用Cookies访问了某一个应用系统时,Web服务器将发送关于用户的信息,把该信息以Cookies的形式存储在客户端计算机上,这可用来创建动态和自定义页面或者存储登陆等信息。
如果Web应用系统使用了Cookies,就必须检查Cookies是否能正常工作而且对这些信息已经加密。测试的内容可包括Cookies是否起作用,是否按预定的时间进行保存,刷新对Cookies有什么影响等。
4、设计语言测试
Web设计语言版本的差异可以引起客户端或服务器端严重的问题,例如使用哪种版本的HTML等。当在分布式环境中开发时,开发人员都不在一起,这个问题就显得尤为重要。除了HTML的版本问题外,不同的脚本语言,例如Java、Javascrīpt、 ActiveX、VBscrīpt或Perl等也要进行验证。
5、数据库测试
在Web应用技术中,数据库起着重要的作用,数据库为Web应用系统的管理、运行、查询和实现用户对数据存储的请求等提供空间。在Web应用中,最常用的数据库类型是关系型数据库,可以使用SQL对信息进行处理。
在使用了数据库的Web应用系统中,一般情况下,可能发生两种错误,分别是数据一致性错误和输出错误。数据一致性错误主要是由于用户提交的表单信息不正确而造成的,而输出错误主要是由于网络速度或程序设计问题等引起的,针对这两种情况,可分别进行测试。
二、性能测试
网站的性能测试对于网站的运行而言异常重要,但是目前对于网站的性能测试做的不够,我们在进行系统设计时也没有一个很好的基准可以参考,因而建立网站的性能测试的一整套的测试方案将是至关重要的。
网站的性能测试主要从三个方面进行:连接速度测试、负荷测试(Load)和压力测试(Stress),
连接速度测试指的是打开网页的响应速度测试。负荷测试指的是进行一些边界数据的测试,压力测试更像是恶意测试,压力测试倾向应该是致使整个系统崩溃。
 1、连接速度测试
用户连接到Web应用系统的速度根据上网方式的变化而变化,他们或许是电话拨号,或是宽带上网。当下载一个程序时,用户可以等较长的时间,但如果仅仅访问一个页面就不会这样。如果Web系统响应时间太长(例如超过5秒钟),用户就会因没有耐心等待而离开。
另外,有些页面有超时的限制,如果响应速度太慢,用户可能还没来得及浏览内容,就需要重新登陆了。而且,连接速度太慢,还可能引起数据丢失,使用户得不到真实的页面。
2、负载测试
负载测试是为了测量Web系统在某一负载级别上的性能,以保证Web系统在需求范围内能正常工作。负载级别可以是某个时刻同时访问Web系统的用户数量,也可以是在线数据处理的数量。例如:Web应用系统能允许多少个用户同时在线?如果超过了这个数量,会出现什么现象?Web应用系统能否处理大量用户对同一个页面的请求?
3、压力测试
负载测试应该安排在Web系统发布以后,在实际的网络环境中进行测试。因为一个企业内部员工,特别是项目组人员总是有限的,而一个Web系统能同时处理的请求数量将远远超出这个限度,所以,只有放在Internet上,接受负载测试,其结果才是正确可信的。
进行压力测试是指实际破坏一个Web应用系统,测试系统的反映。压力测试是测试系统的限制和故障恢复能力,也就是测试Web应用系统会不会崩溃,在什么情况下会崩溃。黑客常常提供错误的数据负载,直到Web应用系统崩溃,接着当系统重新启动时获得存取权。
压力测试的区域包括表单、登陆和其他信息传输页面等。
采用的测试工具:
性能测试可以采用相应的工具进行自动化测试,我们目前采用如下工具
ab —–Apache 的测试工具
OpenSTA—开发系统测试架构
           三.接口测试
在很多情况下,web 站点不是孤立。Web 站点可能会与外部服务器通讯,请求数据、
验证数据或提交订单。
1、 服务器接口
第一个需要测试的接口是浏览器与服务器的接口。测试人员提交事务,然后查看服务器
记录,并验证在浏览器上看到的正好是服务器上发生的。测试人员还可以查询数据库,确认事务数据已正确保存。
2、 外部接口
有些 web 系统有外部接口。例如,网上商店可能要实时验证信用卡数据以减少欺诈行
为的发生。测试的时候,要使用 web 接口发送一些事务数据,分别对有效信用卡、无效信用卡和被盗信用卡进行验证。如果商店只使用 Visa 卡和 Mastercard 卡, 可以尝试使用 Discover 卡的数据。(简单的客户端脚本能够在提交事务之前对代码进行识别,例如 3 表示 American Express,4 表示 Visa,5 表示 Mastercard,6 代表Discover。)通常,测试人员需要确认软件能够处理外部服务器返回的所有可能的消息。
3、错误处理
最容易被测试人员忽略的地方是接口错误处理。通常我们试图确认系统能够处理所有错
误,但却无法预期系统所有可能的错误。尝试在处理过程中中断事务,看看会发生什么情况?
订单是否完成?尝试中断用户到服务器的网络连接。尝试中断 web 服务器到信用卡验证服
务器的连接。在这些情况下,系统能否正确处理这些错误?是否已对信用卡进行收费?如果
用户自己中断事务处理,在订单已保存而用户没有返回网站确认的时候,需要由客户代表致
电用户进行订单确认。
四、可用性测试
可用性/易用性方面目前我们只能采用手工测试的方法进行评判,而且缺乏一个很好的评判基准进行,此一方面需要大家共同讨论。
 1、导航测试
导航描述了用户在一个页面内操作的方式,在不同的用户接口控制之间,例如按钮、对话框、列表和窗口等;或在不同的连接页面之间。通过考虑下列问题,可以决定一个Web应用系统是否易于导航:导航是否直观?Web系统的主要部分是否可通过主页存取?Web系统是否需要站点地图、搜索引擎或其他的导航帮助?
在一个页面上放太多的信息往往起到与预期相反的效果。Web应用系统的用户趋向于目的驱动,很快地扫描一个Web应用系统,看是否有满足自己需要的信息,如果没有,就会很快地离开。很少有用户愿意花时间去熟悉Web应用系统的结构,因此,Web应用系统导航帮助要尽可能地准确。
导航的另一个重要方面是Web应用系统的页面结构、导航、菜单、连接的风格是否一致。确保用户凭直觉就知道Web应用系统里面是否还有内容,内容在什么地方。
Web应用系统的层次一旦决定,就要着手测试用户导航功能,让最终用户参与这种测试,效果将更加明显。
2、图形测试
在Web应用系统中,适当的图片和动画既能起到广告宣传的作用,又能起到美化页面的功能。一个Web应用系统的图形可以包括图片、动画、边框、颜色、字体、背景、按钮等。图形测试的内容有:
(1)要确保图形有明确的用途,图片或动画不要胡乱地堆在一起,以免浪费传输时间。Web应用系统的图片尺寸要尽量地小,并且要能清楚地说明某件事情,一般都链接到某个具体的页面。
(2)验证所有页面字体的风格是否一致。
(3)背景颜色应该与字体颜色和前景颜色相搭配。
(4)图片的大小和质量也是一个很重要的因素,一般采用JPG或GIF压缩。
 3、内容测试
内容测试用来检验Web应用系统提供信息的正确性、准确性和相关性。
信息的正确性是指信息是可靠的还是误传的。例如,在商品价格列表中,错误的价格可能引起财政问题甚至导致法律纠纷;信息的准确性是指是否有语法或拼写错误。这种测试通常使用一些文字处理软件来进行,例如使用Microsoft Word的”拼音与语法检查”功能;信息的相关性是指是否在当前页面可以找到与当前浏览信息相关的信息列表或入口,也就是一般Web站点中的所谓”相关文章列表”。
4、整体界面测试
整体界面是指整个Web应用系统的页面结构设计,是给用户的一个整体感。例如:当用户浏览Web应用系统时是否感到舒适,是否凭直觉就知道要找的信息在什么地方?整个Web应用系统的设计风格是否一致?
对整体界面的测试过程,其实是一个对最终用户进行调查的过程。一般Web应用系统采取在主页上做一个调查问卷的形式,来得到最终用户的反馈信息。
对所有的可用性测试来说,都需要有外部人员(与Web应用系统开发没有联系或联系很少的人员)的参与,最好是最终用户的参与。
        五、兼容性测试
需要验证应用程序可以在用户使用的机器上运行。如果您用户是全球范围的,需要测试各种操作系统、浏览器、视频设置和 modem 速度。最后,还要尝试各种设置的组合。
1、平台测试
市场上有很多不同的操作系统类型,最常见的有WindowsUnix、Macintosh、Linux等。Web应用系统的最终用户究竟使用哪一种操作系统,取决于用户系统的配置。这样,就可能会发生兼容性问题,同一个应用可能在某些操作系统下能正常运行,但在另外的操作系统下可能会运行失败。
因此,在Web系统发布之前,需要在各种操作系统下对Web系统进行兼容性测试。
2、浏览器测试
浏览器是Web客户端最核心的构件,来自不同厂商的浏览器对Java,、Javascrīpt、 ActiveX、 plug-ins或不同的HTML规格有不同的支持。例如,ActiveX是Microsoft的产品,是为Internet Explorer而设计的,Javascrīpt是Netscape的产品,Java是Sun的产品等等。另外,框架和层次结构风格在不同的浏览器中也有不同的显示,甚至根本不显示。不同的浏览器对安全性和Java的设置也不一样。
测试浏览器兼容性的一个方法是创建一个兼容性矩阵。在这个矩阵中,测试不同厂商、不同版本的浏览器对某些构件和设置的适应性。
采用测试工具:
通过白盒测试或者黑盒测试导出的测试用例,采用相应的工具进行测试,可以采用OpenSTA进行测试,此测试工具可以采用不同的浏览器进行测试。
3.视频测试
页面版式在 640×400、600×800 或 1024×768 的分辨率模式下是否显示正常? 字体是否太小以至于无法浏览? 或者是太大? 文本和图片是否对齐?
 4.Modem/连接速率测试
是否有这种情况,用户使用 28.8 modem下载一个页面需要 10 分钟,但测试人员在测
试的时候使用的是 T1 专线? 用户在下

mycat三步曲之二(mycat的下载和配置)

一、下载mycat
mycat的官网网址  http://www.mycat.org.cn/,我使用的是mycat的1.4的Linux安装包
下载地址
https://github.com/MyCATApache/Mycat-download/blob/master/1.4-RELEASE/Mycat-server-1.4-release-20151019230038-linux.tar.gz
下载mycat的安装包到 /opt 目录下
[root@admin local]#cd /opt
[root@admin local]#wget https://github.com/MyCATApache/Mycat-download/blob/master/1.4-RELEASE/Mycat-server-1.4-release-20151019230038-linux.tar.gz
[root@admin local]# tar -xvf  Mycat-server-1.4-RELEASE-20151017210032-linux.tar.gz
解压后放到/usr/local下
[root@admin local]#mv mycat /usr/local
[root@admin local]# pwd
/usr/local/mycat
[root@admin local]# ls
bin  catlet  conf  lib  logs  version.txt
以上显示的就是mycat的文件夹.
 

二、配置环境变量

检查是否已经配置好了java的环境变量(本来不打算写的,结果发现还是有好多人搞不好!!!)
[root@admin local]#vim /etc/profile
向文件里面追加以下内容:(根据自己的jdk的路径来写java_home)
JAVA_HOME=/usr/java/jdk1.8.0
JRE_HOME=/usr/java/jdk1.8.0/jre
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
export JAVA_HOME JRE_HOME PATH CLASSPATH
使修改生效
[root@admin local]# source /etc/profile //使修改立即生效
[root@admin local]#java -version
显示
java version “1.8.0_45”
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)
表示我的java环境变量配置好了
 

三、修改mycat配置文件

接下来修改mycat的配置文件
[root@admin local]#cd /usr/local/mycat/conf
[root@admin local]#ls
autopartition-long.txt       partition-hash-int.txt    sequence_db_conf.properties
cacheservice.properties      partition-range-mod.txt   sequence_time_conf.properties
dnindex.properties           router.xml                server.xml
ehcache.xml                  rule.xml                  wrapper.conf
index_to_charset.properties  schema.xml
log4j.xml                    sequence_conf.properties
 
配置文件非常多,配置项也远比amoeba复杂.如果只是简单配置在不同的服务器上进行读写分离只需要配置两个文件
server.xml 和  schema.xml
 

(一)先配置server.xml

找到这一段
</system>
<user name=”test”>
<property name=”password”>test</property>
<property name=”schemas”>TESTDB</property>
</user>
 
<user name=”user”>
<property name=”password”>user</property>
<property name=”schemas”>TESTDB</property>
<property name=”readOnly”>true</property>
</user>
 
这里配置了两个可以来连接的用户
用户1  test   密码test   给予了此用户TESTDB数据库的权限
用户2  user   密码user   给予了此用户TESTDB数据库的只读权限
注意这里的testdb 不一定是你数据库上的真实库名.可以任意指定.只要和接下来的schema.xml的配置文件中的库名统一即可

(二)接下来配置schema.xml

<?xml version=”1.0″?>
<!DOCTYPE mycat:schema SYSTEM “schema.dtd”>
<mycat:schema xmlns:mycat=”http://org.opencloudb/”>
 
<schema name=”TESTDB” checkSQLschema=”false” sqlMaxLimit=”100″>
<!– auto sharding by id (long) –>
<table name=”travelrecord” dataNode=”dn1,dn2,dn3″ rule=”auto-sharding-long” />
 
<!– global table is auto cloned to all defined data nodes ,so can join
with any table whose sharding node is in the same data node –>
<table name=”company” primaryKey=”ID” type=”global” dataNode=”dn1,dn2,dn3″ />
<table name=”hotnews” primaryKey=”ID” dataNode=”dn1,dn2,dn3″
rule=”mod-long” />
<!– <table name=”dual” primaryKey=”ID” dataNode=”dnx,dnoracle2″ type=”global”
rule=”mod-long” /> –>
<table name=”employee” primaryKey=”ID” dataNode=”dn1,dn2″
rule=”sharding-by-intfile” />
<table name=”customer” primaryKey=”ID” dataNode=”dn1,dn2″
rule=”sharding-by-intfile”>
<childTable name=”orders” primaryKey=”ID” joinKey=”customer_id”
parentKey=”id”>
<childTable name=”order_items” joinKey=”order_id”
parentKey=”id” />
</childTable>
<childTable name=”customer_addr” primaryKey=”ID” joinKey=”customer_id”
parentKey=”id” />
</table>
/> –>
</schema>
<!– <dataNode name=”dn1$0-743″ dataHost=”localhost1″ database=”db$0-743″
/> –>
<dataNode name=”dn1″ dataHost=”localhost1″ database=”db1″ />
<dataNode name=”dn2″ dataHost=”localhost1″ database=”db2″ />
<dataNode name=”dn3″ dataHost=”localhost1″ database=”db3″ />
<!–<dataNode name=”dn4″ dataHost=”sequoiadb1″ database=”SAMPLE” />
<dataNode name=”jdbc_dn1″ dataHost=”jdbchost” database=”db1″ />
<dataNode       name=”jdbc_dn2″ dataHost=”jdbchost” database=”db2″ />
<dataNode name=”jdbc_dn3″       dataHost=”jdbchost” database=”db3″ /> –>
<dataHost name=”localhost1″ maxCon=”1000″ minCon=”10″ balance=”0″
writeType=”0″ dbType=”mysql” dbDriver=”native” switchType=”1″  slaveThreshold=”100″>
<heartbeat>select user()</heartbeat>
<!– can have multi write hosts –>
<writeHost host=”hostM1″ url=”localhost:3306″ user=”root”
password=”123456″>
<!– can have multi read hosts –>
 
</writeHost>
<writeHost host=”hostS1″ url=”localhost:3316″ user=”root”
password=”123456″ />
 
 
看着这一大篇你是否和我一样的开始蛋疼.好复杂有木有!
算了给大家来一份我的简单点的.因为我们现在只做库的读写分离,没用分库 没用分表这些东西.
<mycat:schema xmlns:mycat=”http://org.opencloudb/”>
<schema name=”TESTDB” checkSQLschema=”false” sqlMaxLimit=”100″ dataNode=”dn1″>
</schema>
<dataNode name=”dn1″ dataHost=”localhost1″ database=”db1″ />
<dataHost name=”localhost1″ maxCon=”1000″ minCon=”10″ balance=”0″ writeType=”0″ dbType=”mysql” dbDriver=”native” switchType=”1″  slaveThreshold=”100″>
<heartbeat>select user()</heartbeat>
<writeHost host=”hostM1″ url=”192.168.1.100:3306″ user=”root” password=”123456″>
<readHost host=”hostS1″ url=”192.168.1.101:3306″ user=”root” password=”123456″ />
</writeHost>
</dataHost>
 
 

(三)配置文件解释

一,  <schema name=”TESTDB” checkSQLschema=”false” sqlMaxLimit=”100″ dataNode=”dn1″>
这里TESTDB 就是我们对外声称的我们有数据库的名称  必须和server.xml中的用户指定的数据库名称一致
添加一个dataNode=”dn1″ 是指定了我们这个库只在dn1上.没有进行分库
 
二, <dataNode name=”dn1″ dataHost=”localhost1″ database=”db1″ />
这里只需要改database的名字 db1 就是你真实数据库服务上的数据库名 .
根据你自己的数据库名进行修改.
 
三<dataHost name=”localhost1″ maxCon=”1000″ minCon=”10″ balance=”0″ writeType=”0″ dbType=”mysql” dbDriver=”native” switchType=”1″  slaveThreshold=”100″>
 
这里只需要配置三个地方    balance=”1″与writeType=”0″ ,switchType=”1”

  1. balance 属性负载均衡类型,目前的取值有 4 种:
    1. balance=”0″, 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。
    2. balance=”1″,全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1 ->S1 , M2->S2,并且 M1 与 M2 互为主备),正常情况下, M2,S1,S2 都参与 select 语句的负载均衡。
    3. balance=”2″,所有读操作都随机的在 writeHost、 readhost 上分发。
    4. balance=”3″, 所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有, 1.3 没有。
  2. writeType 属性
    负载均衡类型,目前的取值有 3 种:
    1. writeType=”0″, 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个
    writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .
    2. writeType=”1″,所有写操作都随机的发送到配置的 writeHost。
    3. writeType=”2″,没实现。
  3. switchType 属性
    – -1 表示不自动切换
    – 1 默认值,自动切换
    – 2 基于MySQL 主从同步的状态决定是否切换

四,<writeHost host=”hostM1″ url=”192.168.1.100:3306″ user=”root” password=”123456″>
<readHost host=”hostS1″ url=”192.168.1.101:3306″ user=”root” password=”123456″ />
</writeHost>
这里是配置的我们的两台读写服务器IP地址访问端口和 访问用户的用户名和密码
注意:这里配置的连接的两个库,一定要先在mycat的这台服务器上使用命令登陆这两个数据库保证没有问题后再配置.(经常发现群里有小伙伴配置的时候启动起来了出各种问题,结果是他配置的两个数据库根本就连不上!!!!!!!)
 
 
 

四、启动mycat

主要就是这两个配置文件,配置完成.们试试能否正常启动
[root@admin local]#cd /usr/local/mycat/bin
[root@admin local]#./mycat console
Running Mycat-server…
wrapper  | –> Wrapper Started as Console
wrapper  | Launching a JVM…
jvm 1    | Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=64M; support was remove
d in 8.0jvm 1    | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
jvm 1    |   Copyright 1999-2006 Tanuki Software, Inc.  All Rights Reserved.
jvm 1    |
jvm 1    | log4j 2015-10-24 12:07:08 [./conf/log4j.xml] load completed.
jvm 1    | MyCAT Server startup successfully. see logs in logs/mycat.log
 
如果你看到这一段说明你的服务已经启动起来了;
这里可以使用Navicat for MySQL,来尝试连接一下,能连接成功.如果没有连接成功过,有错误的话会在/logs/mycat.log中去查看
 

五、注意事项:

1,记得给你的防火墙开端口默认的mycat端口是8066,9066是管理端口
 
2,如果你在连接数据库的时候日志文件中一直报错错
错误:
Host is blocked because of many connection errors; unblock with ‘mysqladmin flush-hosts’
这个时候估计是你的数据库的账号和密码错误了.所以IP被锁
.首先需要去数据库执行flush hosts;命令清除 被锁死的IP
 
3,错误mycat.log中:  Unknown charsetIndex:224
说明是字符集问题引起的数据库不能连接成功
#vim index_to_charset.properties
编辑配置文件中  设置224的字符集
比如我的数据库中 224=utf8mb4
设置完成后再重启服务就可以了!
 
4,host文件未修改报错unknown error!!!!

STATUS | wrapper  | 2015/11/24 16:05:32 | Launching a JVM…
INFO   | jvm 5    | 2015/11/24 16:05:32 | Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=300M; support was removed in 8.0
ERROR  | wrapper  | 2015/11/24 16:05:37 | JVM exited while loading the application.
INFO   | jvm 5    | 2015/11/24 16:05:37 | Error: Exception thrown by the agent : java.net.MalformedURLException: Local host name unknown: java.net.UnknownHostException: DB-01: DB-01: unknown error
修改/etc/hosts就行,network不用动要解析hostM1 和hostS1 这两个到对应的ip!!!!!!!!!!!!!!!!!!!!!!

mycat三步曲之一(数据库主从配置)

mycat三步曲之一(数据库主从配置)

 
 
最近mycat非常的火热,单网上的资料非常的少.只有一本权威指南,不过指南比较多,不容快速入门,这里小整理了一些资料供大家入门使用!!
 
第一节  Mysql配置主从
1、编辑mysql的配置文件my.cnf
vi /etc/my.cnf
在[mysqld]下面增加
character_set_server = utf8
log-bin = mysql-bin
binlog-ignore-db = mysql
server-id = 1
在[client]下添加
default-character-set=utf8
 
2、重启mysql 加载新配置文件
[root@i ~]# /etc/init.d/mysqld restart
Stopping mysqld:                                           [  OK  ]
Starting mysqld:                                            [  OK  ]
 
3、查看mysql server级别的编码集
首先进入mysql使用命令 mysql -uroot –p
然后 执行命令查看:
mysql> show variables like ‘character%’;
+————————–+—————————-+
| Variable_name            | Value               |
+————————–+—————————-+
| character_set_client     | utf8                   |
| character_set_connection | utf8                    |
| character_set_database   | utf8                   |
| character_set_filesystem | binary                  |
| character_set_results    | utf8                    |
| character_set_server     | utf8                    |
| character_set_system     | utf8                   |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+————————–+—————————-+
8 rows in set (0.00 sec)
 
4,为从服务器建立一个slave用的帐号。
# mysql -u root -p
mysql> grant replication slave on  *.*  to  ‘repl’@’%’  identified  by  ‘123456’;
mysql> flush privileges;
mysql> quit
 
5,锁库,备份数据库并查看状态
加锁
mysql> flush tables with read lock;
 
备份数据库
#mysqldump   -uroot -p123456 ceshi > ceshi.sql
查看并记录主库状态,并记录标红的值
mysql> show master statusG;
*************************** 1. row ***************************
File: mysql-bin.000001
Position: 7260
Binlog_Do_DB: test
Binlog_Ignore_DB: mysql
1 row in set (0.00 sec)
ERROR:
No query specified
解锁
mysql> unlock tables
 
6、编辑从库mysql的配置文件my.cnf
vi /etc/my.cnf
在[mysqld]下面增加
character_set_server = utf8
log-bin = mysql-bin
binlog-ignore-db = mysql
server-id = 1
在[client]下添加
default-character-set=utf8
重启mysql从库
[root@i ~]# /etc/init.d/mysqld restart
Stopping mysqld:                                           [  OK  ]
Starting mysqld:                                            [  OK  ]
 
7、还原备份文件到从数据库
Mysql>mysql  -uroot -p123456  ceshi<ceshi.sql
8,准备同步,需用到上面的记录的值
Mysql>change master to master_host=’10.165.59.91′,master_user=’repl’,master_password=’123456′,master_log_file=’mysql-bin.000001′,master_log_pos=7260
开始同步
Mysql>start slave;
 
查看主从状态
mysql> show slave statusG;
*************************** 1. row ***************************
Slave_IO_State: Queueing master event to the relay log
Master_Host: 10.164.23.01
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 327530772
Relay_Log_File: iZ28md7xZ-relay-bin.37957620
Relay_Log_Pos: 253
Relay_Master_Log_File: mysql-bin.000007
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 327530772
Relay_Log_Space: 564
Until_Condition: None
Until_Log_File:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 310760
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
1 row in set (0.05 sec)
 
ERROR:
 
主要看这两项:
 
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
 
配置完成后注意给mycat的所在的IP授予root用户的访问权限.

centos7 通过yum 方式安装 redis

直接yum 安装的redis 不是最新版本

yum install redis

如果要安装最新的redis,需要安装Remi的软件源,官网地址:http://rpms.famillecollet.com/

yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

然后可以使用下面的命令安装最新版本的redis:

yum --enablerepo=remi install redis

安装完毕后,即可使用下面的命令启动redis服务

service redis start
或者
systemctl start redis

redis安装完毕后,我们来查看下redis安装时创建的相关文件,如下:

rpm -qa |grep redis

rpm -ql redis


查看redis版本:

redis-cli --version

 
设置为开机自动启动:

chkconfig redis on
或者
systemctl enable redis.service

Redis开启远程登录连接,redis默认只能localhost访问,所以需要开启远程登录。解决方法如下:
在redis的配置文件/etc/redis.conf
bind 127.0.0.1 改成了 bind 0.0.0.0
然后要配置防火墙 开放端口6379
连接redis

redis-cli


 更新:2018-01-22
在azure vm centos7.4 安装了最新的redis 4.0.6 bind 0.0.0.0 发现外网连接不上,发现azure vm 打开端口的地方已经变了,需要注意:要将源端口设置为 * ,目标端口为我们要打开的redis 端口,打开后可以使用telnet 命令测试一下:telnet 101.200.189.125 6379

 
另外: redis 3.2后新增protected-mode配置,默认是yes,即开启。解决方法分为两种:1、设置 protected-mode 为 no  2、配置bind或者设置密码
测试的时候我使用了配置bind 方式,没有加密码,正式生产环境可以使用加密码方式

linux 上安装jenkins

基本配置:

1、Linux安装配置jdk环境

1.1、上传到 Linux 服务器;例如:

上传至: cd /usr/local

1.2、解压:

rpm -ivh jdk-8u111-linux-x64.rpm

1.3、环境变量配置

cd /etc

在etc下,找到 profile文件,增加如下如下配置:

#set java environment

JAVA_HOME=/usr/java/jdk1.8.0_111

CLASSPATH=.:$JAVA_HOME/lib.tools.jar

PATH=$JAVA_HOME/bin:$PATH

export JAVA_HOME CLASSPATH PATH

1.4 、配置生效

source /etc/profile

2、Linux安装配置maven环境

2.1、上传maven到 /usr/local 下

2.2、解压:

tar -zxvf apache-maven-3.3.9-bin.tar.gz

2.3、配置环境变量

进入etc目录下找到profile文件,增加如下环境变量配置:

#set maven environment

MAVEN_HOME=/usr/local/apache-maven-3.3.9

export MAVEN_HOME

export PATH=${PATH}:${MAVEN_HOME}/bin

2.4 、配置生效

source /etc/profile

2.5、查看配置是否成功

mvn -v

2.6、如果抛出权限不够,例如

-bash: /usr/local/apache-maven-3.3.9/bin/mvn: Permission denied

2.7、给maven授权

chmod a+x /usr/local/apache-maven-3.3.9/bin/mvn

3、Linux安装tomcat

3.1、上传至 /usr/local 目录下

3.2、解压

tar -zxvf apache-tomcat-7.0.75.tar.gz

3.3、修改tomcat端口号

找到 tomcat–>config–>server.xml

打开server.xml后修改【8005、8080、8009】其中8080为tomcat的端口号

第22行:8005

第71行:8080

第93行:8009

3.4、增加tomcat用户【用于jenkins部署发布用】

找到tomcat–>config–>tomcat-users.xml

打开后在<tomcat-users></tomcat-users>之间增加如下用户信息:

<role rolename=”admin-gui”></role>

<role rolename=”admin-script”></role>

<role rolename=”manager-gui”></role>

<role rolename=”manager-script”></role>

<role rolename=”manager-jmx”></role>

<role rolename=”manager-status”></role>

<user username=”admin” password=”admin” roles=”manager-gui,manager-script,manager-jmx,manager-status,admin-script,admin-gui”/>

4、Linux配置并启动 jenkins

4.1、上传jenkins.war到tomcat–>webapps下

4.2、进入tomcat–>bin目录下,使用Linux命令启动tomcat

./startup.sh

4.3、根据tomcat所在服务器ip地址和tomcat路径来访问jenkins项目

例如:http://IP:8087/jenkins

4.4、首次进入jenkins如要输入密码,密码位置:/root/.jenkins/secrets/initialAdminPassword

4.5、进入选择插件安装界面,选择第一个(Install suggested plugins)

 

4.6、插件安装完成之后,需要创建第一个用户,建议统一使用test或者admin

 

4.7、创建用户之后,就可以使用jenkins了

 

4.8、点击start using jenkins 进入jenkins

 

4.9、配置jenkins需要的maven、jdk路径

    详情见截图:《1、全局环境配置.png》

 

4.10、配置安装插件

jenkins plugin

需要安装的插件:

发布插件 Deploy to container Plugin 必须

•Maven插件 Maven Integration plugin必须

•git插件 Git plugin 这个根据实际情况,我用的是svn

•svn插件 Subversion Plug-in 这个jenkins自带已经安装过了,推荐安装时有显示

非必须安装插件:

•发送邮件插件 Email Extension Plugin

5、项目配置:【详情见截图:2、jenkins项目配置.png】

   

5.1、配置svn项目地址和用户名密码

repossitory url为svn地址,下面有一个add按钮,填写svn用户名密码后保存

然后下拉选择,刚才配置的那个用户

5.2、配置清理并选择maven

root pom 中填写:pom.xml

goals and options中填写:clean install

5.3、配置maven清理

点击“add post-build step”选择“invoke top-level maven targets”

maven version选择maven(该maven是全局环境变量时配置的)

goals 中填写:clean package

5.4、配置部署容器

点击“增加构建后操作步骤”选择 “deploy war/ear to a container”

由于maven项目的war包是在target下,故下target/项目名.war

content path为访问路径

5.5、配置tomcat

点击“and container”添加容器,选择tomcat

由于我的是tomcat7故选择tomcat7

manager user name:填写配置tomcat-user对应的用户名

manager password:填写配置tomcat-user对应的密码

tomcat url :填写配置tomcat-user这个tomcat对应的服务器地址和该tomcat的端口号

例如:http://ip:tomcat端口号

centos6.8 yum安装mysql 5.6

一、检查系统是否安装其他版本的MYSQL数据
yum list installed | grep mysql
yum -y remove mysql-libs.x86_64
二、安装及配置
wget http://repo.mysql.com/mysql-community-release-el6-5.noarch.rpm
rpm -ivh mysql-community-release-el6-5.noarch.rpm
yum repolist all | grep mysql
1、安装MYSQL数据库
yum install mysql-community-server -y
2、设置为开机启动
chkconfig --list | grep mysqld
chkconfig mysqld on
3、设置密码
/usr/bin/mysqladmin -u root password '123456'
4、修改root密码
mysql -uroot -p123456
mysql> select Host,User,Password from user where User='root';
+-----------------------+------+-------------------------------------------+
| Host                  | User | Password                                  |
+-----------------------+------+-------------------------------------------+
| localhost             | root | *4A82FDF1D80BA7470BA2E17FEEFD5A53D5D3B762 |
| localhost.localdomain | root |                                           |
| 127.0.0.1             | root |                                           |
| ::1                   | root |                                           |
+-----------------------+------+-------------------------------------------+
4 rows in set (0.00 sec)
mysql> update user set Password = password('123456') where User='root';
Query OK, 4 rows affected (0.03 sec)
Rows matched: 4  Changed: 4  Warnings: 0
mysql> select Host,User,Password from user where User='root';
+-----------------------+------+-------------------------------------------+
| Host                  | User | Password                                  |
+-----------------------+------+-------------------------------------------+
| localhost             | root | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| localhost.localdomain | root | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| 127.0.0.1             | root | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| ::1                   | root | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----------------------+------+-------------------------------------------+
4 rows in set (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

总结一下上家公司的架构演变过程

前言

  虽然公司由于各种原因倒闭解散了,后来起死回生也没有在回去,回头再来看看这个系统是如何一步步演变和进化的。
  该系统具备的功能:
  • 用户模块:用户注册和管理
  • 学校模块:二手商品展示和管理,学校活动的发布和参与
  • 消息模块:学生之间的消息交流和学校的系统通知

 

阶段一、单机构建网站

  入公司的初期,我们只有一台服务器,在这台单机上跑了我们所有的程序和软件。此时我们使用一个容器tomcat,然后使用一些开源的框架如maven+spring+hibernate;最后再选择一个数据库管理系统来存储数据,那就是免费的mysql,然后通过JDBC进行数据库的连接和操作。
  把以上的所有软件都装载同一台机器上,应用跑起来了,也算是一个小系统了。,就是这么的简单粗暴,你没有猜错没有管理后台,要发发布一个活动需要手动去数据库插入数据!!!!!!多么痛的领悟!!
此时系统大致如下:
1

阶段二、应用服务器与数据库分离

  随着APP的上线开始推广,访问量逐步上升,服务器的负载越来越高,在服务器还没有超载的时候,我们就开始做准备,提升网站的负载能力。我们优化了一次代码,但是并没有什么卵用,服务器负载依旧居高不下,主要是数据库读写特别厉害强占了资源后一直使用资源得不到释放,导致tomcat响应也非常慢,APP请求经常超时,要么给服务器加配置,做数据库和服务的分离!!
      吐槽一下阿里云的增加服务器配置,加一倍的配置和新买一台没有太大差距,所以果断的新增加了一台服务器!不仅可以有效地提高系统的负载能力,而且性价比高,为以后进一步分离也做好了准备。此时我们把数据库,web服务器拆分开来,这样不仅提高了单台机器的负载能力,也提高了容灾能力。
应用服务器与数据库分开后的架构如下图所示:
2

阶段三、应用服务器集群

  随着访问量继续增加,单台应用服务器已经无法满足需求了。因为我们在升级过程中,需要停止tomcat来升级war包,人数众多的情况下这肯定是不允许的!以前晚上在使用低谷期,进行升级的方法不在适用了,因为我们发现在凌晨都会有人在使用APP,这使得我们必须改变策略.
       我们需要把应用服务器从一台变成了两台甚至多台,把用户的请求分散到不同的服务器中,从而提高负载能力并且保证服务的不间断运行。多台应用服务器之间没有直接的交互,他们都是依赖数据库各自对外提供服务。著名的做故障切换的软件有keepalived,keepalived是一个类似于layer3、4、7交换机制的软件,他不是某个具体软件故障切换的专属品,而是可以适用于各种软件的一款产品。keepalived配合上ipvsadm又可以做负载均衡,可谓是神器。
系统演变到这里,将会出现下面四个问题
  1. 用户的请求由谁来转发到到具体的应用服务器
  2. 有什么转发的算法
  3. 应用服务器如何返回用户的请求
  4. 用户如果每次访问到的服务器不一样,那么如何维护session的一致性

我们来看看解决问题的方案

  • 1、第一个问题即是负载均衡的问题,一般有5种解决方案:

1、http重定向。HTTP重定向就是应用层的请求转发。用户的请求其实已经到了HTTP重定向负载均衡服务器,服务器根据算法要求用户重定向,用户收到重定向请求后,再次请求真正的集群
优点:简单。   缺点:性能较差。
2、DNS域名解析负载均衡。DNS域名解析负载均衡就是在用户请求DNS服务器,获取域名对应的IP地址时,DNS服务器直接给出负载均衡后的服务器IP。
优点:交给DNS,不用我们去维护负载均衡服务器。
缺点:当一个应用服务器挂了,不能及时通知DNS,而且DNS负载均衡的控制权在域名服务商那里,网站无法做更多的改善和更强大的管理。
3、反向代理服务器。在用户的请求到达反向代理服务器时(已经到达网站机房),由反向代理服务器根据算法转发到具体的服务器。常用的apache,nginx都可以充当反向代理服务器。
优点:部署简单。
缺点:代理服务器可能成为性能的瓶颈,特别是一次上传大文件。
4、IP层负载均衡。在请求到达负载均衡器后,负载均衡器通过修改请求的目的IP地址,从而实现请求的转发,做到负载均衡。
优点:性能更好。
缺点:负载均衡器的宽带成为瓶颈。
5、数据链路层负载均衡。在请求到达负载均衡器后,负载均衡器通过修改请求的mac地址,从而做到负载均衡,与IP负载均衡不一样的是,当请求访问完服务器之后,直接返回客户。而无需再经过负载均衡器。
 

  • 2、第二个问题即是集群调度算法问题,常见的调度算法有10种。

1、rr 轮询调度算法。顾名思义,轮询分发请求。
优点:实现简单
缺点:不考虑每台服务器的处理能力
2、wrr 加权调度算法。我们给每个服务器设置权值weight,负载均衡调度器根据权值调度服务器,服务器被调用的次数跟权值成正比。
优点:考虑了服务器处理能力的不同
3、sh 原地址散列:提取用户IP,根据散列函数得出一个key,再根据静态映射表,查处对应的value,即目标服务器IP。过目标机器超负荷,则返回空。
4、dh 目标地址散列:同上,只是现在提取的是目标地址的IP来做哈希。
优点:以上两种算法的都能实现同一个用户访问同一个服务器。
5、lc 最少连接。优先把请求转发给连接数少的服务器。
优点:使得集群中各个服务器的负载更加均匀。
6、wlc 加权最少连接。在lc的基础上,为每台服务器加上权值。算法为:(活动连接数*256+非活动连接数)÷权重 ,计算出来的值小的服务器优先被选择。
优点:可以根据服务器的能力分配请求。
7、sed 最短期望延迟。其实sed跟wlc类似,区别是不考虑非活动连接数。算法为:(活动连接数+1)*256÷权重,同样计算出来的值小的服务器优先被选择。
8、nq 永不排队。改进的sed算法。我们想一下什么情况下才能“永不排队”,那就是服务器的连接数为0的时候,那么假如有服务器连接数为0,均衡器直接把请求转发给它,无需经过sed的计算。
9、LBLC 基于局部性的最少连接。均衡器根据请求的目的IP地址,找出该IP地址最近被使用的服务器,把请求转发之,若该服务器超载,最采用最少连接数算法。
10、LBLCR 带复制的基于局部性的最少连接。均衡器根据请求的目的IP地址,找出该IP地址最近使用的“服务器”,注意,并不是具体某个服务器,然后采用最少连接数从该组中挑出具体的某台服务器出来,把请求转发之。若该服务器超载,那么根据最少连接数算法,在集群的本服务器组的服务器中,找出一台服务器出来,加入本服务器组,然后把请求转发之。
 

  • 3、第三个问题是集群模式问题,一般3种解决方案:

1、NAT:负载均衡器接收用户的请求,转发给具体服务器,服务器处理完请求返回给均衡器,均衡器再重新返回给用户。
2、DR:负载均衡器接收用户的请求,转发给具体服务器,服务器出来玩请求后直接返回给用户。需要系统支持IP Tunneling协议,难以跨平台。
3、TUN:同上,但无需IP Tunneling协议,跨平台性好,大部分系统都可以支持。
4、第四个问题是session问题,一般有4种解决方案:

  • 4、Session Sticky。session sticky就是把同一个用户在某一个会话中的请求,都分配到固定的某一台服务器中,这样我们就不需要解决跨服务器的session问题了,常见的算法有ip_hash法,即上面提到的两种散列算法。

优点:实现简单。
缺点:应用服务器重启则session消失。
2、Session Replication。session replication就是在集群中复制session,使得每个服务器都保存有全部用户的session数据。
优点:减轻负载均衡服务器的压力,不需要要实现ip_hasp算法来转发请求。
缺点:复制时宽带开销大,访问量大的话session占用内存大且浪费。
3、Session数据集中存储:session数据集中存储就是利用数据库来存储session数据,实现了session和应用服务器的解耦。
优点:相比session replication的方案,集群间对于宽带和内存的压力减少了很多。
缺点:需要维护存储session的数据库。
4、Cookie Base:cookie base就是把session存在cookie中,有浏览器来告诉应用服务器我的session是什么,同样实现了session和应用服务器的解耦。
优点:实现简单,基本免维护。
缺点:cookie长度限制,安全性低,宽带消耗。
 
值得一提的是
nginx目前支持的负载均衡算法有wrr、sh(支持一致性哈希)、fair(本人觉得可以归结为lc)。但nginx作为均衡器的话,还可以一同作为静态资源服务器。
keepalived+ipvsadm比较强大,目前支持的算法有:rr、wrr、lc、wlc、lblc、sh、dh
keepalived支持集群模式有:NAT、DR、TUN
nginx本身并没有提供session同步的解决方案,而apache则提供了session共享的支持。

 
最后我们选了阿里云的负载均衡服务,他保证100%的稳定消除了入口单点的问题,并且提供了加权轮询和最小连接数,以及回话保持的功能,自动剔除有问题的服务器!
 
这让我想起一个段子:
三位女的都去一个公司应聘总裁助理的岗位,面试过程中一个表现平平,一个表现的非常好,一个表现的非常差!最后总裁选了胸最大的一个!这个故事告诉我们一定要模清楚顾客最后的需求,就好像我们选负载均衡做集群一样,我们需要一个非常稳定的转发服务器,并且不能有单点问题,能实现自动剔除有问题的服务器,以及回话保持!这完全符合了我们的所有需求,只是要花点银子!当然是选择在部署最快最高效的方式.用老板的话说就是在创业公司跑最快的最不容死啊(最后被无情打脸)

此时的系统的结构如下
3
 

阶段四、数据库读写分离化

  上面我们总是假设数据库负载正常,但随着访问量的的提高,数据库的负载也在慢慢增大。那么可能有人马上就想到跟应用服务器一样,把数据库一份为二再负载均衡即可。但对于数据库来说,并没有那么简单。假如我们简单的把数据库一分为二,然后对于数据库的请求,分别负载到A机器和B机器,那么显而易见会造成两台数据库数据不统一的问题。那么对于这种情况,我们可以先考虑使用读写分离的方式。
  读写分离后的数据库系统结构如下:
这个结构变化后也会带来两个问题
  1. 主从数据库之间数据同步问题
  2. 应用对于数据源的选择问题
  解决问题方案
  1. 我们可以使用MYSQL自带的master+slave的方式实现主从复制。
  2. 采用第三方数据库中间件,Amoeba。Amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy。它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上执行。基于此可以实现负载均衡、读写分离、高可用性等需求。与MySQL官方的MySQL Proxy相比,作者强调的是amoeba配置的方便(基于XML的配置文件,用SQLJEP语法书写规则,比基于lua脚本的MySQL Proxy简单)。

4

阶段五、用缓存技术缓解读库的压力

1、后台应用层和数据库层的缓存

  随着业务的变更以及用户访问量的增加,逐渐出现了许多用户访问同一部分内容的情况(校园圈),对于这些比较热门的内容,没必要每次都从数据库读取。我们可以使用缓存技术,例如可以使用google的开源缓存技术guava或者使用memcacahe作为应用层的缓存,也可以使用redis作为数据库层的缓存。
2、登陆认证信息token的缓存
  除了数据缓存,还有用户登陆的后认证的token信息。
  优点
  • 减轻数据库的压力
  • 大幅度提高访问速度
  缺点
  • 需要维护缓存服务器
  • 提高了编码的复杂性

值得一提的是
缓存集群的调度算法不同与上面提到的应用服务器和数据库。最好采用“一致性哈希算法”,这样才能提高命中率。这个就不展开讲了,有兴趣的可以查阅相关资料。
 

  加入缓存后的结构
5

 未完待续,后面继续补充

 

Python3+Selenium环境配置

一、Python安装
Window系统下,python的安装很简单。访问python.org/download,下载最新版本,安装过程与其他windows软件类似。记得下载后设置path环境变量,然后Windows命令行就可以调用了:

二、Selenium安装
Python3.x安装后就默认就会有pip(pip.exe默认在python的Scripts路径下),使用pip安装selenium:
pip install selenium

因我已安装selenium,不可重复安装。
可使用以下命令查看是否安装成功:
pip show selenium


三、Firefox安装
因安装最新Firefox与selenium兼容有问题,所以安装旧版firefox47,记得在firefox安装插件firebug和firepath。(此外,记得关闭firefox的自动安装)
Firefox旧版下载地址:http://ftp.mozilla.org/pub/firefox/releases/
 
四、安装driver
Selenium 3以前,使用firefox浏览器不需要额外的driver。但是Selenium 3.X 对firefox浏览器也需要安装相应的driver:
Firefox浏览器需安装geckdriver,下载地址:https://github.com/mozilla/geckodriver/releases;
相应的,Chrome浏览器需要安装chromedriver,IE浏览器要安装IEdriver。
driver的路径可以直接放在python路径下,我这里把driver放在了python的Scripts路径下,同时把script路径加入环境变量。
 
五、运行一个简单的例子
使用python自带的IDLE工具,输入以下脚本:
 

from selenium import webdriver # 导入webdriver包
 
import time
driver = webdriver.Firefox() # 初始化一个火狐浏览器实例:driver
 
driver.maximize_window() # 最大化浏览器 
time.sleep(5) # 暂停5秒钟
 
driver.get(“https://www.baidu.com”) # 通过get()方法,打开一个url站点

运行以上脚本,最终打开百度网址,证明运行成功。
PS,我的运行环境:
Firefox浏览器版本:Firefox 47.0
Python:python v3.5.2
Selenium:3.4.3
Geckdriver:v0.15.0