十、多表单切换

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

 

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

from selenium import webdriver

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

driver.switch_to.frame(0)
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-iframe1602559413023.1245"]')

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

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

driver.switch_to.frame(driver.find_element_by_xpath("xpath"))      # 通过定位方式切入iframe表单
driver.switch_to.frame(0)                                                                 # 通过iframe的索引切入 iframe表单
driver.switch_to.frame('id value')                                                     # 通过iframe的id切换入frame表单
driver.switch_to.frame('name')                                                        # 通过iframe的name切入iframe表单
driver.switch_to.parent_frame()                                                     # 跳出当前上一级表单
driver.switch_to.default_content()                                                  # 跳回最外层页面
posted @ 2019-10-24 14:40  酒剑仙*  阅读(428)  评论(0编辑  收藏  举报