selenium定位iframe中的元素

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()`

原文地址:https://www.cnblogs.com/nuochengze/p/12866987.html