起始操作:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.wait import WebDriverWait
import time
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.support import expected_conditions as EC
# 需要装好ChromeDriver
browser= webdriver.Chrome()
browser.get('https://mail.163.com')
# 要先切换到子fram才可以进行find 而且只能切换依次(这是个inplace的操作
browser.switch_to.frame(0)
这里切换iframe的操作别忘了
切换账号密码登陆界面
问题1的出现
输入mail.163.com网址默认显示的是二维码登陆
如果直接通过browser.find_element_by_name(‘email’)进行输入,会报错:
selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable
在SOF找到了报错原因:要进行操作的界面被别的元素覆盖了。
所以,我们的解决方案就是:把二维码登陆切换成账号密码登陆的方式
问题2的出现
switchToLogIn=browser.find_element_by_id('lbNormal')
执行这个语句被报错:‘
selenium.common.exceptions.NoSuchElementException
这篇文章里面总结的很好,基本上把所有报这个错的原因都整理在里面了。所以经过排查,我发现这是因为一开始我们就将frame切换到账号密码的登陆框的frame了,而这个点击切换的按钮并不属于这个frame,所以应该先点击切换成账号密码输入,再切换frame。
修正如下:
# 需要装好ChromeDriver
browser= webdriver.Chrome()
browser.get('https://mail.163.com')
# 切换到账号密码登陆界面 但是我们这里先等待其加载出来 ,所以使用WebDriverWait进行显式等待
switchToLogIn=WebDriverWait(browser,10).until(EC.presence_of_element_located( (By.ID,'lbNormal') ) )
switchToLogIn.click()
# 要先切换到子fram才可以进行find 而且只能切换依次(这是个inplace的操作
browser.switch_to.frame(0)
这里加了个显式等待的机制,防止元素没有加载出来,可以有一定的加载和缓冲时间。