【问题标题】:Attempting to run Selenium IDE Python scripts as test suite尝试将 Selenium IDE Python 脚本作为测试套件运行
【发布时间】:2011-11-06 04:23:32
【问题描述】:

我在运行多个由 Selenium IDE Python 远程控制插件格式化程序导出的 Python 测试脚本时遇到了一些问题。

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

2) Selenium 无法在 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 文件中使用它,看看我是否可以删除关闭浏览器的命令。

如果有人有任何其他建议,将不胜感激。

【问题讨论】:

    标签: python api selenium testcase test-suite


    【解决方案1】:

    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
    

    【讨论】:

    • 嗨 Yoav,我尝试了你的建议,但由于某种原因,firefox 窗口无法打开。
    • 很难准确地说,但我猜你运行的 python 早于 2.7 或者没有安装 unittest2 / 未能正确导入它。确保 setUpClass 在加载时被执行。例如在每个函数中添加一些打印语句并检查它们是否被执行。
    • 你好 Yoav,我使用的是 python 2.7。谢谢。
    • 如果您使用的是python 2.7,那么您不需要安装unittest2...我不确定它为什么没有启动,但是如果您想再次粘贴代码,也许有什么不见了……
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2017-04-05
      • 2019-08-22
      • 2011-10-15
      • 1970-01-01
      • 2011-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多