以前在 testerhome 上面看到一篇文章:
2015 年 3 月 新秀群作业-- Appium+Python+PO 设计模式 入门笔记(https://testerhome.com/topics/2226)
感觉很棒,所以自己也照着这种 PageObject 的模式来写 app 的自动化用例,使用的是 appium+python。
但是现在遇到一个问题,实在不会处理。
就是那些 test_case,我在单独运行一个 test_case 时,都是可以正常执行完毕的,但是当我把它们都加进 suit=unittest.TestSuite() 中去以后,再运行 runner.run(all_test_cases),只有第一个 case 可以跑成功,后面的都是 app 都没有启动就直接报错了,希望有大神可以帮忙解惑,非常感谢。
代码:
test_case000.py
#:test_case000:老用户登录——》退出
#用户的用户名和密码《————登录方法userlogin()会用到的参数
username='panbishi'
password='123456'
driver = webdriver.Remote('http://localhost:4723/wd/hub', BasePage.BaseAction.capabilities)
class test_case000(unittest.TestCase,loginPage.LoginPage):
def setUp(self):
self.driver=driver
#登录+退出
def test_login(self):
loginPage.LoginPage(self.driver).userLogin(username,password)
loginPage.LoginPage(self.driver).userlogout()
def tearDown(self):
self.driver.quit()
if __name__ == '__main__':
unittest.main()
test_case001.py
#:test_case001:新用户注册——》关闭手势密码——》退出
driver = webdriver.Remote('http://localhost:4723/wd/hub', BasePage.BaseAction.capabilities)
class test_case001(unittest.TestCase,loginPage.LoginPage):
def setUp(self):
self.driver=driver
#注册+关闭手势密码+退出
def test_Register(self):
#注册新用户
loginPage.LoginPage(self.driver).user_Register()
#关闭手势密码
accountPage.AccountPage(self.driver).close_Rgesture_after_Register()
#退出
loginPage.LoginPage(self.driver).userlogout()
def tearDown(self):
self.driver.quit()
if __name__ == '__main__':
unittest.main()
Run_all_testcases.py
casepath = "..\\TestCase\\"
result = "..\\result\\"
def CreatSuite():
#定义单元测试容器
suite=unittest.TestSuite()
#定搜索用例文件的方法
discover=unittest.defaultTestLoader.discover(casepath, pattern='test_*.py', top_level_dir=None)
#将discover方法筛选出来的用例,循环添加到测试套件中,打印出的用例信息会递增
for test_case in discover:
suite.addTests(test_case)
print suite
return suite
if __name__ == "__main__":
#所有的用例集合
all_test_cases = CreatSuite()
#获取系统当前时间
now = time.strftime('%Y-%m-%d-%H_%M_%S', time.localtime(time.time()))
day = time.strftime('%Y-%m-%d', time.localtime(time.time()))
#定义单个测试报告的存放路径,支持相对路径
tdresult = result + day
#若已经存在以当天日期为名称的文件夹的情况,则直接将测试报告放到这个文件夹之下
if os.path.exists(tdresult):
filename = tdresult + "\\" + now + "_result.html"
#以写文本文件或写二进制文件的模式打开测试报告文件
fp = file(filename, 'wb')
#定义测试报告
runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title=u'小牛在线APP2.4.0-UI自动化测试报告', description=u'用例执行情况如下:')
#运行测试用例
runner.run(all_test_cases)
#关闭报告文件
fp.close()
else:
#不存在以当天日期为名称的文件夹的情况,则建立一个以当天日期为名称的文件夹
os.mkdir(tdresult)
#以写文本文件或写二进制文件的模式打开测试报告文件
filename = tdresult + "\\" + now + "_result.html"
fp = file(filename, 'wb')
#定义测试报告
runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title=u'自动化测试报告', description=u'用例执行情况:')
#运行测试用例
runner.run(all_test_cases)
#关闭报告文件
fp.close()
下面是报错:
eclipse 里的提示:(就第一个 case 执行成功了,后面的 app 未启动,直接报错 EE……)
.EEEEEEEEEEEEEEEEEEEEEEE
Time Elapsed: 0:00:34.403000
测试报告中的 error 信息:
ft2.1: ImportError: Failed to import test module: test_case001
Traceback (most recent call last):
File "C:\Python27\lib\unittest\loader.py", line 254, in find_tests
module = self.get_module_from_name(name)
File "C:\Python27\lib\unittest\loader.py", line 232, in _getmodule_from_name
__import(name)
File "F:\test-project\appium-xnol-copy\TestCase\test_case001.py", line 29, in <module>
driver = webdriver.Remote('http://localhost:4723/wd/hub', BasePage.BaseAction.capabilities)
File "C:\Python27\lib\site-packages\appium\webdriver\webdriver.py", line 36, in __init_
super(WebDriver, self).init(command_executor, desired_capabilities, browser_profile, proxy, keep_alive)
File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 87, in init
self.start_session(desired_capabilities, browser_profile)
File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 141, in start_session
'desiredCapabilities': desired_capabilities,
File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 201, in execute
self.error_handler.check_response(response)
File "C:\Python27\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 181, in check_response
raise exception_class(message, screen, stacktrace)
WebDriverException: Message: A new session could not be created. (Original error: Requested a new session but one was in progress)
报错信息里面,说的是已经有一个 session 存在,无法创建一个新 session,但是我在每一个 testcasel 里面都加了 tearDown(),前面第一个用例的 session 不是应该已经销毁了的吗?不知道为什么还是报这个错,求助……