2010-04-11 13 views
5

Jak mogę przekonwertować przypadki testowe wykonane przez Selenium IDE do Pythona bez eksportowania każdego przypadku testowego ręcznie? Czy istnieje konwerter wiersza poleceń dla tego zadania?Jak programowo przekształcić Selenese (html) na Python?

Na koniec chcę użyć Selenium RC i Pythons zbudować w unittest, aby przetestować moje strony internetowe.

Wielkie dzięki.

Aktualizacja:

zacząłem pisać konwertera ale jego zbyt dużo pracy do wykonania wszystkich poleceń. Czy istnieje lepszy sposób?

 
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() 

Odpowiedz

0

No nie jest droga, ale teoretycznie nie powinno być zbyt trudne do zrobienia, jak wszystko, co musisz zrobić, to mieć coś, który używa python-rc.js przekonwertować plik.

+0

Tak, ale pytanie dotyczyło sposobu * innego niż * "eksportowanie każdego przypadku testowego ręcznie". –

+0

Zaktualizowałem moją odpowiedź – AutomatedTester

3

Zacząłem budować parser Selenese-to-Python, PySelenese, który napisałem na Githubie. Zachęcamy do rozwidlenia/sklonowania repozytorium i wypróbowania: http://github.com/jpstacey/PySelenese.

Powiązane problemy