前言:iframe是啥?ifrname是嵌套到html里的另一个页面,点击对应的功能就会跳转到新的html里。
一般遇到这种,我们代码不对iframe页面进行操作的话,那我们定位是对它不起作用的。
那我们怎么知道我们所在的元素在iframe里呢?我们以QQ官网登录来做示范
我们点击登录。然后定位一下登录里的“账号密码登录”,发现下面有iframe。就足以证明它在iframe页面里。
或者搜索iframe,就可以发现QQ的登录页面是iframe
针对iframe的特征,我们有两种方式可对待
第一种:
.switch_to.frame() – 可以是下标,也可以是iframe的name属性 ,也可以是iframe的webelement对象
driver = webdriver.Chrome()
driver.get("https://im.qq.com/")
#等待操作。这里可以用三大等待其中一个去等待(咱们不写哈)
# 下面3中用其中一种
#1.1下标。从1开始
driver.switch_to.frame(1)
#1.2 ifrname的name属性
driver.switch_to.frame("login_frame")
#1.3 iframe的webelement对象
driver.switch_to.frame('//iframe[@name="login_frame"]')
#接下来就是对ifrname的里的元素操作。大家自己个玩吧
第二种方法expected_conditions里面有个frame_to_be_available_and_switch_to_it()方法。
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://im.qq.com/")
WebDriverWait(driver,20).until(EC.visibility_of_element_located((By.XPATH,'//li[@id="loginInfo"]//a[@id="login" and text()="登录"]')))
driver.find_element_by_xpath('//li[@id="loginInfo"]//a[@id="login" and text()="登录"]').click()
#这样就OK了,这里支持下标,name属性和webelement对象
WebDriverWait(driver,20).until(EC.frame_to_be_available_and_switch_to_it("login_frame"))
#点击账号或密码登录
WebDriverWait(driver,20).until(EC.visibility_of_element_located((By.XPATH,'//div[@class="bottom hide"]//a[@class="link" and text()="帐号密码登录"]')))
driver.find_element_by_xpath('//div[@class="bottom hide"]//a[@class="link" and text()="帐号密码登录"]').click()