Gangmax Blog

自由之思想,独立之精神

使用python+Selenium进行web功能测试

| Comments

今天我需要完成一个从web界面创建大量数据的任务,我很自然的想到了使用Selenium,而我又不想使用Java调用Selenium,原因是使用Java需要编译的过程,比较麻烦。我看到Selenium IDE里面有python, groovy等语言的选项,可见Selenium是支持这些脚本语言的。因此我打算试试。

我花了不少时间google如何使用python或者groovy来调用Selenium,最终找到了完美的方法。具体如下:

1.首先从Selenium官方网站下载Selenium RC 1.0.3

2.解压缩该文件,进入“selenium-python-client-driver-1.0.1”子目录。该目录下的“selenium.py”是Selenium客户端的python实现。该目录下其他的几个“test_*.py”文件是几个脚本实例。比如“test_google.py”脚本就是控制Selenium打开浏览器进入google并search “hello world”,按照这些实例可以很容易的写出类似的python脚本。

  1. 创建测试脚本还有更简单的方法:就是使用Selenium IDE进行脚本的录制。这是一个firefox的插件,使用很简单,记得录制好脚本之后选择python语言,其它不再赘述。

  2. 当脚本写好之后,运行之前要做的事情是启动Selenium server。打开一个终端,进入步骤2解压缩之后的“selenium-server-1.0.3”子目录,运行:

    java -jar selenium-server.jar
  

如果要用指定端口替代默认端口4444,则:

    java -jar selenium-server.jar -port 14444
  

即可运行Selenium server,保持该终端处于运行状态。

  1. 使用python运行你写好的脚本,比如:
    python create_customer.py
  

如果一切正常,这时你应该看到Selenium会打开浏览器窗口,开始做你在脚本中指定的操作。

如果你想让脚本控制的操作与录制的操作有所不同,改动脚本也很方便:比如录制的脚本做的是创建一条数据,而我想创建多条,则在脚本中加上一个循环;如果想让脚本中插入的多条数据各不相同,则在脚本的循环中修改输入的内容使之有所区别。我喜欢的是,这样的修改保存之后即可运行,不需要编译的繁琐过程。这充分体现了脚本语言的优势,呵呵……

Enjoy!

以下是一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
from selenium import selenium
import unittest, time, re

class create_incident(unittest.TestCase):
    def setUp(self):
        self.verificationErrors = []
        self.selenium = selenium("localhost", 14444, "*firefox", "http://localhost:8080/")
        self.selenium.start()

    def test_create_incident(self):
        sel = self.selenium
        sel.delete_all_visible_cookies()
        sel.window_maximize()
        sel.open("/login.xhtml")
        sel.wait_for_page_to_load("30000")
        self.assertEqual("Oracle Mission Critical Support Platform", sel.get_title())
        sel.type("loginform:username", "user01.hmt@gmail.com")
        sel.type("loginform:password", "humito01")
        sel.click("loginform:button")
        sel.wait_for_page_to_load("30000")
        #self.assertEqual("Dashboard", sel.get_title())

        for i in range(31, 45):
            sel.open("/im/add_im_ticket.xhtml")
            sel.wait_for_page_to_load("30000")
            self.assertEqual("Create IM Ticket", sel.get_title())
            sel.select("create_ticket_form_id:orgSelector", "label=im_cust_11")
            sel.select("create_ticket_form_id:ownerSelector", "label=user06 hmt")
            sel.click("//option[@value='68']")
            sel.select("create_ticket_form_id:severitySelector", "label=3")
            sel.type("create_ticket_form_id:summary", "test_max_0429_%03d" % i)
            sel.type("create_ticket_form_id:description", "test")
            sel.click("create_ticket_form_id:submitButtonBottom")
            sel.wait_for_page_to_load("30000")
            self.assertEqual("View IM Ticket", sel.get_title())

    def tearDown(self):
        self.selenium.stop()
        self.assertEqual([], self.verificationErrors)

if __name__ == "__main__":
    unittest.main()

Comments