Robot Framework测试用例间实例变量(self)未保存的原因咨询
你遇到的问题核心在于 Robot Framework的库实例生命周期:默认情况下,Robot会为每个测试用例创建一个全新的库对象实例。
第一个测试用例Open Browser to mypage.com调用Open My Page时,初始化了当前MySite实例的self.pages属性;但第二个测试用例Close Browser执行时,Robot会创建一个完全新的MySite实例——这个新实例根本没有执行过Open My Page,自然不存在pages属性,所以抛出AttributeError。
下面提供几种实用的解决思路,按推荐程度排序:
1. 将MySite库改为单例模式(推荐)
让整个测试套件共享同一个MySite实例,这样所有测试用例的操作都基于同一个对象,属性自然会被保留。修改你的MySite类代码,添加单例逻辑:
class MySite(object): # 类变量保存唯一实例 _singleton_instance = None def __new__(cls, *args, **kwargs): if not cls._singleton_instance: cls._singleton_instance = super().__new__(cls, *args, **kwargs) # 初始化实例属性(避免未定义的问题) cls._singleton_instance._driver = None cls._singleton_instance.pages = None return cls._singleton_instance # 原有的@property、@driver.setter、close_all_windows、open_my_page方法保持不变
修改后,不管多少个测试用例,都会复用同一个MySite实例,第二个测试用例调用Close All Windows时,就能访问到第一个用例初始化的pages属性了。
2. 使用Suite Setup/Teardown(更符合RF最佳实践)
如果你的测试套件内所有用例都需要共享同一个浏览器会话,推荐把浏览器的打开和关闭放在套件级别的Setup和Teardown中,这样整个套件只执行一次打开/关闭,从根源避免实例问题。修改你的Robot脚本:
*** Settings *** Library MySite.py # 套件启动时打开浏览器 Suite Setup Open My Page # 套件结束时关闭所有窗口 Suite Teardown Close All Windows *** Test Case *** First Test Case # 这里写你的测试步骤,比如操作首页元素 Second Test Case # 另一个测试步骤,共享同一个浏览器会话
这种方式更贴合Robot Framework的设计理念,也能让测试结构更清晰。
3. 用全局变量传递库实例(应急方案)
如果不想修改Python库代码,也可以在第一个测试用例中把MySite实例存入全局变量,第二个用例取出使用:
*** Settings *** Library MySite.py *** Test Case *** Open Browser to mypage.com Open My Page # 获取当前库实例并保存为套件全局变量 ${mysite_instance}= Get Library Instance MySite.py Set Suite Variable ${GLOBAL_MYSITE} ${mysite_instance} Close Browser # 取出全局变量中的实例并调用方法 ${GLOBAL_MYSITE}.Close All Windows
不过这种方式相对繁琐,只适合临时场景。
你的Open My Page方法里有个小错误:self.driver.get(www.mypage.com)中的www.mypage.com没有加引号,会被Python当作变量而非字符串,运行时会报NameError,记得改成:
self.driver.get("www.mypage.com")
内容的提问来源于stack exchange,提问作者Onibas

