(十一)多表单切换

虫师 创建于 大约 1 年 之前

最后更新时间 2018-11-03


在Web应用中经常会遇到frame/iframe表单嵌套页面的应用,WebDriver只能在一个页面上对元素识别与定位,对于frame/iframe表单内嵌页面上的元素无法直接定位。这时就需要通过switch_to.frame()方法将当前定位的主体切换为frame/iframe表单的内嵌页面中。

<html>
  <body>
    ...
    <iframe id="x-URS-iframe" ...>
      <html>
         <body>
           ...
           <input name="email" >

126邮箱登录框的结构大概是这样子的,想要操作登录框必须要先切换到iframe表单。

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://www.126.com")

driver.switch_to.frame('x-URS-iframe')
driver.find_element_by_name("email").clear()
driver.find_element_by_name("email").send_keys("username")
driver.find_element_by_name("password").clear()
driver.find_element_by_name("password").send_keys("password")
driver.find_element_by_id("dologin").click()
driver.switch_to.default_content()

driver.quit()

switch_to.frame() 默认可以直接取表单的id 或name属性。如果iframe没有可用的id和name属性,则可以通过下面的方式进行定位。

……
#先通过xpth定位到iframe
xf = driver.find_element_by_xpath('//*[@id="x-URS-iframe"]')

#再将定位对象传给switch_to.frame()方法
driver.switch_to.frame(xf)
……
driver.switch_to.parent_frame()

除此之外,在进入多级表单的情况下,还可以通过switch_to.default_content()跳回最外层的页面。

我要留言

  • from selenium import webdriver from time import sleep

    driver = webdriver.Chrome() driver.get("http://www.126.com") sleep(3) driver.find_element_by_id("switchAccountLogin").click() # 找到密码登录按钮按下 sleep(3)

    i=driver.find_element_by_id("") 由于定位的id是随机,故不可用,直接定位frame(0)即第一个frame

    driver.switch_to.frame(0) sleep(3) driver.find_element_by_name("email").clear() driver.find_element_by_name("email").send_keys("username") driver.find_element_by_name("password").clear() driver.find_element_by_name("password").send_keys("password") driver.find_element_by_id("dologin").click() driver.switch_to.default_content()

    在进入多级表单的情况下,可以通过switch_to.default_content()跳回最外层的页面

    sleep(3) driver.quit()

    jayunq 创建于 2019-06-07 00:20:02

  • 虫师您好,非常感谢您写的这篇文章。

    云天 创建于 2019-03-13 01:24:21

  • 现在iframe会带上每次打开自动变化的ID,我用上面的方法都报错。

    --这方法可以定位到-- i=driver.find_element_by_tag_name("iframe") driver.switch_to_frame(i) --这方法可以定位到--

    感谢大大分享教程

    richjack888 创建于 2018-12-29 15:52:45