Selenium Web Driver自动化测试(java版)系列下半部分(3) - Chrome driver的操作

上回我们介绍了一些常见的网页元素,从这篇文章开始咱们就聊聊对于这些元素的操作。讲之前先把测试环境搭一下。上节课说过,selenium web driver其实就是个类库,它也是以jar包的形式存在,打开selenium官网,找到这两个小东西:

一个叫selenium standalone server,一个叫selenium client。前者是1.0时代selenium RC为了让程序和浏览器之间交互而使用的服务器,现在大多数人已经使用2.0了,所以这个可以不用下载,只需要下载selenium client里面的jar包就行了。

下载完我们新建一个叫SeleniumDriver的java项目 -> 添加com.test包 -> Test.java,带上main函数:

然后通过build path -> configure build path -> libraries -> Add External jars把下载的jar都加进去:

先说驱动,我们又叫driver。之所以先说driver,是因为它是整个selenium自动化的核心之一,创建driver也是写测试程序时最先要做的。上次咱们把浏览器比喻成selenium的车,而把driver比喻成selenium的司机,对于车来说,主流的浏览器有IE,chrome和firefox三个,那么对应我们也得有三种driver,就好比大部分人只能开小轿车,你不能让他开火车或是公交车,容易出车祸。司机一定要跟车对应,driver类型一定要跟浏览器对应。访问selenium官网,我们可以看到有一些类似“xxdriver”这种字样的东西,它们就是不同浏览器的driver,我们只需要下载给IE,chrome和firefox准备的就好:

你把driver拿来之后是要告诉你自己的电脑的,因为司机再牛也得有公司雇他才行呀,否则你开谁的车呀?你的操作系统就相当于是它的公司。在自动化的世界里驱动可以作为系统的一个属性存在,只要系统把它添加到属性之中,就相当于添加到公司里了,语法是

System是java里的一个类,setProperty是它的静态方法。先以chrome为例,对于我的电脑来说就是:

driver的位置因人而异,但只要是用chrome,那driver类型一定要写成webdriver.chrome.driver,也不难记。

司机加入公司之后就可以正式上岗了,我们先创建一个driver对象,就好比司机已经是待命状态:

司机已经准备好了,下面就该准备车了。再强调一遍,driver类型必须要跟浏览器一致,既然是Chrome的驱动,那就只能用Chrome浏览器。虽然谷歌在咱们国家被禁,但在国内下载Chrome的网站应该还是一大把,找个靠谱网站下载下来安装好。

车夫跟车都准备完了这才差不多了搭好了测试环境。折腾了这么久终于该开始正题了 --- driver的操作。driver有八种最常见的操作方式,也就是说创建出来的driver对象有八个最常见的方法。你在eclipse里查一下咱们刚创建的driver对象的方法,可以看到有很多:

第一个常见方法是get(String url),里面有一个代表网址的字符串参数,这句代码表示打开哪个网站进行测试。咱们用我给大家准备的[示例网页]((http://cslm-test.com/webapps/elements/webelements.html),这是我为了演示咱们这个教程里的事例专门给大家搭建的测试网站:

如果现在运行程序,那大家会看到这个网页打开了。我们通常就是用这个方法打开被测网站。

第二个常见方法是getTitle(),里面不加任何参数,返回的是当前被测网页的标题,也就是在顶端选项卡上写的字。我们也可以用System.out.println()在后台打印出来:

第三个方法是getCurrentUrl(),返回的是当前被测网站的网址:

第四个方法是getPageSource(),这个方法返回当前页面的源代码,也就是它的html,css或javascript之类的东西,我们有时候会在网页上鼠标右键 -> 查看网页源代码,效果是一样的:

上面四个方法一起执行,会一一对应打印出各种信息,没毛病。但我们发现网页并不是全屏的,看起来不爽。第五个方法就能解决这个问题:连续调用manage().window().maximize()可以使浏览器全屏:

再运行一遍,我们发现还是不爽。为什么?每次运行完浏览器都开着,运行两遍也就是开两个页面,你得自己手动给它关上。运行个十次八次的每次都自己关实在太麻烦了。所以第六个方法close()就是用来自动关闭浏览器的:

再运行一遍整个程序,我们发现只有最后一遍运行打开的页面被关闭了,其它用chrome打开的页面并没有被关闭。注意,close()方法只关闭在自动化运行时打开的并且正在控制的网页。这句话有点拗口,但理解起来不难。两个要求:首先,它只关闭在自动化运行时打开的网页,你自己双击电脑桌面上chrome浏览器图标然后手动敲入网址打开的不算数,得人家selenium打开的才行。这也没毛病,人家selenium公司的驱动老司机只能管到它自己打开的东西,管不到你打开的。第二,得是正在控制的网页,就一个。如果selenium在运行过程中打开了两个网页,那只会关一个。比如咱们在这段程序里再加一句代码用来在新窗口显示链接内容:

现在不理解这句话的朋友先别着急,后面说元素操作的时候都会详细讲,现在只要知道它是用来点击一个链接,并且链接内容在新窗口里出现就好。这里我让它打开新窗口并跳转到百度。后面Thread.sleep(5000)代表driver会停留5秒钟,介绍线程那篇我们也讨论过。Thread经常会用到,因为网页跳转需要时间,而且根据你家网速不同需要的时间也不同。但是,当你的网页跳转的时候程序并不知道,它还是会继续执行,不加停留时间的话会直接运行到driver.close(),这样很有可能driver和网页都关了可你新窗口的内容还没显示出来呢。这个例子比较简单,后边没操作了,关了就关了没关系。但如果后面还需要你在新窗口做些操作那就肯定fail了。这里有一个专门的概念叫“异步处理”,不同步的时候就得等等,咱们后面会大量使用,我也会详细讲。

我们发现运行完毕只有webelement.html网页关上了,百度的没关。因为虽然链接跳转,但driver当前控制的还是第一个网页。那要全关上呢?这就需要第七个方法:quit()。把close()改成quit()再执行,这下全关上了,不留痕迹:

做项目时具体问题具体分析,看是用close()还是quit()。有人说你不是说quit()会全关上么?那讲close()方法之前打开的那些网页呢?不也是自动化打开的么?咋还需要手动关呢?是这样,每一次程序执行完毕的时候,driver就算是完成了它的生命周期,或者叫做完成了它当前的会话(session),不管你写不写close()或是quit(),driver都会被强行干掉,老司机都得下班。再运行一遍程序时,new ChromeDriver()又会产生了一个新的driver对象,而新的对象无法关闭上一个生命周期遗留下来的浏览器。就好比昨天司机有个单子没接,今天还能再接相同的单子么?不能。同理,如果你用了close()或是quit(),后面再想用get(),getCurrentUrl(),getPageSource()都会报错,因为生命周期结束,司机下班了:

quit()之后你再想打开网页,对不起报错了,说你的会话已经失效了,你得重新再实例化一个driver对象。

driver的最后一个常用方法我们留到说网页元素操作的时候再介绍,此方法用来定位网页元素,非常重要。此外,需要注意的是,selenium是个开源的网站,但维护得还不错。但正是因为开源,里面常有浏览器和驱动兼容性问题的出现,也就是说司机跟车不兼容。经常上selenium官网的朋友会发现驱动会经常更新。如果你运行不成功,但排错又发现真没什么问题,那就要往兼容性上去想。有时候同一段代码,之前运行没问题,但过几个月发现不行了,中间什么都没改。仔细一查,发现电脑重启的时候浏览器升级了,跟原来的驱动不匹配了。你自己要是不知道兼容性这么一回事就慢慢调试吧,反正出不来。所以查询错误信息很重要。你可以把错误信息复制粘贴到百度上,很可能有人跟你一样遇到过这个问题。我推荐过一个叫stackoverflow的网站,就是专门是解决各种各样问题的一个论坛,虽然都是英文,但读起来应该不费劲,就当学英语了。

这篇只介绍了chrome driver的操作,下次说firefox和IE的。源代码是SeleniumDriverChrome项目。

本篇知识点及注意事项:
1. 自动化测试代码的执行需要驱动(driver)和浏览器共同配合完成。
2. driver的常用操作有打开浏览器、获取网页标题、源代码、定位元素等操作。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容