在Robot Framework中并行执行关键字测试Appium图表长按功能
解决Robot Framework+Appium长按图表同步检查数值的问题
这个场景确实有点棘手——因为长按操作是阻塞的,等你执行完长按再去检查,数值早就消失了。既然Robot Framework原生的并行关键字已经移除,我们可以用Python线程来实现「长按+同步等待」的逻辑,这是目前最可行的方案。
核心思路
通过Python的threading模块创建两个线程:
- 一个线程专门执行长按操作
- 另一个线程提前启动,在长按过程中持续等待目标数值出现
这样就能保证检查操作和长按操作并行执行,不会错过数值显示的窗口。
具体实现步骤
1. 编写自定义Python关键字库
创建一个ParallelActions.py文件,封装线程逻辑:
from threading import Thread from robot.libraries.BuiltIn import BuiltIn class ParallelActions: def __init__(self): self.builtin = BuiltIn() # 获取已加载的AppiumLibrary实例 self.appium = self.builtin.get_library_instance('AppiumLibrary') def long_press_and_wait_for_element(self, chart_locator, press_duration, value_element_locator, expected_text, wait_timeout=10): """ 并行执行长按和等待数值元素出现并验证文本 :param chart_locator: 图表元素的定位符 :param press_duration: 长按时长(毫秒) :param value_element_locator: 显示数值的元素定位符 :param expected_text: 预期显示的数值文本 :param wait_timeout: 等待元素出现的超时时间(秒) """ # 定义等待元素并验证文本的函数 def wait_and_verify_value(): try: # 优先用元素定位而非页面文本,更准确 self.appium.wait_until_element_is_visible(value_element_locator, timeout=wait_timeout) actual_text = self.appium.get_text(value_element_locator) self.builtin.should_be_equal_as_strings(actual_text, expected_text, "数值文本不匹配") except Exception as e: # 捕获异常并抛出,让Robot测试用例识别失败 raise AssertionError(f"等待或验证数值失败: {str(e)}") # 定义长按操作的函数 def perform_long_press(): self.appium.long_press(chart_locator, duration=press_duration) # 创建并启动线程:先启动等待线程,再启动长按线程 wait_thread = Thread(target=wait_and_verify_value) press_thread = Thread(target=perform_long_press) wait_thread.start() press_thread.start() # 等待两个线程执行完成 press_thread.join() wait_thread.join()
2. 在Robot测试用例中调用
在你的测试套件中导入自定义库,然后编写测试用例:
*** Settings *** Library AppiumLibrary Library ParallelActions.py # 导入自定义库 *** Test Cases *** Verify Long Press Chart Shows Correct Value # 定位图表元素和数值元素(根据你的APP实际情况调整) ${chart_locator} xpath=//android.widget.View[@resource-id='com.yourapp:id/main_chart'] ${value_locator} xpath=//android.widget.TextView[@resource-id='com.yourapp:id/chart_popup_value'] ${expected_value_text} 2024-05-20: 156.78 # 调用自定义关键字,并行执行长按和等待验证 Long Press And Wait For Element ${chart_locator} 5000 ${value_locator} ${expected_value_text} 12 # 验证数值在长按结束后消失 Wait Until Element Is Not Visible ${value_locator} 5
关键注意事项
- 优先用元素定位:不要依赖
Wait Until Page Contains,因为页面文本可能有重复,定位显示数值的具体元素会更准确。 - 超时时间调整:等待超时时间要比长按时长略长(比如长按5秒,超时设10-12秒),确保在长按过程中能捕获到元素出现。
- 线程安全:Appium的Driver对象本身是线程安全的,这个场景下一个线程做查询验证、一个做操作,不会有冲突。
- 异常处理:自定义关键字里要正确抛出异常,这样Robot才能识别测试是否失败。
这种方案完全可行,我在多个Appium自动化项目中用过类似的逻辑来处理需要同步操作和检查的场景。
内容的提问来源于stack exchange,提问作者Andranik
相关产品推荐
相关产品推荐

