selenium为什么要切换ifream才能定位到ifream里面的元素呢
是不是因为浏览器只能对一个Dom进行解析啊?
每个嵌入的浏览上下文(embedded browsing context)都有自己的会话历史记录(session history)和DOM树。包含嵌入内容的浏览上下文称为父级浏览上下文。顶级浏览上下文(没有父级)通常是由 Window
对象表示的浏览器窗口。
页面上的每个<iframe>
都需要增加内存和其它计算资源,这是因为每个浏览上下文都拥有完整的文档环境。虽然理论上来说你能够在代码中写出来无限多的<iframe>
,但是你最好还是先看看这么做会不会导致某些性能问题。
你这不是解答出了吗
每个frame有自己完整的dom树,所以才会分开解析的。这并不妨碍你自己再独立封装一个api,先在父层解析你的定位,如果找不到,再自动遍历每个frame或者新窗口。
思寒大大 知道哪里可以看一些 浏览器怎么定位元素的具体细节吗?就是为啥可以通过id定位到元素
官方文档是重要参考,其次是源代码,去看框架的源代码,里面有更多的细节知识。不过selenium涉及到多语言,你读代码估计会有点难度。
可以参考这个看一下,具体的查找规则是怎么定义的
这是是讲浏览器驱动开出来的协议吧,好像没看到浏览器驱动本身怎么对浏览器做操作的
符合协议的操作,其中细节的操作步骤也会按照协议中给出的步骤来进行,如果还想要进一步那只能去源码了。。
这个大概原因是为了适应浏览器的进程模型。
简单的说,在浏览器进程模型里,iframe的处理机制是独立于浏览器主进程的,相当于在浏览器主进程上又开了个浏览器进程来处理iframe里的内容。简单理解就是浏览器里又套了个浏览器,大家彼此独立,是分家的,虽然住在一起(在一个对话框显示)。
而webdriver要完成对浏览器的驱动,依赖于浏览器进程的上下文(content),切iframe的本质是切换了浏览器进程,换个content。不切,就不能操作iframe里元素。
PS:我也就简单的说,复杂了说,我也说不来。