书名:Selenium WebDriver自动化测试完全指南
ISBN:978-7-115-52685-4
本书由人民邮电出版社发行数字版。版权所有,侵权必究。
您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。
我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。
如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。
著 刘傲凡
责任编辑 傅道坤
人民邮电出版社出版发行 北京市丰台区成寿寺路11号
邮编 100164 电子邮件 315@ptpress.com.cn
网址 http://www.ptpress.com.cn
读者服务热线:(010)81055410
反盗版热线:(010)81055315
Selenium是ThoughtWorks公司开发的一款用于Web应用程序测试的工具,它凭借支持多种浏览器、支持各种语言、跨平台、开源等优点得到了广泛应用。
本书以Python 3.x为基础,借助多个案例项目介绍Selenium的用法,涵盖内容采集、数据处理、单元测试等内容。本书共分为17章,主要内容有安装Selenium、页面导航、元素定位、PhantomJS、数据编解码、单元测试、多线程、发送邮件、Selenium IDE、Python扩展、图形化测试等。本书每章都包含相应的实践内容,而且在适当的位置还包含综合性的实战环节,帮助读者检验前面所学内容并活学活用。
本书内容通俗易懂,案例丰富,实用性强,适合从事Python开发、大数据开发、爬虫开发、前端开发以及测试等工作的人员阅读。
刘傲凡,精通互联网技术和计算机爬虫技术,熟悉网页抓取原理及技术,并在HTML、JavaScript、正则表达式、Jsoup、jQuery等方面有深入研究,还对WebMagic框架、PhantomJS、Headless Chrome、Selenium WebDriver等前沿技术保持着极高的热情和浓厚的兴趣。
作者曾于《中山大学研究生学刊》发表论文“基于大数据的问答网站用户质量与数量的关系浅析—— 以知乎为例”。同时,作者深刻理解验证码识别、数据挖掘、数据存储等技术,曾协助多家企业搭建分布式爬虫架构。
Python这门编程语言有着成熟的理论体系,同时也是应用性极强的一门计算机技术。
尽管读者会从Python入门图书中学到Python的基本语法,却可能会不知道下一步该从哪里入手,或者说该学什么,而且会对当前所处的这种状态感到焦虑。这就是本书想要解决的问题。
在本书中,读者将会学到一些关于自动化爬虫、网页测试以及Python的进阶内容。这些内容会帮助读者构建自己的技术体系。无论读者后续朝哪个方向发展,都会不可避免地学习这些内容。如果有志于Web开发,那么这些知识是必不可少的;而测试运维、数据分析和人工智能等领域更需要用到这些知识。
不同于其他Python进阶图书,本书更注重内容拓展和迁移,将一些庞大的代码打散、拆分,转换成易于理解和掌握的内容。之所以采用这种零碎化的写作方式,是因为本书旨在为读者提供更为广泛的解决方案。读者不仅可以在本书中学到很多Python编程技能,而且可以在亟需解决的任务中快速应用这些技术。
本书内容深入浅出,图文并茂,将枯燥生硬的知识用一种浅显直白的方式娓娓道来。本书不囿于教条,更注重实战部分内容的展示。对于理论知识,除了必须要了解的内容,本书绝不贪多求全,而是将重点放在实际操作上,来帮助读者快速上手。
本书具有以下特点。
本书在内容上非常注重知识的实用性和可操作性,而且对于重点和难于理解的内容进行细致讲解,绝不吝惜笔墨。本书采取的由浅入深的讲解方式非常易于读者理解,符合初学者的认知规律。另外,本书采用理论与实践相结合的方式,凸显了实用性和实战性。
传统的图书过于注重理论知识的介绍,案例很少,读者在学完之后因缺乏案例辅导和实操环节而无法消化吸收图书知识,更不用提学以致用了。本书则不然,在讲解完每一个大的模块后,都会采用实际的案例对前面学习的内容进行综合运用,这样就避免了不同章节不同实例间的知识脱节,读者的知识理论体系也就更连贯统一。
本书的讲授方式绝不是死板教条式的,尽管作者是本书唯一的作者,但在本书中,作者会使用“我们”这样的词语。原因是我们是一起的,都在朝着拓展Python技能,提高技术水平的方向努力,从这一方面来说,作者和读者是学习的道路上互相“搀扶”的挚友,我走得慢了你催我一声,你陷入泥潭了我拉你一把。
本书包含17章,以及两个附录。
第1章,安装Selenium,从基础入手,帮助读者了解Selenium项目的框架和由来,以及如何选择自己的WebDriver,接着介绍了Selenium在Windows和Linux两种操作系统下的安装方式。
第2章,页面导航,对Selenium项目和浏览器交互的基本操作进行介绍。本章介绍如何通过Selenium项目实现启动浏览器、打开浏览器、切换浏览器窗口等一系列常用的浏览器操作的自动化,从而为后面的学习奠定基础。
第3章,元素定位,介绍Selenium的8种元素定位方式。在学完前3章内容后,读者可以编写初具雏形的自动化程序。
第4章,利器——PhantomJS,PhantomJS是一个独立的项目,可以实现绝大部分浏览器的功能。不同于其他的浏览器,PhantomJS只会在内存中运行,不会显示任何界面,因此十分适合进行数据采集。本章介绍PhantomJS和Selenium搭配使用的方法。
第5章,基于Python官网的实战,是对前面所学内容的一个综合运用。读者可通过实战巩固已经学习过的知识,并且在实际操作中锻炼编程能力与思维。
第6章,基于今日头条的实战,以今日头条为例子,讨论技术部分的实现以及解决问题的思路,旨在帮助读者形成一个目录式的系统印象。
第7章,数据的编解码和处理,介绍数据的编解码和处理。在互联网中,难免要面对错综复杂的各种数据类型,本章主要介绍以下内容:CSV、JSON、XML、BASE64、NLTK、散列、布隆过滤器以及关系型数据库和非关系型数据库。
第8章,基于猫眼电影的实战,以猫眼电影为例子,详细讲解从了解客户需求到网站分析、处理的全套流程,并在分析中逐步引入代码的说明与实现。
第9章,基于淘宝商品的实战,以淘宝商品为例子,阐述如何应对复杂网站的页面数据采集问题,展示新颖的实现方式。
第10章,单元测试,解决单元测试是什么、为什么要写单元测试、应该怎么写单元测试这3个难题,帮助读者评估自己在项目中是否要使用单元测试。
第11章,多线程,实现同步完成多项任务的功能,帮助读者提高程序的运行效率,节约时间,并讨论线程、进程、线程切换、锁以及GIL等概念。
第12章,发送邮件,讨论程序反馈最低廉且合理的处理方式,通过实现自动化发送邮件,实现服务器(程序)在无人值守情况下记录用户操作。
第13章,Selenium IDE,介绍两个简单且方便的录制自动化脚本的工具,为读者提供一条功能化的测试道路,从而快捷地生成自动化脚本。
第14章,Python扩展,讨论如何把Python 2代码转换为Python 3代码,以及测试类型、通配符、字符串方法、异常层次结构、类和推导式等。
第15章,GUI测试,讨论制作图形化界面的方法并且介绍经常使用的组件,帮助读者实现测试工具图形化的目标并了解底层实现的思路。
第16章,基于知乎的实战,着重讨论Selenium项目和传统爬虫的结合,实现一种全新的并且功能更加强大的数据采集爬虫。
第17章,基于新浪微博的实战,对全书内容进行融会贯通,帮助读者巩固已经学过的知识,建立全面的知识框架。
附录A,如何阅读源代码,根据作者多年的经历介绍有效、高效阅读源代码的方法和建议。
附录B,Git分布式计算,介绍Git的一些功能特性和基本用法。对于软件开发人员来说,熟悉并掌握Git的使用是他们应该具备的一项技能。
本书由异步社区出品,社区(https://www.epubit.com/)为您提供相关资源和后续服务。
作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。
当您发现错误时,请登录异步社区,按书名搜索,进入本书页面,单击“提交勘误”,输入勘误信息,单击“提交”按钮即可,如下图所示。本书的作者和编辑会对您提交的勘误进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。
我们的联系邮箱是contact@epubit.com.cn。
如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。
如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们;有意出版图书的作者也可以到异步社区在线提交投稿(直接访问www.epubit.com/selfpublish/submission即可)。
如果您所在的学校、培训机构或企业,想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。
如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接发邮件给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。
“异步社区”是人民邮电出版社旗下IT专业图书社区,致力于出版精品IT技术图书和相关学习产品,为作译者提供优质出版服务。异步社区创办于2015年8月,提供大量精品IT技术图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网https://www.epubit.com。
“异步图书”是由异步社区编辑团队策划出版的精品IT专业图书的品牌,依托于人民邮电出版社近30年的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的LOGO。异步图书的出版领域包括软件开发、大数据、AI、测试、前端、网络技术等。
异步社区
微信服务号
“工欲善其事,必先利其器”。只要用对了工具就能事半功倍,而Python正是当前最完美的编程工具之一。Python如此强大,并且在各方面都做得很好,以至于没人敢说“精通Python”。本书只讲其中关于数据挖掘的很小一部分内容,重点讲述Selenium 库的使用,以帮助读者在技术深造的过程中更上一层楼。
本书侧重讲解基于Selenium开源程序的网络爬虫方面的自动化技术。很多人听过Selenium这个名词,却没有真正去了解过它。经常有人问:“如何理解和看待Selenium项目?”对于该问题,Selenium官方有一个很经典的回答:“自动化操作的浏览器,就是这样……做你想要做的事情,一切取决于你。”
Selenium项目最早是为测试浏览器、网页而诞生的。在大数据时代,Selenium广泛应用于网络爬虫。需要注意的是,Selenium项目并不是单个特定的软件,而是由多个工具组成,每个工具具有特定的功能。
Selenium WebDriver是Selenium项目基于浏览器的一部分,也是我们主要使用的一部分。它的灵活性很强,几乎支持所有主流的浏览器(甚至包括一些很小众的浏览器),并且可以完美地在支持这些浏览器的操作系统上运行。换句话说,当使用Selenium的时候,你完全不必担心兼容性问题,可以放心地进行代码移植。
但不要轻易更换你的Selenium WebDriver调用的浏览器。Selenium WebDriver对浏览器的操作是通过浏览器原生的API来实现的。这样一来,虽然速度和稳定性大大提高,但也带来了一些副作用。因不同浏览器Web元素的实现和呈现方法不同,Selenium WebDriver也要针对不同的浏览器而提供不同的实现方法。
SeleniumWebDriver支持的浏览器主要包括:
SeleniumWebDriver支持的操作系统主要包括:
除了上面列出的浏览器和操作系统外,Selenium还支持多种编程语言(如Java、R、Python、PHP 、Ruby、Perl、Haskell、Objective-C、C#等)。在这个信息泛滥的互联网时代,如果要选择Web方面的自动化工具,我会将Selenium作为首选(作为一个支持多种浏览器、多种操作系统、多种编程语言的工具,恐怕没有什么比它更合适了)。
使用Selenium项目的自动化技术具有以下好处。
企业的日常工作常常包含一些完全必要的重复性工作,传统的企业大多采用人力来处理这些工作,这就容易导致一些严重的错误。比如,误删数据库、系统宕机等。无论在经济上还是在声誉上,这样的错误对于企业来说都是一种毁灭性的打击。当把人力排除时,就可以避免绝大多数人为错误导致的重大损失。
在日常工作中,技术人员经常需要提高工作效率,但以传统方式来提高工作效率是很难的。当应用了自动化技术之后,我们就可以通过更加高效地利用系统来更迅速地执行任务,加快工作流程,处理更加庞大的工作负载。
没有一家企业不想降低成本。从某个方面来讲,要提高利润,就需要招聘更多的员工,而招聘更多的员工就意味着更高的人力成本。人力成本高企的问题可以通过自动化技术解决。自动化的工作没有人力成本,这就意味着通过编写自动化代码,可以将工作人员从大部分烦琐的工作中解放出来。正如一句公认的论断所说——“为了创造物质财富而投入生产活动中的一切要素通称为资源,包括人力资源、物力资源、财力资源、信息资源、时间资源等,其中人力资源是一切资源中最宝贵的资源,是第一资源”。
作为一个跨语言的项目,很多编程语言都可以使用Selenium,如Java。本书采用Python来介绍Selenium的用法。为什么采用Python呢?Python以其快捷著称,比如,要解决数独问题,使用C语言需要写300~500行代码,使用Java需要写100~200行代码,而使用Python只需要不到100行代码。从长远的角度来说,作为目前蓬勃发展的一门计算机语言,Python具有美好的前景,它在科学与数字计算、网络编程和系统网络运维方面的应用非常广泛。Selenium自动化测试与这些方面具有密不可分的关系,因此基于Python来学习Selenium更加有利于读者未来的发展。
大名鼎鼎的Selenium在2004年由一个名为Jason Huggins的年轻人开发。当时,Jason Huggins在芝加哥的ThoughtWorks公司工作,他的主要职责是为内部的时间和费用(Time and Expense)系统开发一个基于Java脚本的运行测试系统(Java Script Test Runner)。作为一个推崇自动化的技术人员,他意识到与其手工测试每次改动,不如用一个程序来代替自己,以便有效利用自己的时间。
于是他开发了一个可以驱动页面进行交互的 JavaScript 库,用于让浏览器测试后自动返回测试结果。这个库最初只是一些能够与Web页面进行交互的JavaScript的函数库,但它为Selenium RC 和Selenium IDE的核心部分奠定了基础。随着库内函数的不断丰富,Selenium也就逐渐发展成了一个实现模拟人类操作浏览器行为的项目。
讲到这里,我们要再提起Selenium的名字。如果你翻查字典,就会惊讶地发现Selenium这个单词和自动化测试一点关系也没有,它是化学元素硒的英文名。硒对汞(英文名为Mercury,元素符号为Hg)有拮抗作用。这其中存在着一定的历史渊源:在早期,ThoughtWorks公司想过购买用于商业测试的 Mercury系列工具(QTP、LR和TD),但因这家起步不久的公司难以负担起这一系列商业测试工具的高昂费用而购买失败。ThoughtWorks在成功开发出自己的测试工具后就将其进行了开源,并且起名为Selenium,来表达自己的情绪。
在2006年,Google已是Selenium的重要用户,但是Google的测试工程师不得不绕过它的限制进行测试,因为浏览器对JavaScript资源产生的同源问题,以及浏览器在安全性方面的提高,导致Selenium有很大局限性。他们需要一款更先进的测试工具,用这个工具通过浏览器和操作系统的本地方法来直接和浏览器进行交互,以解决在长期以来使用Selenium时遇到的问题。于是Google的工程师Simon Stewart 开始对Selenium进行二次开发,这个项目被命名为 WebDriver(后来被称为Selenium WebDriver)。WebDriver 项目的目的就是解决使用Selenium时产生的问题。
Selenium的项目在历史上存在3个重大版本,分别是Selenium 1.0(见图1-1)、Selenium 2.0和Selenium 3.0。Selenium1.0版本的主要内容是Selenium RC(Remote Control),现在已经被官方正式弃用,不再推荐用户使用Selenium RC。
可以说Selenium 1.0和Selenium 2.0最大的区别就在于WebDriver。在Selenium官方网页上有这样一个等式:
Selenium 1.0 + WebDriver = Selenium 2.0
现在比较先进并被广泛使用的版本是Selenium 3.0。Selenium 3.0也包含了Selenium WebDriver,但与之前版本不同的是,它移除了对Selenium RC核心代码的支持。
Selenium Grid(见图1-2)和Selenium IDE(见图1-3)则一直独立在Selenium的主要项目之外,作为一个分支而存在。
图1-1 Selenium RC
图1-2 Selenium Grid
图1-3 Selenium IDE
细心的读者不难发现,三种图标的区别在于右上角的小标志。
Selenium Grid的主要目的在于允许用户在多台机器上进行并行测试。换句话说,Selenium Grid 支持分布测试,可以让用户的自动化测试在一个分布式环境中运行。
现行的Selnium主要分为两个部分—— Selenium WebDriver和Selenium IDE。前者主要用来创建基于浏览器的回归自动化套件和测试,后者主要用来创建快速的bug重现脚本,以帮助用户进行自动化辅助的探索性测试。具体的Selenium项目的工具分支如图1-4所示。
图1-4 Selenium项目的工具分支
Selenium项目在未来将更加标准化,即加大对W3C(万维网联盟)标准的践行,取消对部分不符合W3C标准的WebDriver内容的支持。
本书基于Python讲解Selenium。这里假定读者使用过Python,并了解Python的基本语法和配置方法。
要下载Python的Selenium库,可以在PyPI官方网站上搜索Selenium,在弹出的页面中单击相应的链接。当然,更好的方法是使用pip命令来下载。可以使用以下命令来安装Selenium。
#通过pip来安装
pip install selenium
如果你使用的是较为老旧的Python 2.x版本,那么可以手动安装Selenium或者使用easy_install工具来简化安装。使用easy_install工具安装Selenium的命令如下。
#使用easy_install工具安装
easy_install selenium
当安装完成后,可以通过以下命令检验安装是否成功。
C:\Users\xuyichenmo>python
Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:06:47) [MSC v.1914 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
没有消息就是好消息。如果输入import selenium而没有任何提示,那么就证明已经成功安装了Selenium。
接着,下载Selenium服务器(这一项是可选的,我们不一定非要安装Selenium服务器,它主要用于运行Selenium IDE录制的脚本)。
因为Selenium基于Java编写,所以还要安装Java Runtime Environment(JRE)1.6或者更高版本的JRE(下载地址参见Oracle官网)。
同样,我们可以在Selenium项目官方网站的一个子页面中下载Selenium Standalone Server。截至2018年4月,Selenium Standalone Server的最新版本为3.13.0(下载页面参见SeleniumHQ网站)。
安装完JRE后可以按Windows+R组合键打开“运行”窗口,然后在“打开”文本框中输入cmd,打开命令行窗口,接着输入以下命令来启动Selenium服务器。
java -jar F:\Python_ADDED\selenium-server-standalone-3.13.0.jar
这里,需要把-jar参数后面的selenium-server-standalone文件所在的目录替换成实际文件所在的目录。
在刚安装完JRE就直接运行这条命令时,可能会因为端口占用问题而启动失败。如果出现这种情况,可以通过以下命令来解决。
netstat -aon | findstr "[端口号]"
tasklist | findstr "[PID号]"
taskkill /pid [PID号] /
可以看到,在第一次使用调用服务器命令后,Java提示失败。Selenium默认调用4444端口,而这个端口已经被占用,在解除了对端口的占用后,才可以成功调用。
下面介绍命令中几个选项的含义。
通常Linux操作系统都自带Python。在使用Linux操作系统时,如果Linux操作系统安装的是2.x版本的Python,这里推荐大家再安装一个3.x版本的Python。
可以使用以下命令下载安装Python管理工具包。
sudo apt-get install python-pip
下面这条命令用于安装setuptools。
sudo apt-get install python-setuptools
下面这条命令用于安装Selenium。
sudo pip install selenium
在第1章讲到Selenium项目可以用来实现一些模拟人类操纵浏览器的行为。这些行为是用于实现更加复杂的动作的基础。本章会讨论如何实现这些行为。
在启动浏览器之前,需要下载一个WebDriver。那么什么是WebDriver呢?假设我们需要找个猎人陪我们一起上山打猎,目前我们已经找到了需要的猎人,但是还缺一把猎枪,WebDriver就是这把猎枪,它就是驱动浏览器运行的一个工具。
读者可以在SeleniumHQ网站的下载页面中查看Selenium官方承认(但并不都是由Selenium官方开发)的所有第三方驱动。
Chrome浏览器的WebDriver的官方下载地址请参见谷歌网站。
如果无法访问谷歌网站,大家可以选用国内淘宝网站的镜像或者 GitHub 网站下载WebDriver。
本书中主要用Chrome浏览器做示范。当然,代码都是相通的,只要掌握了技巧,可以轻松写出其他浏览器所对应的代码。如果浏览器之间的WebDriver有区别,作者就会详细指出。
下载WebDriver并解压之后,可以发现里面仅为一个chromedriver.exe文件。为了方便使用,我们需要将其解压在Chrome的安装目录下,如下。
C:\Program Files (x86)\Google\Chrome\Application\
然后,配置环境变量。右击“我的电脑”,在弹出的菜单选中“属性”,打开“属性”窗口。在“属性”窗口中,单击“高级系统设置”,在打开的“系统属性”对话框(见图2-1)中,单击“高级”标签,选中“环境变量”按钮。在打开的“环境变量”对话框(见图2-2)中,修改“系统变量”下面的Path的值如下。
C:\Program Files (x86)\Google\Chrome\Application;
请注意,上一行内容的前后各有一个分号。
图2-1 “系统属性”对话框
图2-2 “环境变量”对话框
这里提供了一种更为简单的方法,即将chromedriver.exe文件直接放到Python的安装目录下。由于在安装Python的时候已经配置过环境变量了,因此这样可以省去很多麻烦。
在Linux操作系统下,只需要把下载好的chromedirver.exe文件放在/usr/bin目录下就可以了。
需要注意的是,读者必须将浏览器版本和WebDriver版本对应,否则打开Chrome浏览器时地址栏中会显示“data:,”,如图2-3所示。
图2-3 Chrome浏览器地址栏中显示“data:,”
安装与配置过程到此结束。
接下来,使用Python编写代码。下面给出一个示例。
#导入Selenium库
from selenium import webdriver
#下面一行代码用于启动Chrome浏览器
driver = webdriver.Chrome()
在导入Selenium库后,仅用一行代码便可以打开Chrome浏览器,如下。
driver = webdriver.Chrome()
类似地,通过下面这条命令可以打开Firefox浏览器。
driver = webdriver.Firefox()
仅打开浏览器肯定不能满足我们的需求,我们还需要更进一步的操作。接下来,我们尝试打开一个页面,如下。
#导入Selenium库和键盘操作
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
#打开Chrome浏览器
driver = webdriver.Chrome()
#打开百度页面
driver.get("https://baidu.com")
当运行上述代码后,我们会发现Chrome浏览器和以前有些不一样——在浏览器地址栏的下方,可以看到提示信息“Chrome正受到自动测试软件的控制”,如图2-4所示。
图2-4 使用Chrome浏览器打开百度页面时显示的提示信息
运行结束后,我们成功地打开了百度页面。类似地,只要将driver.get("[url]")中的URL地址修改为想要打开的页面的地址,就可以轻松地打开任意网站的地址(请不要遗漏双引号)。
运行代码后打开的浏览器窗口默认不是最大化的。有时候我们并不想要这样大小的窗口,因此可以尝试改变这一默认值。在下述代码中,第一个参数值设置的是浏览器窗口的长,第二个参数值设置的是浏览器窗口的宽。
#设置打开浏览器窗口的长和宽
driver.set_window_size(800, 480)
通过下面这行代码可以使浏览器窗口最大化。
#最大化
driver.maximize_window()
在了解完如何打开网页后,下面来看一下在使用浏览器时经常会使用到的几个基本操作—— 前进、后退、刷新和退出,如下。
#导入Selenium库和time库
from selenium import webdriver
import time
#打开浏览器和百度页面
driver = webdriver.Chrome()
driver.get("https://baidu.com")
#在停留2s后打开百度新闻
time.sleep(2)
driver.get("http://news.baidu.com")
#在停留2s后后退
time.sleep(2)
driver.back()
#在停留2s后前进
time.sleep(2)
driver.forward()
#在停留2s后刷新
time.sleep(2)
driver.refresh()
#在停留2s后关闭浏览器
time.sleep(2)
driver.quit()
细心的读者可能会注意到,这里还导入了一个time库。同时,在每个操作前都有一个time.sleep(),这条命令可以使程序在一定时间后执行。这样,不仅能让读者看清楚我们的操作,还能给浏览器指定操作网页的时间。
我们再来看一看在这里使用的函数,如下。
#前进
driver.back()
#后退
driver.forward()
#刷新
driver.refresh()
#退出
driver.quit()
这些都是比较常规的操作,读者可以尝试自己写一个小程序,多调用几次这些函数,以熟悉它们。
在实际工作中可能会碰到这种情况,即我们打开了一个页面,但是这个页面比较长,我们需要拖动浏览器的滚动条到底部,然后才能跳转到下一步页面。由于Selenium库中没有与调用滚动条相关的命令,因此这里使用JavaScript来模拟操作。为了使用JavaScript,Selenium为我们提供了下面这条代码。
driver.execute_script([JavaScript_name])
我们再来整理一下解决问题的思路。如下是两行JavaScript代码,用于向下滑动到页面底部(如果大家看不懂也没关系,毕竟我们主要使用的不是JavaScript)。
js="var q=document.documentElement.scrollTop=10000"
driver.execute_script(js)
接下来,演示一下它的具体的使用方法,如下。
#导入Selenium库和time库
from selenium import webdriver
import time
#打开浏览器和Python官方网站
driver = webdriver.Chrome()
driver.get("https://python.org")
#停留2s
time.sleep(2)
#执行JavaScript代码
JS="window.scrollTo(10000,document.body.scrollHeight)"
driver.execute_script(JS)
#停留2s后退出
time.sleep(2)
driver.quit()
执行结果如图2-5所示。
图2-5 执行结果
可以发现已经成功跳转到页面的底部,这时就可以放心地进行下一步的功能测试操作了。
对于某些版本的Chrome浏览器来说,这种方法并不能用,所以我们不得不采用寻找元素的方式来使页面下滑,如下。
#导入Selenium和time库
#ActionChains是一个用来模拟鼠标操作的库
from selenium import webdriver
import time
from selenium.webdriver import ActionChains
#以今日头条的首页为例
#模拟将鼠标指针移动到最后一个元素的位置并模拟下拉
driver=webdriver.Chrome()
driver.get("https://www.toutiao.com/")
#保存现在的页面
driver.save_screenshot("save_1.png")
#模拟鼠标操作来实现下拉
ac=driver.find_element_by_xpath("//ul[@infinite-scroll-disabled]/li[last()]")
#定位到指定元素
ActionChains(driver).move_to_element(ac).perform()
#停留2s,也就是给加载内容预留2s,然后第二次保存现在的页面
time.sleep(2)#
driver.save_screenshot("save_2.png")
运行上述代码并对比两次获取的截图后,大家会发现窗口位置确实发生变化了。另外需要说明的是,第2种方法对于各种浏览器都是有效的。
对于cookie的调用方式,Selenium项目提供了成熟的解决方案。下面是一些常用的cookie调用函数。
下面来看几个例子。
#导入Selenium、time和ActionChains库
from selenium import webdriver
import time
from selenium.webdriver import ActionChains
#打开浏览器并跳转到百度页面
driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
#这里通过查找元素实现搜索
driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()
#获取所有cookie
cookies=driver.get_cookies()
#返回字典的key为的BAIDUID的cookie
cookie=driver.get_cookie("BAIDUID")
print(cookies)
print(cookie)
#删除所有cookie信息。
driver.delete_all_cookies()
#退出
driver.quit()
请读者注意下面这段代码。
driver.get ("http://www.youdao.com")
# 向cookie的name和value中添加会话信息
driver.add_cookie({"name":"testname_1234567890"},{"value":"testvalue_1234567890"})
看一下输出结果。
[{'domain': '.baidu.com',
'httpOnly': False,
'name': 'H_PS_PSSID',
'path': '/',
'secure': False,
'value': '1451_21078_18560_26350_20930'},
{'domain': '.baidu.com',
'httpOnly': False,
'name': 'delPer',
'path': '/',
'secure': False, 'value': '0'},
{'domain': '.baidu.com',
'expiry': 3685852075.738426,
'httpOnly': False,
'name': 'BAIDUID',
'path': '/',
'secure': False,
'value': '4D078E74C7513305D07351785B50212A:FG=1'},
……
{'domain': '.baidu.com', 'expiry': xxxx, 'httpOnly': False, 'name': 'BAIDUID', 'path': '/', 'secure': False, 'value': 'xxxxx'}
我们可以发现,返回的cookie是字典形式的。
下面看一看add_cookie的用法。add_cookie必须有name和value的值,它们需要直接传递参数吗?作者通过实验验证发现,并不是这样的。
请注意,name和value虽然是两个值,但需要放在一个字典中,不能分开写,否则会报错。报错提示我们需要两个参数,但却传了三个参数。
回想一下,我们在使用Python编写类的时候,默认是加一个Self参数的。很明显,问题出在这里,这个多出来的参数就是Self,因此才会提示我们给出的参数过多。
而如果我们像下面这样使用代码,就可以正常运行了。
driver.add_cookie({"name":"testname_1234567890","value":"testvalue_1234567890"})
在使用自动化测试工具的过程中,我们不得不面对需要打开一个新的窗口但当前的窗口暂时还不能关闭的情况。就像我们浏览网页的时候,总是希望多打开页面,到最后,地址栏下方可能会有十几个标签。
作为一个功能齐全的自动化测试工具,Selenium虽然自身并不提供使用多个窗口这一功能,但是我们可以换一种思路来解决这个问题—— 使用JavaScript代码。
下面是作者提出的一种解决方法,供读者参考。
JS='window.open("https://www.sogou.com");
driver.execute_script(JS)
下面给出一个示例。
#采用UTF-8编码
from selenium import webdriver
import time
#打开浏览器,最大化窗口
driver=webdriver.Chrome()
driver.maximize_window()
#打开百度页面
driver.get("http://baidu.com")
#停留2s后打开搜狗搜索页面
time.sleep(2)
JS1='window.open("https://www.sogou.com");'
driver.execute_script(JS1)
#停留2s后打开有道翻译页面
time.sleep(2)
JS2='window.open("https://fanyi.youdao.com/");'
driver.execute_script(JS2)
#退出
#driver.quit()
在这个示例中,我们首先打开并且最大化窗口,在停留一段时间后,分别打开搜狗搜索页面和有道翻译页面,然后退出浏览器。
Chromedriver和支持的Chrome版本对照表如表2-1所示。
表2-1 版本对照关系
Chromedriver版本 |
支持的Chrome版本 |
---|---|
v2.40 |
v66-68 |
v2.39 |
v66-68 |
v2.38 |
v65-67 |
v2.37 |
v64-66 |
v2.36 |
v66-65 |
v2.35 |
v62-64 |
v2.34 |
v61-63 |
v2.33 |
v60-62 |
v2.32 |
v59-61 |
v2.31 |
v58-60 |
v2.30 |
v58-60 |
v2.29 |
v56-58 |
v2.28 |
v55-57 |
v2.27 |
v54-56 |
v2.26 |
v53-55 |
v2.25 |
v53-55 |
v2.24 |
v52-54 |
v2.23 |
v51-53 |
v2.22 |
v49-52 |
v2.21 |
v46-50 |
v2.20 |
v43-48 |
v2.19 |
v43-47 |
v2.18 |
v43-46 |
v2.17 |
v42-43 |
v2.16 |
v42-45 |
v2.15 |
v40-43 |
v2.14 |
v39-42 |
v2.13 |
v38-41 |
v2.12 |
v36-40 |
v2.11 |
v36-40 |
v2.10 |
v33-36 |
v2.09 |
v31-34 |
v2.08 |
v30-33 |
v2.07 |
v30-33 |
v2.06 |
v29-32 |
v2.05 |
v29-32 |
v2.04 |
v29-32 |