自动化测试切换iframe时'invalid argument: id can not be string'报错求助
报错根因
本次报错由Chrome 88版本配套WebDriver实现的W3C标准对齐调整直接触发:
- 旧版Selenium兼容直接传入iframe的id/name字符串作为
switchTo().frame()的入参,方法内部会自动完成元素定位 - 新版本协议严格限定frame切换的入参仅支持两类:纯数字的iframe索引值、已完成定位的iframe WebElement对象
- 传入字符串参数时,驱动会尝试将入参解析为数字类型的frame内部ID,碰到字符串值就直接抛出
invalid argument: 'id' can not be string的错误
修复方案
- 替换原有直接传字符串的错误代码
原触发报错的代码片段:browser.switchTo().frame('courses-iframe'); element(by.css("a[href*='Login']")).getText().then(function (Result) { console.log(Result); }); - 调整逻辑为「先定位iframe元素,再将元素对象传入frame方法」
修正后可正常运行的代码:// 通过id定位目标iframe的WebElement对象 const targetIframe = element(by.id('courses-iframe')); // 传入元素对象完成iframe切换 browser.switchTo().frame(targetIframe); // 执行原有元素操作逻辑 element(by.css("a[href*='Login']")).getText().then(function (Result) { console.log(Result); });
补充注意事项
- 若选择通过索引切换iframe,入参必须为纯数字类型,禁止将数字转换为字符串传入
- 完成iframe内的元素操作后,需执行
browser.switchTo().defaultContent()切回主文档DOM,避免后续页面元素定位失效 - 字符串形式的iframe id值,必须先通过元素定位器转换为WebElement对象,才能作为frame方法的入参使用
内容的提问来源于stack exchange,提问作者Explorer
相关产品推荐
相关产品推荐

