如何在Robot Framework中用循环改写重复的下拉选择测试代码?
Robot Framework 循环实现下拉选项随机选择的正确方法
问题背景
正在学习Robot Framework,为提升代码可维护性,尝试用循环替代重复代码。现有一组带下拉选项的测试题,需每次运行测试时随机选择不同答案,但尝试的FOR循环因变量拼接问题无法正常工作。
原重复代码
Check if User can change "Company" information Scroll Element Into View ${USER_MENU_SCROLL_TO_COMPANY_MENU} sleep 1s click element ${USER_MENU_CLICK_COMPANY_EDIT_BUTTON} ${random_description1} = Evaluate random.choice(@{USER_MENU_DROP_DOWN_QUESTION1}) click element ${random_description1} sleep 1s click element ${USER_MENU_CLICK_DROP_DOWN_2} ${random_description2} = Evaluate random.choice(@{USER_MENU_DROP_DOWN_QUESTION2}) click element ${random_description2} sleep 1s click element ${USER_MENU_CLICK_DROP_DOWN_3} ${random_description3} = Evaluate random.choice(@{USER_MENU_DROP_DOWN_QUESTION3}) click element ${random_description3} sleep 1s click element ${USER_MENU_CLICK_DROP_DOWN_4} ${random_description4} = Evaluate random.choice(@{USER_MENU_DROP_DOWN_QUESTION4}) click element ${random_description4} sleep 1s click element ${USER_MENU_CLICK_DROP_DOWN_5} ${random_description5} = Evaluate random.choice(@{USER_MENU_DROP_DOWN_QUESTION5}) click element ${random_description5}
尝试的错误循环代码
FOR ${i} IN RANGE 1 5 ${random_description} = Evaluate random.choice(@{USER_MENU_DROP_DOWN_QUESTION}+${i}) click element ${USER_MENU_CLICK_DROP_DOWN_}+${i} click element ${random_description} sleep 1s END
正确实现方案
方案1:使用Get Variable Value动态解析变量
Robot Framework不支持直接拼接变量名的方式获取变量,需要用Get Variable Value关键字动态解析带序号的变量:
Check if User can change "Company" information Scroll Element Into View ${USER_MENU_SCROLL_TO_COMPANY_MENU} sleep 1s click element ${USER_MENU_CLICK_COMPANY_EDIT_BUTTON} # RANGE 1 6 会生成1-5的序号(左闭右开) FOR ${i} IN RANGE 1 6 # 动态获取对应序号的下拉按钮元素 ${drop_down_btn} = Get Variable Value ${USER_MENU_CLICK_DROP_DOWN_${i}} click element ${drop_down_btn} # 动态获取对应序号的下拉选项列表并随机选择 ${options_list} = Get Variable Value ${USER_MENU_DROP_DOWN_QUESTION${i}} ${random_option} = Evaluate random.choice(${options_list}) click element ${random_option} sleep 1s END
方案2:使用列表批量存储元素(更易维护)
提前将下拉按钮和选项列表存入列表变量,通过IN ZIP同时遍历两个列表,代码更直观:
步骤1:定义列表变量
*** Variables *** @{DROP_DOWN_BUTTONS} ${USER_MENU_CLICK_DROP_DOWN_1} ${USER_MENU_CLICK_DROP_DOWN_2} ${USER_MENU_CLICK_DROP_DOWN_3} ${USER_MENU_CLICK_DROP_DOWN_4} ${USER_MENU_CLICK_DROP_DOWN_5} @{DROP_DOWN_OPTIONS} ${USER_MENU_DROP_DOWN_QUESTION1} ${USER_MENU_DROP_DOWN_QUESTION2} ${USER_MENU_DROP_DOWN_QUESTION3} ${USER_MENU_DROP_DOWN_QUESTION4} ${USER_MENU_DROP_DOWN_QUESTION5}
步骤2:编写循环测试用例
Check if User can change "Company" information Scroll Element Into View ${USER_MENU_SCROLL_TO_COMPANY_MENU} sleep 1s click element ${USER_MENU_CLICK_COMPANY_EDIT_BUTTON} # 同时遍历按钮列表和选项列表 FOR ${btn} ${opts} IN ZIP ${DROP_DOWN_BUTTONS} ${DROP_DOWN_OPTIONS} click element ${btn} ${random_option} = Evaluate random.choice(${opts}) click element ${random_option} sleep 1s END
这种方式后续新增下拉项时,只需在列表变量中添加对应元素即可,无需修改循环逻辑,可维护性更高。
内容的提问来源于stack exchange,提问作者AM0801
相关产品推荐
相关产品推荐

