使用python selenium进行自动化functional test

Why Automation Testing

如今彷佛你们都一致认同一个项目应该有足够多的测试来保证功能的正常运做,并且这些此处的‘测试’特指自动化测试;而且大多数人会认为若是还有哪一个项目依然采用人工测试来保证代码的正确性的话,那简直是太落后了,太难以想象了。css

可是在我如今的项目里,以前大部分的状况下咱们仍是在使用手动测试,项目依然在每周一次井井有理的上线着。固然有部分缘由是由于项目业务和技术上的特殊性,可是这开始让我思考:咱们究竟为何要进行自动化?什么状况下该进行自动化?自动化测试使用与全部的测试场景吗?html

我认为自动化测试对咱们的项目之因此重要,有几点缘由:java

Automated Software Testing Saves Timepython

咱们的项目如今以每周一次的频率上线,因为项目自己的特殊性,每次上线后就要进行一次大规模的手动测试来保证不会break任何已有功能。这样的测试每周一次的重复着,测试的内容也毫无变化,这消耗了团队成员大部分的时间和精力。因此引入自动化测试以后咱们就可以运行自动化测试来完成这些重复性的工做,节省了时间和没必要要的劳动。程序员

Team Morale Improvesweb

并非说若是没有测试咱们就对本身的代码没有了信心。可是不管多么厉害的程序员都没有办法保证本身的代码可以100%毫无差错的运行,尤为是当这些代码须要和一个已有的项目结合起来运做的时候。当咱们的代码和别的项目结合的时候,咱们有时会担忧咱们的代码可以单独的运做,可是却会在集成后破坏一些原有的功能。特别是在这种状况确实发生过以后,这样的担忧又会被进一步放大。自动化运行的测试可以在必定程度上保证咱们的代码是按照咱们的期待运做的,这就增强了开发人员对本身的代码的信心。而且这种信心不是出于程序员对本身的代码的欣赏,而是本身的代码可以真的经受检验后正常运做。同时,这样的信心也来自于自动化测试带来的第三个好处:编程

Increase Test Coverage浏览器

正是由于自动化测试能够覆盖到更多的人工测试须要花大量时间精力才能覆盖到的测试范围和深度,咱们才能知道咱们的代码在必定程度上已经可以经受住考验了,才能对本身的代码更有信心的继续后续的集成和开发。app

Selenium + Python

Selenium是一个自动化浏览器的工具,常被用来作web应用的自动化测试。它与其余的测试工具相比优点主要在于:maven

Selenium 测试直接在浏览器中运行,就像真实用户所作的同样。

Selenium webdriver能够运行在各类不一样的操做系统的众多浏览器平台上:

  • Google Chrome 12.0.712.0+
  • Internet Explorer 6, 7, 8, 9 - 32 and 64-bit where applicable
  • Firefox 3.0, 3.5, 3.6, 4.0, 5.0, 6, 7
  • Opera 11.5+
  • HtmlUnit 2.9
  • Android – 2.3+ for phones and tablets (devices & emulators)
  • iOS 3+ for phones (devices & emulators) and 3.2+ for tablets (devices & emulators)

另外,selenium提供多种编程语言支持:Java, Javascript, Ruby, PHP, Python, Perl , C#。

在这么多的语言支持中,为何咱们选择了python呢?

首先,python是一门很是容易入门的面向对象的脚本语言。我在开始写python+selenium以前彻底没有python的编程经验,可是因为它的语法至关简单,而且表意和英语十分接近,所以让人能在简单的学习以后就快速的上手。

另外,做为一门脚本语言,相较于java来讲就有了天生的优点:解释执行。这就意味着我写了几行代码,只须要一行命令就能够快速的运行起来看到结果,而不像Java那样须要漫长的编译打包等过程。完成一样的功能,python只须要一个py文件和一行命令,而java则须要整整一个project,而后编译打包发布等等。就算使用maven,也要进行不少相关的配置,过程至关麻烦。

在将python与selenium结合起来写functional test时,只须要在机器上配置好python的环境,下载selenium(easy_install selenium),编写测试代码,而后一句简单的命令:python xxx.py 就能够将测试代码运行起来。

How to Write Test Code

首先,咱们须要将selenium webdriver的依赖加入咱们的测试代码中:

from selenium import webdriver

webdriver组件包含了全部的WebDriver的实现,这样咱们就可使用selenium webdriver为咱们提供的浏览器交互等强大的功能了。

driver = web driver.Firefox()
driver.get("http://www.google.com")

建立一个Firefox WebDriver的实例,driver.get方法将打开方法参数中给出的URL所指向的网页。这行代码将会等到指向的目标页面彻底加载后才会把控制还给后续的代码。

获得了咱们想要打开的页面后,咱们就能够对网页进行一些基础的判断:

assert "Google" in driver.title

这个断言会判断网页的html <title>标签中是否包含“Google”这个字符串。这种断言很常见,能够用来判断打开的是不是咱们期待的页面。

以后,在目标页面上,咱们能够进一步的定位到每个页面元素,与这些元素进行交互来模仿用户操做,测试元素的行为是否和咱们预期的相符:

searchInput = driver.find_element_by_id("lst-ib")
searchInput.send_keys("selenium")
searchBtn = driver.find_element_by_name("btnK")
searchBtn.click()

WebDriver提供了多种的定位到元素的方法:

find_element_by_id  
find_element_by_name find_elements_by_name
find_element_by_class_name find_elements_by_class_name
find_element_by_tag_name find_elements_by_tag_name
find_element_by_xpath find_elements_by_xpath
find_element_by_link_text find_elements_by_link_text
find_element_by_partial_link_text find_elements_by_partial_link_text
find_element_by_css_selector find_elements_by_css_selector

 

click()与send_keys()都是selenium.webdriver.common.action_chains.ActionChains中提供的与元素交互的方法。click()模拟了对一个元素的点击,send_keys()模拟了向一个元素输入一些键盘输入。其余的交互方法能够查看API。

最后,在完成了页面操做以后咱们可使用driver.close()或是driver.quit()来退出。这二者的区别是:close只关闭一个tab,quit则是关闭整个浏览器。

A Simple Demo

上面的代码严格来讲并不像咱们经常写的测试代码,它只是打开了一个网页并作了一些简单的操做而已。咱们可使用python提供的标准unittest库来把它写得更符合咱们的测试代码的风格。使用unittest库后,咱们能在terminal中看到测试报告。

import unittest
from selenium import webdriver

class GooglePageTest(unittest.TestCase): def setUp(self): self.driver = webdriver.Firefox() def test_click_all_links_on_page(self): driver = self.driver driver.get("http://www.google.com") length = len(driver.find_elements_by_tag_name("a")) for i in range(0,length): links = driver.find_elements_by_tag_name("a") if links[i].is_displayed(): links[i].click() driver.back() self.assertIn("Google" or "YouTube",driver.title) def tearDown(self): self.driver.close() if __name__ == "__main__": unittest.main()

这段代码首先引入了unittest组件,而后使用咱们熟悉的test case的风格写了一个测试用例,测试了Google主页上面的全部<a>标签点击,对每一个打开的页面检查title中是否含有期待的关键字。测试结束后将自动关闭浏览器,而且在terminal中能够看到测试报告。

相关文章
相关标签/搜索