爬虫(2) selenium模拟登陆163邮箱出现的问题及解决方案

起始操作:

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)

这里加了个显式等待的机制,防止元素没有加载出来,可以有一定的加载和缓冲时间。




补充

  • selenium等待的三种方式异同
    觉得这个不错,可以再好好梳理下
  • 梳理iframe的层次关系
    这个讲frame的切换很到位哦~但是怎么定位iframe还要好好想想
  • xpath
  • cookie
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值