Gangmax Blog

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

今天我需要完成一个从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”子目录,运行:

1
java -jar selenium-server.jar

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

1
java -jar selenium-server.jar -port 14444

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

  1. 使用python运行你写好的脚本,比如:
1
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