分类: Python/Ruby
2011-04-21 17:36:14
使用python和selenium配合处理dojo
2011-4-21 磁针石
#承接软件自动化实施与培训等gtalk: ouyangchongwu#gmail.com qq
37391319 博客:oychw.cublog.cn
#版权所有,转载刊登请来函联系
#自动化测试和python群组:
#python qq group: 深圳自动化测试python群:113938272
#武冈深圳qq群:66250781
公司的网页控制平台使用dojo,存在的问题如下,可以参见:http://hi.baidu.com/onlysis/blog/item/110814ecf0a19e3363d09ffb.html
1. dojo框架所给出的各个控件并不会像传统的html标签一样,一旦代码书写完成就有固定的html id和html结构,dojo会自动为每个所使用的控件创建一系列节点,并随机给每个控件一个"控件类别+顺序号"的html id,这样就给书写selenium用例带来了麻烦.
2. dojo框架提供的控件使用的事件机制无法用普通的Selenium Ide录制来完成,必须给以加工才可以使用,否则无法触发实际控件的动作。
3. dojo作为一个ajax工具包,当然使用了ajax框架,所以web的行为具有异步特征,在进行事件的模拟(类似单击下拉框进行选择时)由于一般此种控件的数据源会在服务器处获得由此会产生一个ajax调用,在此时直接执行单击动作会无法找到相应节点(因为数据还木有返回,节点当然就无法生成),从而产生一个element not found的错误而导致测试出错.
不过好在网元名称是唯一,为此,这里使用网元名称来识别各个元素。具体实施步骤如下,在selenium抓取网页源码,提取id:dijit__TreeNode_*,通过get_text()方法找到对应的标签。然后在字典中建立标签和id的映射。
每次web更新,需要重新执行上述步骤,分析过程有点慢。Python的效率要比selenium高,今后考虑用python来实现get_text()方法,直接从html源文件中提取。
附源码:
################################################################
from selenium import selenium
import unittest, time, re
class Untitled(unittest.TestCase):
def setUp(self):
#初始化字典、selenium等
self.verificationErrors = []
self.selenium = selenium("localhost", 4444, "*firefox", "")
self.id_dict = dict()
self.selenium.start()
def wait_for_element(self,element):
"""
等待元素的出现
输入:元素id
输出:找到元素返回真,否则返回假
"""
#查找元素的次数
for i in range(90):
try:
if self.selenium.is_element_present(element):
time.sleep(2)
print "find: " + element
return True
time.sleep(0.5)
except:
time.sleep(0.5)
print "Can not find : " + element
return False
def text_xpath(self,id):
"""
通过id,构造出对应的文本的XPATH
输入:元素id
输出:id应的文本的XPATH
"""
return "//div[@id='" + id + "']/div[1]/span[2]/span"
def imag_xpath(self,id):
"""
通过id,构造出对应的图片的XPATH
输入:元素id
输出:id应的图片的XPATH
"""
return "//div[@id='" + id + "']/div[1]/img"
def get_id_and_name(self,source):
"""
通过id,构造出对应的图片的XPATH
输入:网页源文件
输出:网元和DOJO ID 对应表
"""
id_list = re.findall('dijit__TreeNode_\d+',source,re.MULTILINE)
id_set = set(id_list)
self.id_dict = dict()
for id in id_set:
ne_name = self.selenium.get_text(self.text_xpath(id))
self.id_dict[ne_name.encode('utf-8')] = id
print self.id_dict.items()
def test_untitled(self):
sel = self.selenium
sel.open("/")
self.wait_for_element("c1")
#输入用户名和密码登陆
sel.type("c1", "root")
sel.type("s1", "ChgMeNOW")
sel.click("blogin")
self.wait_for_element("bcont")
#点击”继续“
sel.click("bcont")
time.sleep(2)
#重新刷新主页,设置超时时间
sel.open("/")
sel.set_timeout(60000);
#等待主页面加载完毕后,
self.wait_for_element("advaNav")
time.sleep(10);
source = sel.get_html_source().encode('utf-8')
self.get_id_and_name(source)
#右键点击”System",选择“NTP"
time.sleep(5)
sel.context_menu(self.text_xpath(self.id_dict["System"]))
time.sleep(5)
self.wait_for_element("dijit_MenuItem_7_text")
sel.click("dijit_MenuItem_7_text")
self.wait_for_element("state")
#填写主备IP地址
sel.type("prim0","172")
sel.type("prim1","19")
sel.type("prim2","20")
sel.type("prim3","11")
sel.type("secd0","172")
sel.type("secd1","19")
sel.type("secd2","20")
sel.type("secd3","12")
sel.click("OkButton")
def tearDown(self):
self.selenium.stop()
self.assertEqual([], self.verificationErrors)
if __name__ == "__main__":
unittest.main()