You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Watir在Firefox中调用wait_until/.html后iframe失效问题求助

Watir Firefox iframe处理异常问题

在Firefox中使用Watir处理iframe时出现异常,该问题在Chrome中无复现。

环境信息

  • Watir版本:7.3
  • Selenium版本:4.2
  • 浏览器版本:Firefox 122.0.1 64位
  • 浏览器驱动版本:geckodriver 0.34.0
  • 操作系统版本:Mac OS 14.2.1
    注:该问题在其他操作系统及不同版本的Watir、Firefox中均存在。

问题现象

对iframe调用wait_until或.html方法后,会触发Watir::Exception::UnknownObjectException异常:

  • 调用wait_until后,仅能对iframe内元素执行一次操作,第二次操作失败;
  • 调用.html后,原iframe实例完全失效,后续所有操作均失败。

复现代码

class TestFFIssueWatir
  def initialize
    @browser = Watir::Browser.new :firefox
  end

  def goto_website
    @browser.goto('https://demo.automationtesting.in/Frames.html')
  end

  def check_error_using_wait_until
    testIframe = @browser.body.iframe(id: 'singleframe')
    testIframe.wait_until(timeout: 10, &:present?)
    testIframe.input.send_keys('Hello, Universe!')
    testIframe.input.send_keys('Hello, Again!')
  end

  def check_error_with_html
    testIframe = @browser.body.iframe(id: 'singleframe')
    puts(testIframe.html)
    testIframe.input.send_keys('Hello, world!')
  end
end

test_watir = TestFFIssueWatir.new
test_watir.goto_website
test_watir.check_error_with_html
test_watir.check_error_using_wait_until

临时解决方案

由于该问题属于Watir与Firefox的兼容性问题,目前可通过以下方式规避:

  1. 避免复用失效的iframe实例:每次操作前重新定位iframe,而非复用已调用过wait_until或.html的实例
def check_error_using_wait_until
  @browser.body.iframe(id: 'singleframe').wait_until(timeout: 10, &:present?)
  @browser.body.iframe(id: 'singleframe').input.send_keys('Hello, Universe!')
  @browser.body.iframe(id: 'singleframe').input.send_keys('Hello, Again!')
end
  1. 替换wait_until(&:present?)的使用场景:若仅需等待iframe内元素加载,直接等待目标元素而非iframe本身
def check_error_using_wait_until
  testIframe = @browser.body.iframe(id: 'singleframe')
  testIframe.input.wait_until(timeout: 10, &:present?).send_keys('Hello, Universe!')
  testIframe.input.send_keys('Hello, Again!')
end
  1. 调用.html后重新定位iframe:若必须获取iframe的HTML内容,在获取完成后重新获取iframe实例再执行后续操作
def check_error_with_html
  testIframe = @browser.body.iframe(id: 'singleframe')
  puts(testIframe.html)
  # 重新定位iframe
  testIframe = @browser.body.iframe(id: 'singleframe')
  testIframe.input.send_keys('Hello, world!')
end

该问题已提交至Watir官方仓库等待修复,上述方案可作为临时处理手段应对多iframe场景的测试需求。

内容的提问来源于stack exchange,提问作者Yub Raj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 02:52:40