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的兼容性问题,目前可通过以下方式规避:
- 避免复用失效的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
- 替换
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
- 调用
.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
相关产品推荐
相关产品推荐

