测试人社区

selenium为什么要切换ifream才能定位到ifream里面的元素呢

selenium为什么要切换ifream才能定位到ifream里面的元素呢

是不是因为浏览器只能对一个Dom进行解析啊?

每个嵌入的浏览上下文(embedded browsing context)都有自己的会话历史记录(session history)DOM树。包含嵌入内容的浏览上下文称为父级浏览上下文。顶级浏览上下文(没有父级)通常是由 Window 对象表示的浏览器窗口。

页面上的每个<iframe>都需要增加内存和其它计算资源,这是因为每个浏览上下文都拥有完整的文档环境。虽然理论上来说你能够在代码中写出来无限多的<iframe>,但是你最好还是先看看这么做会不会导致某些性能问题。

你这不是解答出了吗:blush:

每个frame有自己完整的dom树,所以才会分开解析的。这并不妨碍你自己再独立封装一个api,先在父层解析你的定位,如果找不到,再自动遍历每个frame或者新窗口。

思寒大大 知道哪里可以看一些 浏览器怎么定位元素的具体细节吗?就是为啥可以通过id定位到元素

官方文档是重要参考,其次是源代码,去看框架的源代码,里面有更多的细节知识。不过selenium涉及到多语言,你读代码估计会有点难度。


可以参考这个看一下,具体的查找规则是怎么定义的

1 Like

这是是讲浏览器驱动开出来的协议吧,好像没看到浏览器驱动本身怎么对浏览器做操作的

符合协议的操作,其中细节的操作步骤也会按照协议中给出的步骤来进行,如果还想要进一步那只能去源码了。。

这个大概原因是为了适应浏览器的进程模型。
简单的说,在浏览器进程模型里,iframe的处理机制是独立于浏览器主进程的,相当于在浏览器主进程上又开了个浏览器进程来处理iframe里的内容。简单理解就是浏览器里又套了个浏览器,大家彼此独立,是分家的,虽然住在一起(在一个对话框显示)。
而webdriver要完成对浏览器的驱动,依赖于浏览器进程的上下文(content),切iframe的本质是切换了浏览器进程,换个content。不切,就不能操作iframe里元素。
PS:我也就简单的说,复杂了说,我也说不来。