使用Selenium获取iframe的title,切换frame后仍返回主页面标题如何解决
问题原因
- Selenium的
driver.getTitle()方法默认作用于浏览器标签页的顶层文档,无论是否切换iframe上下文,都只会返回顶层页面的标题。 - 你对iframe上下文切换的认知部分正确:切换后仅会限制DOM元素相关操作(元素查找、交互等)在当前iframe内执行,窗口级别的API(获取标题、获取页面URL等)不受上下文切换影响。
解决方案
如果需要获取iframe内嵌页面的标题,在切换到对应iframe上下文后,通过执行JS脚本读取内嵌文档的title属性即可,参考代码如下:
const webdriver = require('selenium-webdriver'); const { By, Key, until } = require('selenium-webdriver'); const firefox = require('selenium-webdriver/firefox'); let driver; async function whenElement(by_identity,timeout=1000){ try{ var el = await driver.findElement(by_identity); await driver.wait(until.elementIsVisible(el),timeout); return el; } catch(err){ console.log(`whenElement,ELEMENT ${by_identity} not found, ERROR=>${err}`); } } (async ()=>{ driver=await new webdriver.Builder().forBrowser('firefox').build(); await driver.get(`https://www.google.com/recaptcha/api2/demo`); // 获取顶层页面标题 await driver.getTitle().then(text=>{console.log(text)}); await driver.switchTo().frame(await whenElement(By.xpath('/html/body/div[1]/form/fieldset/ul/li[5]/div/div[1]/div/div/iframe'),5000)) // 执行JS获取iframe内嵌文档标题 const iframeTitle = await driver.executeScript('return document.title') console.log(iframeTitle) })();
运行后即可得到你预期的输出结果。
内容的提问来源于stack exchange,提问作者user15573857
相关产品推荐
相关产品推荐

