2010-04-11 2 views
5

Как преобразовать тестовые примеры, сделанные Selenium IDE в Python, без экспорта каждого тестового примера вручную? Есть ли какой-либо конвертер командной строки для этой работы?Как конвертировать Selenese (html) в Python программно?

В конце концов, я хочу использовать Selenium RC и Pythons в unittest для тестирования моих сайтов.

Большое спасибо.

Update:

Я начал писать конвертер, но его слишком много работы, чтобы выполнять все команды. Есть ли лучший способ? не

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

ответ

0

Нет там не путь, но в теории это не должно быть слишком трудно сделать, поскольку все, что вам нужно сделать, это есть то, что использует Питон-rc.js для преобразования файла.

+0

Да, но вопрос спрашивает о способе * кроме * «экспорта каждого тестового примера вручную». –

+0

Обновлен мой ответ – AutomatedTester

3

Я начал строить парсер Selenese-to-Python, PySelenese, который я разместил на Github. Не стесняйтесь fork/клонировать хранилище и дайте ему попробовать: http://github.com/jpstacey/PySelenese.

Смежные вопросы