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' %开发者_JAVA技巧 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()
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 .
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.
加载中,请稍侯......
精彩评论