Как преобразовать Selenese (HTML) в Python программно?

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

В конце я хочу использовать Селен RC и сборка Python в unittest для тестирования моих веб-сайтов.

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

Обновление:

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

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()
5
задан dan 20 April 2010 в 15:31
поделиться

2 ответа

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

0
ответ дан 15 December 2019 в 06:21
поделиться

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

3
ответ дан 15 December 2019 в 06:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: