在 web 应用中经常会遇到 frame 嵌套页面的应用,页 WebDriver 每次只能在一个页面上识别元素,对于 frame 嵌套内的页面上的元素,直接定位是定位是定位不到的。这个时候就需要通过 switch_to_frame()方法将当前定位的主体切换了 frame 里。
在上面的 html 代码中通过 iframe 表单嵌入一个百度页面,通过浏览器打开如下图
这个时候直接定位百度的输入框一定会报找不到元素的错误。那么可以使用 switch_to_frame()先找到frame.html 中的<iframe>标签,然后再定位百度输入框。</p> <pre class="brush:java;"> <code>from selenium import webdriver import time import os driver = webdriver.Firefox() file_path = 'file:///' + os.path.abspath('frame.html') driver.get(file_path) #切换到 iframe(id = "if") driver.switch_to_frame("if") #下面就可以正常的操作元素了 driver.find_element_by_id("kw").send_keys("selenium") driver.find_element_by_id("su").click() time.sleep(3) driver.quit()</pre> <p>switch_to_frame() 默认可以直接取表单的 id 或 name 属性进行切换。如?</p> <p>?</p> <pre class="brush:java;"> <code>#id = "if" driver.switch_to_frame("if") #name = "nf" driver.switch_to_frame("nf") ……</pre> <p>那么如果 iframe 没有可用的 id 和 name 可以通过下面的方式进行定位:</p> <pre class="brush:java;"> <code>…… #先通过 xpth 定位到 iframe xf = driver.find_element_by_xpath('//*[@class="if"]') #再将定位对象传给 switch_to_frame()方法 driver.switch_to_frame(xf) …… driver.switch_to_default_content()</pre> <p>如果完成了在当前表单上的操作可以通过 switch_to_default_content()方法返回到上一层表单。该方法不用指定某个表单的返回,默认对应与它最近的 switch_to_frame()方法。?</p> <p>?</p> <p>?</p></iframe>