Chinaunix首页 | 论坛 | 博客
  • 博客访问: 19912219
  • 博文数量: 679
  • 博客积分: 10495
  • 博客等级: 上将
  • 技术积分: 9308
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-18 10:51
文章分类

全部博文(679)

文章存档

2012年(5)

2011年(38)

2010年(86)

2009年(145)

2008年(170)

2007年(165)

2006年(89)

分类: Python/Ruby

2011-04-21 17:36:14

Normal 0 false false false EN-US ZH-CN X-NONE /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Table Normal"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-qformat:yes; mso-style-parent:""; mso-padding-alt:0in 5.4pt 0in 5.4pt; mso-para-margin-top:0in; mso-para-margin-right:0in; mso-para-margin-bottom:10.0pt; mso-para-margin-left:0in; line-height:115%; mso-pagination:widow-orphan; font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin;}

使用pythonselenium配合处理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 idhtml结构,dojo会自动为每个所使用的控件创建一系列节点,并随机给每个控件一个"控件类别+顺序号"html id,这样就给书写selenium用例带来了麻烦.

       2. dojo框架提供的控件使用的事件机制无法用普通的Selenium Ide录制来完成,必须给以加工才可以使用,否则无法触发实际控件的动作。

       3. dojo作为一个ajax工具包,当然使用了ajax框架,所以web的行为具有异步特征,在进行事件的模拟(类似单击下拉框进行选择时)由于一般此种控件的数据源会在服务器处获得由此会产生一个ajax调用,在此时直接执行单击动作会无法找到相应节点(因为数据还木有返回,节点当然就无法生成),从而产生一个element not found的错误而导致测试出错.

                不过好在网元名称是唯一,为此,这里使用网元名称来识别各个元素。具体实施步骤如下,在selenium抓取网页源码,提取iddijit__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()

 

 

阅读(11624) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~