2011-08-29 90 views
1

我有两个运行多个Python测试脚本的问题,它们是由Selenium IDE Python Remote Control插件格式化程序导出的。试图运行Selenium IDE Python脚本作为测试套件

1)python脚本完成后,浏览器窗口自动关闭。我正在Firefox中运行测试,以我为例。

2)硒不能导出它的测试套件在python中。我如何在Python中复制测试套件功能?

为什么我要花时间在Python中运行测试脚本,是因为我们的测试用例解决方案(Testuff)软件允许API调用来更新已经通过Selenium测试用例自动化的相邻测试用例。

以下是API调用代码示例。

谢谢。

from selenium import selenium 
import unittest, time, re 

class python_script(unittest.TestCase): 
    def setUp(self): 
     self.verificationErrors = [] 
     self.selenium = selenium("localhost", 4444, "*chrome", "http://test website url/") 
     self.selenium.start() 

    def test_python_script(self): 
     sel = self.selenium 
from selenium import selenium 
import unittest, time, re, urllib 

class python_script(unittest.TestCase): 
    def setUp(self): 
     self.verificationErrors = [] 
     self.selenium = selenium("localhost", 4444, "*chrome", "http://test website url/") 
     self.selenium.start() 


    def test_python_script(self): 
     sel = self.selenium 
     sel.open("http://192.168.48.23/labmatrix") 
     for i in range(60): 
      try: 
       if sel.is_element_present("//*[@name='username']"): 
        break 
      except: pass 
      #time.sleep(1) 
     else: 
      fields = {"test_id" : "testuff test_id number","status" : "failed"} 
      result = urllib.urlopen("testuff api url", urllib.urlencode(fields)) 
      print result.read() 
      self.fail("time out") 
     sel.type("//*[@name='username']", "username") 
     for i in range(60): 
      try: 
       if sel.is_element_present("//*[@name='password']"): break 
      except: pass 
      #time.sleep(1) 
     else: 
      fields = {"test_id" : "testuff test_id number","status" : "failed"} 
      result = urllib.urlopen("testuff api url", urllib.urlencode(fields)) 
      print result.read() 
      #self.fail("time out") 
     sel.type("//*[@name='password']", "password") 
     for i in range(60): 
      try: 
       if sel.is_element_present("//*[@id='submitButton']"): break 
      except: pass 
      #time.sleep(1) 
     else: 
      fields = {"test_id" : "testuff test_id number","status" : "failed"} 
      result = urllib.urlopen("testuff api url", urllib.urlencode(fields)) 
      print result.read() 
      self.fail("time out") 
     sel.click("//*[@id='submitButton']") 
     #time.sleep(0.1) 
     for i in range(60): 
      try: 
       if sel.is_element_present("//*[@id='loadingDeck'][@selectedIndex='1']"): 
        fields = {"test_id" : "testuff test_id number","status" : "passed"} 
        result = urllib.urlopen("testuff api url", urllib.urlencode(fields)) 
        print result.read() 
        break 
      except: pass 
      #time.sleep(1) 
     else: 
      self.fail("time out") 

    def tearDown(self): 
     self.selenium.stop() 
     self.assertEqual([], self.verificationErrors) 

if __name__ == "__main__": 
    unittest.main() 

    def tearDown(self): 
     self.selenium.stop() 
     self.assertEqual([], self.verificationErrors) 

if __name__ == "__main__": 
    unittest.main() 

感谢您的快速反应。我试过jcfollower推荐这个代码:

from selenium import selenium 
import unittest, time, re 

class python_script(unittest.TestCase): 
    def setUp(self): 
     self.verificationErrors = [] 
     self.selenium = selenium("localhost", 4444, "*chrome", "Testing Website URL") 
     self.selenium.start() 

    def test_python_script_1(self): 
     sel = self.selenium 


    def test_python_script_2(self): 
     sel = self.selenium 
     sel.open("Testing website URL") 
     for i in range(60): 
      try: 
       if sel.is_element_present("//*[@name='username']"): 
        break 
      except: pass 
      #time.sleep(1) 
     else: 
      fields = {"test_id" : "Testuff API Test_id","status" : "failed"} 
      result = urllib.urlopen("API URL", urllib.urlencode(fields)) 
      print result.read() 
      self.fail("time out") 
     sel.type("//*[@name='username']", "username") 
     for i in range(60): 
      try: 
       if sel.is_element_present("//*[@name='password']"): break 
      except: pass 
      #time.sleep(1) 
     else: 
      fields = {"test_id" : "testuff API test_id","status" : "failed"} 
      result = urllib.urlopen("testuff API url", urllib.urlencode(fields)) 
      print result.read() 
      #self.fail("time out") 
     sel.type("//*[@name='password']", "password") 
     for i in range(60): 
      try: 
       if sel.is_element_present("//*[@id='submitButton']"): break 
      except: pass 
      #time.sleep(1) 
     else: 
      fields = {"test_id" : "testuff API test_id","status" : "failed"} 
      result = urllib.urlopen("API URL", urllib.urlencode(fields)) 
      print result.read() 
      self.fail("time out") 
     sel.click("//*[@id='submitButton']") 
     #time.sleep(0.1) 
     for i in range(60): 
      try: 
       if sel.is_element_present("//*[@id='loadingDeck'][@selectedIndex='1']"): 
        fields = {"test_id" : "testuff API test_id","status" : "passed"} 
        result = urllib.urlopen("API URL", urllib.urlencode(fields)) 
        print result.read() 
        break 
      except: pass 
      #time.sleep(1) 
     else: 
      self.fail("time out") 

    def tearDown(self): 
     self.selenium.stop() 
     self.assertEqual([], self.verificationErrors) 

if __name__ == "__main__": 
    unittest.main() 

    def tearDown(self): 
     self.selenium.stop() 
     self.assertEqual([], self.verificationErrors) 

if __name__ == "__main__": 
    unittest.main() 

...不幸的是,浏览器窗口仍然关闭。还有其他建议吗?

谢谢。


得到它的部分工作。

删除的一个:

if __name__ == "__main__": 
    unittest.main() 

    def tearDown(self): 
     self.selenium.stop() 
     self.assertEqual([], self.verificationErrors) 

...并删除了:

 self.selenium.stop() 

从剩下的 “if __name__” 语句和Python的日志加上浏览器窗口保持打开状态。这是朝正确方向迈出的一步,但脚本运行完毕后我需要关闭日志窗口。

我想下一步是创建另一个停止类,并在selenium.py文件中稍微玩一下,看看我是否可以删除关闭浏览器的命令。

如果有人有任何其他建议,将非常感激。

回答

0

如果删除第二组导入语句,第二个Class语句和第二个setUp函数,然后将test_python_script函数重命名为在其末尾有_1和_2,它会起作用吗?

0

firefox每次都重新启动的原因是因为在每个单元测试函数被调用之前setUp被调用(同样,tearDown,之后)。所以单元测试只是为每个测试创建一个新的selenium浏览器实例。虽然这不一定是坏事,但重新使用同一浏览器会话可能会更快。

为了克服这一点,你可以使用setUpClass/tearDownClass类的方法,而不是像这样:

class python_script(unittest.TestCase): 
    @classmethod 
    def setUpClass(cls) 
     cls.selenium = selenium("localhost", 4444, "*chrome", "http://test website url/") 
     cls.selenium.start() 

    def setUp(self): 
     self.verificationErrors = [] 

    def test_python_script_1(self): 
     ... 

    def test_python_script_2(self): 
     ... 

    def tearDown(self): 
     self.assertEqual([], self.verificationErrors) 

    @classmethod 
    def tearDownClass(cls): 
     cls.selenium.stop() 

请注意,setUpClass和tearDownClass是在Python 2.7只介绍!如果您使用的是较旧版本的python,您仍然可以使用它 - 但您必须安装名为unittest2的库。你安装它之后,你可以在脚本的顶部导入行简单地更改为类似

import unittest2 as unittest 
+0

约阿夫嗨,我想你的建议和Firefox窗口将不会打开出于某种原因。 –

+0

很难说清楚,但我猜你正在运行比2.7更早的python,或者没有安装unittest2 /未能正确导入它。确保setUpClass在加载时执行。例如在每个函数中添加一些打印语句并检查它们是否被执行。 – gingerlime

+0

你好Yoav,我使用python 2.7。谢谢。 –

相关问题