browser.switch_to.frame进不去第二层iframe,求解!

    小白初学爬虫,简单的模拟豆瓣登录,遇到点问题,望好心人指教:
    模拟豆瓣主页的登录,采用selenium的browser.switch_to.frame方法,可以进入第一层iframe框架,但其下的第二层iframe进不去,搜索了网上的方法,经过各种假设和尝试仍然无效。图片和代码如下:

图一

img


图二

img


图三

img

代码如下:

import time
from selenium import webdriver

if __name__ == '__main__':
    username = '18983241561'
    password = '654321'
    browser = webdriver.Chrome(executable_path='C:\Program Files\Google\Chrome\Application\chromedriver.exe')
    url = 'https://www.douban.com/'
    browser.get(url)
    browser.maximize_window()
    time.sleep(3)
    browser.switch_to.frame(browser.find_element_by_xpath("//iframe[@src='//accounts.douban.com/passport/login_popup?login_source=anony']"))
    pass_choice = browser.find_element_by_xpath("//li[@class='account-tab-account']")
    pass_choice.click()
    username_ele = browser.find_element_by_xpath("//div[@class='account-tabcon-start']//div[@class='account-form-field']/input")
    password_ele = browser.find_element_by_xpath("//input[@id='password']")
    username_ele.send_keys(username)
    password_ele.send_keys(password)
    login_ele = browser.find_element_by_xpath("//a[@class='btn btn-account btn-active']")
    login_ele.click()

    browser.switch_to.frame(browser.find_element_by_xpath("//iframe[@src='//accounts.douban.com/passport/login_popup?login_source=anony']"))
    browser.switch_to.frame(browser.find_element_by_xpath("//iframe[@src='https://captcha.gtimg.com/1/template/drag_ele.html']")) 
    img = browser.find_element_by_xpath("//image[@class='tc-bg-placeholder']")
    location = img.location
    size = img.size
    top, button, left, right = location['y'], location['y']+size['height'], location['x'], location['x']+size['width']
    print(top, button, left, right)

使用 browser.switch_to.default_content()

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/990043
  • 除此之外, 这篇博客: web自动化之iframe页面切换中的 二、代码示例 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • """
    举例:已QQ邮箱为例
    """
    import time
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    
    
    driver = webdriver.Chrome()
    driver.get("https://mail.qq.com/")
    driver.maximize_window()
    
    # 1、通过name属性进行定位,前提是iframe有name属性
    # driver.switch_to.frame("login_frame")
    
    # 2、通过iframe索引去切换,注意iframe层级关系
    # driver.switch_to.frame(1)
    
    # 3、通过元素去定位,先找到要定位的iframe元素,然后再作为参数传入【常用】
    iframe = driver.find_element("xpath","//iframe[@id='login_frame']")
    driver.switch_to.frame(iframe)
    
    # 点击账号密码登录
    driver.find_element("xpath","//a[text()='帐号密码登录']").click()
    
    # 输入账号
    driver.find_element(By.ID,"u").send_keys("username")
    
    # 输入密码
    driver.find_element(By.ID,"p").send_keys("password")
    
    # 点击登录
    driver.find_element("xpath","//input[@id='login_button']").click()
    
    # 强制等待5s
    time.sleep(5)
    
    # 退出浏览器
    driver.quit()