Appium中如何等待元素内指定文本值的第二次出现
问题排查
你使用的text_to_be_present预期条件不存在第三个计数参数,Selenium原生的内置预期条件没有提供匹配文本第N次出现的能力,无法满足你的需求。
正确实现方案
根据你的场景选择对应实现方式:
场景1:第一次output出现后,文本会先变化为其他值(如加载状态、空值),再出现第二次output
这是最常见的场景,实现逻辑为:先记录初始已存在的output状态,等待文本刷新后再次匹配到output即可。
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By # 记录初始已加载的第一个output状态 target_locator = (By.ID, ":id/tvResult") initial_text = driver.find_element(*target_locator).text # 自定义等待条件 def check_second_output(driver): current_text = driver.find_element(*target_locator).text # 文本不等于初始值且等于output,说明是第二次加载完成 return current_text == "output" and current_text != initial_text # 启动等待,超时时间10秒 WebDriverWait(driver, 10).until(check_second_output)
场景2:文本不会清空,需要累计统计output出现的次数达到2次
如果文本会多次变动但不会清空,需要统计出现次数的实现如下:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By target_locator = (By.ID, ":id/tvResult") # 已检测到第一次output,初始计数为1 output_occur_count = 1 last_recorded_text = driver.find_element(*target_locator).text def count_output_times(driver): nonlocal output_occur_count, last_recorded_text current_text = driver.find_element(*target_locator).text # 文本发生变化且新值为output时计数+1 if current_text != last_recorded_text and current_text == "output": output_occur_count += 1 last_recorded_text = current_text return output_occur_count >= 2 WebDriverWait(driver, 10).until(count_output_times)
额外说明
- Selenium 4.0+版本已将旧的
expected_conditions模块标记为弃用,自定义等待条件的兼容性和灵活度更高 - 默认WebDriverWait的轮询间隔为0.5秒,若需要调整轮询频率可以在初始化
WebDriverWait时传入poll_frequency参数自定义
内容的提问来源于stack exchange,提问作者angid
相关产品推荐
相关产品推荐

