<iframe>标签用于在一个网页中嵌入另一个网页。嵌套的网页可以作为一个独立的部分实现局部刷新,长用于表单的提交和第三方广告的异步加载等。以淘宝为例子,在未登录的条件下,打开一个商品详情页,单击购买按钮,会弹出登录表单。打开开发者工具定位到登录表单,可以看到登录表单存储在<iframe>标签中,并且有自己的<head>标签、<body>标签和其他标签,相当于一个嵌套在主页面中的子页面。子页面的定位方式,不能使用普通的定位方式,先使用selenium模块中的switch_to_frame()函数跳转到这个新界面,然后再进行定位。
注意的是使用XPath时尽量不要使用/html/body/div[8]/iframe这样的格式,而是用使用
//*[@class="J_MIDDLEWARE_FRAME_WIDGET"][2]/iframe
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
import time
service = Service('E:\\python\\Scripts\\chromedriver.exe') #实例化一个谷歌浏览器
browser = webdriver.Chrome(service=service)
browser.get('https://www.taobao.com') #访问淘宝网页首页
shop_a = browser.find_element(By.XPATH,'//*[@id="ice-container"]/div[2]/div[2]/div[2]/div[1]/div/ul/li[7]/div[1]/a[1]') #定位到女鞋的商品链接
actions = ActionChains(browser)
actions.click(shop_a).perform() #点击定位到的商品链接,打开新页面
browser.switch_to.window(browser.window_handles[-1])
shop_one = browser.find_element(By.XPATH,'//*[@id="ice-container"]/div[1]/div[1]/img') #定位到第一款商品
actions1 = ActionChains(browser)
actions1.click(shop_one).perform() #点击定位到的第二款鞋子商品
browser.switch_to.window(browser.window_handles[-1]) #跳转到商品详细页,会弹出登录表单
iframe_login = browser.find_element(By.XPATH,'//*[@class="J_MIDDLEWARE_FRAME_WIDGET"][2]/iframe') # 定位iframe标签,由于iframe没有id,name这种唯一的属性,因此只能通过先定位,在切换实现
browser.switch_to.frame(iframe_login) #切换到<frame>标签中的子页面,即登录表单
user_input = browser.find_element(By.XPATH,'//input[@placeholder="账号名/邮箱/手机号"]')###注意要更具规则自定义不要用器右键取到的XPATH
user_input.send_keys("123") #输入账号
time.sleep(5) #等待5秒
browser.quit() #关闭所有页面,退出浏览器驱动程序
'''
其中,switch_to.window()函数中browser.window_handles[-1]表示打开所有窗口中的最后一个窗口。
switch_to.frame()函数用于切换到<iframe>标签作为参数传入。
'''