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()
asked Apr 11, 2010 at 16:16

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 .

answered Apr 27, 2010 at 18:37
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.

Bryan Oakley
389k53 gold badges582 silver badges739 bronze badges
answered Apr 12, 2010 at 9:22

1 Comment

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

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

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.