2010-04-11 8 views
5

Come convertire i casi di test realizzati da Selenium IDE in Python senza esportare manualmente ogni caso di test? C'è qualche convertitore da riga di comando per quel lavoro?Come convertire Selenese (html) in Python a livello di programmazione?

Alla fine voglio utilizzare Selenium RC e Python costruiti in unittest per testare i miei siti web.

Grazie mille.

Aggiornamento:

ho iniziato a scrivere un convertitore, ma la sua troppo lavoro per implementare tutti i comandi. C'è un modo migliore?

 
from xml.dom.minidom import parse 

class SeleneseParser: 
    def __init__(self,selFile): 
     self.dom = parse(selFile) 

    def getTestName(self): 
     return self.dom.getElementsByTagName('title')[0].firstChild.data 

    def getBaseUrl(self): 
     return self.dom.getElementsByTagName('link')[0].getAttribute('href') 

    def getNodes(self): 
     cmds = [] 
     nodes = self.dom.getElementsByTagName('tbody')[0].childNodes 

     for node in nodes: 
      if node.nodeType == node.TEXT_NODE and "\n" in node.data: 
       continue 
      if node.nodeType == node.COMMENT_NODE: 
       cmds.append(node.data) 
      if node.nodeType == node.ELEMENT_NODE: 
       cmd = [] 
       for c in node.childNodes: 
        if c.nodeType == node.ELEMENT_NODE: 
         if len(c.childNodes) == 1: 
          cmd.append(c.childNodes[0].data) 
         else: 
          cmd.append("") 
       cmds.append(cmd) 
     return cmds 

class PythonConverter: 
    def __init__(self,sourceFile): 
     self.parser = SeleneseParser(sourceFile)   
     self.dest = u'# -*- coding: utf-8 -*-\n\nfrom selenium import selenium\nimport unittest, time, re\n' 

    def getHeader(self): 
     self.dest += u'\nclass %s(unittest.TestCase):\n' % self.parser.getTestName() 
     self.dest += u'\tdef setUp(self):\n\t\tself.verificationErrors = []\n' 
     self.dest += u'\t\tself.selenium = selenium("localhost", 4444, "*chrome", "%s")\n' % self.parser.getBaseUrl() 
     self.dest += u'\t\tself.selenium.start()\n' 

    def getContent(self): 
     self.dest += u'\n\tdef test_%s(self):\n\t\tsel = self.selenium\n' % self.parser.getTestName() 

     nodes = self.parser.getNodes() 
     for node in nodes: 
      if type(node) is list: 
       cmd,target,value = node[0],node[1],node[2] 

       if cmd == 'store': 
        self.dest += u'\t\t%s = "%s"\n' % (value,target) 
       elif cmd == 'clickAndWait': 
        self.dest += u'\t\tsel.click(u"%s")\n\t\tsel.wait_for_page_to_load("30000")\n' % (target) 
       elif cmd == 'type': 
        self.dest += u'\t\tsel.%s(u"%s", u"%s")\n' % (cmd,target,value) 
       elif cmd == 'select': 
        self.dest += u'\t\tsel.select(u"%s", u"%s")\n' % (target,value) 
       elif cmd == 'verifyTextPresent': 
        self.dest += u'\t\ttry: self.failUnless(sel.is_text_present(u"%s"))\n\t\texcept AssertionError, e: self.verificationErrors.append(str(e))\n' % target 
       elif cmd == 'verifySelectedLabel': 
        self.dest += u'\t\ttry: self.assertEqual(u"%s", sel.get_selected_label(u"%s"))\n\t\texcept AssertionError, e: self.verificationErrors.append(str(e))\n' % (value,target) 
       elif cmd == 'verifyValue': 
        self.dest += u'\t\ttry: self.assertEqual(u"%s", sel.get_value(u"%s"))\n\t\texcept AssertionError, e: self.verificationErrors.append(str(e))\n' % (value,target) 
       elif cmd == 'verifyText': 
        self.dest += u'\t\ttry: self.assertEqual(u"%s", sel.get_text(u"%s"))\n\t\texcept AssertionError, e: self.verificationErrors.append(str(e))\n' % (value,target) 
       elif cmd == 'verifyElementPresent': 
        self.dest += u'\t\ttry: self.failUnless(sel.is_element_present(u"%s"))\n\t\texcept AssertionError, e: self.verificationErrors.append(str(e))\n' % (target) 
       else: 
        self.dest += u'\t\tsel.%s(u"%s")\n' % (cmd,target) 

       #print cmd,target,value 
      else: 
       self.dest += u'\t\t#%s\n' % node 

    def getFooter(self): 
     self.dest += u'\n\tdef tearDown(self):\n\t\tself.selenium.stop()\n\t\tself.assertEqual([], self.verificationErrors)\n' 
     self.dest += u'\nif __name__ == "__main__":\n\tunittest.main()' 

    def convert(self): 
     self.getHeader() 
     self.getContent() 
     self.getFooter() 
     return self.dest 

p = PythonConverter('test_case.html') 
print p.convert() 

risposta

0

No, non c'è un modo ma in teoria non dovrebbe essere troppo difficile da fare, come tutto quello che dovete fare è di avere qualcosa che utilizza il pitone-rc.js per convertire il file.

+0

Sì, ma la domanda è relativa a un modo * diverso da * "esportazione manuale di ogni caso di test". –

+0

Aggiornato la mia risposta – AutomatedTester

3

Ho iniziato a creare un parser Selenese-to-Python, PySelenese, che ho pubblicato su Github. Sentiti libero di sborsare/clonare il repository e fare un tentativo: http://github.com/jpstacey/PySelenese.