1、问题描述
用selenium模拟登录豆瓣的时候发现无法定位到登录选项,查看网页源代码发现嵌套了iframe
iframe标记又叫浮动帧标记,可以用它将一个HTML文档嵌入在一个HTML中显示,<iframe></iframe>所包含的内容与整个页面是一个整体,应用iframe可以在同一个页面中多次显示同一内容,而不必重复这段内容的代码。
2、分析思路
(1)需要切换到iframe
需要用到driver.switch_to.frame()方法
# 用id定位 `driver.switch_to.frame("iframe")`
# 用name定位 `driver.switch_to.frame("myiframe")`
# 用index定义 `driver.switch_to.frame("index")`
# 用WebElement定位 `driver.switch_to.frame("WebElement")`
from selenium import webdriver driver = webdriver.Chrome() driver.get("https://www.douban.com/") address_iframe = driver.find_element_by_xpath("//div[@class='login']/iframe") # 切换到iframe driver.switch_to.frame(address_iframe)
(2)定位成功后就可以通过ActionChains执行相应的模拟操作
from selenium import webdriver from selenium.webdriver import ActionChains import time driver = webdriver.Chrome() driver.get("https://www.douban.com/") iframe = driver.find_element_by_xpath("//div[@class='login']/iframe") driver.switch_to.frame(iframe) ac = driver.find_element_by_xpath("//li[@class='account-tab-account']") ActionChains(driver).move_to_element(ac).click(ac).perform() # 移动到密码登录选项 ac = driver.find_element_by_class_name("account-tab-account") ActionChains(driver).move_to_element(ac).click(ac).perform() time.sleep(1) # 输入账号 driver.find_element_by_id("username").send_keys("输入账号") # 输入密douban码 driver.find_element_by_id("password").send_keys("输入密码") time.sleep(2) # 点击登录 driver.find_element_by_partial_link_text("登录豆瓣").click() time.sleep(2)
# 获取cookie
cookie = driver.get_cookies()
print([dict(i["name"]:i["value"]) for i in cookie])
driver.quit()
(3)切换到frmae中之后,便不能继续操作主文档中的元素,这时需要切换回主文档
# 切换到父frame,相当于后退 `driver.switch_to.parent_frame()`
# 切换到主文档 `driver.switch_to.default_content()`