努力实现:
问题:
测试分布在30个不同的文件中,实例化一个selenium对象,从而创建一个firefox配置文件,在第一次测试中将不会持续到下面的测试,因为一旦脚本结束,对象就会死掉IIRC
无法指定个人资料,因为我正在编写一个应该在不同计算机上运行的测试套件
可能的解决方案:
感谢任何帮助。
编辑:只是想到而不是生成一个子python进程来运行测试,我只是实例化selenium IDE生成的测试类,在所有30个测试中删除setUp和tearDown方法,在开始时实例化一个selenium对象,然后将所述selenium对象传递给每个实例化的测试。
答案 0 :(得分:2)
我遇到了同样的问题,并且还注意到在测试中坚持单个Firefox会话大大加快了测试套件的性能。
我所做的是为我的Selenium测试创建一个基类,只有在它尚未启动时才激活它。在拆除过程中,本课程不会关闭Firefox。然后,我在一个单独的文件中创建了一个测试套件,用于导入我的所有测试。当我想要一起运行所有测试时,我只执行测试套件。在测试套件的最后,Firefox会自动关闭。
以下是基础测试类的代码:
from selenium.selenium import selenium
import unittest, time, re
import BRConfig
class BRTestCase(unittest.TestCase):
selenium = None
@classmethod
def getSelenium(cls):
if (None == cls.selenium):
cls.selenium = selenium("localhost", 4444, "*chrome", BRConfig.WEBROOT)
cls.selenium.start()
return cls.selenium
@classmethod
def restartSelenium(cls):
cls.selenium.stop()
cls.selenium.start()
@classmethod
def stopSelenium(cls):
cls.selenium.stop()
def setUp(self):
self.verificationErrors = []
self.selenium = BRTestCase.getSelenium()
def tearDown(self):
self.assertEqual([], self.verificationErrors)
这是测试套件:
import unittest, sys
import BRConfig, BRTestCase
# The following imports are my test cases
import exception_on_signup
import timezone_error_on_checkout
import ...
def suite():
return unittest.TestSuite((\
unittest.makeSuite(exception_on_signup.ExceptionOnSignup),
unittest.makeSuite(timezone_error_on_checkout.TimezoneErrorOnCheckout),
...
))
if __name__ == "__main__":
result = unittest.TextTestRunner(verbosity=2).run(suite())
BRTestCase.BRTestCase.stopSelenium()
sys.exit(not result.wasSuccessful())
这样做的一个缺点是,如果您只是从命令行运行一个测试,Firefox将不会自动关闭。我通常会将所有测试一起运行,作为将代码推送到Github的一部分,所以对我来说解决这个问题并不是一个重要的优先事项。
以下是在此系统中运行的单个测试的示例:
from selenium.selenium import selenium
import unittest, time, re
import BRConfig
from BRTestCase import BRTestCase
class Signin(BRTestCase):
def test_signin(self):
sel = self.selenium
sel.open("/signout")
sel.open("/")
sel.open("signin")
sel.type("email", "test@test.com")
sel.type("password", "test")
sel.click("//div[@id='signInControl']/form/input[@type='submit']")
sel.wait_for_page_to_load("30000")
self.assertEqual(BRConfig.WEBROOT, sel.get_location())
if __name__ == "__main__":
unittest.main()
答案 1 :(得分:0)
您可以在运行服务器本身时指定firefox配置文件。该命令看起来像
java -jar selenium-server.jar -firefoxProfileTemplate“C:\ Selenium \ Profiles”,其中“C:\ Selenium \ Profiles”将是存储firefox模板文件的路径。