Appium 求助,appium+python 自动化用例使用 unittest 测试套件 unittest.TestSuite () 去执行时,报错

kaige201314 · 2016年07月22日 · 最后由 shawn 回复于 2017年08月07日 · 196 次阅读

以前在 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 不是应该已经销毁了的吗?不知道为什么还是报这个错,求助……

共收到 12 条回复 时间 点赞

你的 driver 写在了 class 外面,import 文件的同时就会初始化 driver 变量,即执行你的 webdriver.Remote() 函数。这个时候压根还没开始跑用例,你的 tearDown 自然不会被调用到。

建议把 driver 的初始化放到 setUp 里面,或者把它做成单例。

@chenhengjie123
确实是这个问题,非常感谢,testerhome 的牛人真多,哈哈😃

#2 楼 @kaige201314 楼主学习 appium 工具需要具备什么基础啊,我做 APP 测试的,也想这个工具

—— 来自 TesterHome 官方 安卓客户端

学习 appium,你需要的基础是:python,还有 selenium,还有 appium 的行原理,多实践,Github 上有很多非常棒的框架,可以去搜搜看

@kaige201314 您好,我也在搞这个东西 遇到一些问题,可以加下您的 QQ 学习下吗 麻烦把您的 QQ 发我邮箱 非常感谢 594228311@qq.com 或者直接加我 QQ 594228311

#1 楼 @chenhengjie123 你好大神,我现在也是用 PO 模式去写,就是我写完基类,然后 import 进来之后,调用相应的方法,老提示我没有 driver,或者我这样写,老提示我少传参数,如图:



老报最后这个错误,请大神指教,我这个参数怎么传进来,driver 怎么定义,我后续调用登陆这个业务的时候,不会提示我少 driver

请问楼主,你登录文件里,driver 是怎么定义的,我现在用 PO 模式写,当 import 登录文件,调用登录函数方法时,老报:没有 driver

@kaige201314 请问,你 LoginPage 里面 driver 是怎么定义,如何方便以后业务调用 userLogin(username,password) 可以正常运行,不报没有 driver 的错误

感激,翻到现在终于翻到跟我一模一样问题的人了,终于解决了,多谢各位大侠

miaoyan 回复

看不到你的初始化函数,答案应该大差不差跟我的差不多,class().fun(),一般来说类是这个调用方法,类中有初始化函数init,你定义类的时候肯定把 driver 写在初始化函数里了,但是你调用的时候又没有传进去,所以出错了

miaoyan 回复

请问你解决了吗,我也是这个问题

同样问题,webdriver.Remote() 函数已经在 Class 中,但是运行脚本时只能运行第一个,运行第二个时则报错会话已存在。

求解!

解决: tearDown(self) 中没有定义退出动作,当前产生的会话没有退出,所以剩余的用例无法执行。
self.dirver.quit()

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册