5

How would I convert test cases made by Selenium IDE to Python without exporting every test case by hand? Is there any command line converter for that job?

In the end I want to use Selenium RC and Pythons build in unittest to test my websites.

Thanks a lot.

Update:

I started to write a converter but its too much work to implement all the commands. Is there any better way?

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

2 Answers 2

3

I've started building a Selenese-to-Python parser, PySelenese, which I've posted on Github. Feel free to fork/clone the repository and give it a try: http://github.com/jpstacey/PySelenese .

Sign up to request clarification or add additional context in comments.

Comments

0

No there isn't a way but in theory it shouldn't be too difficult to do as all you need to do is have something that uses the python-rc.js to convert the file.

1 Comment

Yes, but the question asked about a way other than "exporting every test case by hand".

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.