热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【Python3.6爬虫学习记录】(八)Selenium模拟登录新浪邮箱并发送邮件

Selenium很好使用,下面写了三个函数,分别用来:login_163()–>登陆163邮箱(手动点击验证码)login_qzone()–>登陆QQ空间(快捷登

Selenium很好使用,下面写了三个函数,分别用来:

login_163() –> 登陆163邮箱(手动点击验证码)
login_qzone() –> 登陆QQ空间(快捷登录)
login_sina_post() –> 登陆新浪邮箱并发送邮件

其中发送邮件部分,忙活了大半天,各种百度,总算解决。遇到不少经典问题,在后面列出。

# 测试 selenium的使用
# 有些网页需要登陆才能打开
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import ElementNotVisibleException
import time

# 自动访问浏览器,模拟登陆163邮箱---问题,需要点击验证码--手动输入
def login_163():
driver = webdriver.Chrome()
driver.get('http://mail.163.com/')
# 设置等待时间,等待页面加载之后再操作
time.sleep(3)
# frame中实际上是嵌入了另一个页面,而webdriver每次只能在一个页面识别,需先跳转到iframe框架
driver.switch_to_frame('x-URS-iframe')
# 设置等待时间,等待页面加载之后再操作
time.sleep(3)
elem_user = driver.find_element_by_name('email')
elem_user.clear()
elem_user.send_keys('账号')
elem_pwd = driver.find_element_by_name('password')
elem_pwd.clear()
elem_pwd.send_keys('密码')
elem_pwd.send_keys(Keys.RETURN)
time.sleep(10)
driver.find_element_by_id("dologin").click()
# driver.find_element_by_id("dologin").submit()
# driver.close()
# driver.quit()

# 使用快捷登陆,不用输入验证码
def login_qzone():
driver = webdriver.Chrome()
driver.get('http://i.qq.com/')
driver.switch_to_frame('login_frame')
time.sleep(3)
driver.find_element_by_id('img_out_QQ号').click()
# driver.quit()

# 模拟登录新浪邮箱(没有验证码)发送邮件
def login_sina_post():
driver = webdriver.Chrome()
print('打开网页')
# driver = webdriver.PhantomJS()
driver.set_window_size(1120, 550)
driver.get('http://mail.sina.com.cn/?from=mail#')
time.sleep(2)
print('输入账号及密码')
elem_user = driver.find_element_by_id('freename')
elem_user.clear()
elem_user.send_keys('账号')
elem_pwd = driver.find_element_by_id('freepassword')
elem_pwd.clear()
elem_pwd.send_keys('密码')
driver.find_element_by_class_name('loginBtn').click()
# waiting for
time.sleep(3)
# 通过属性定位元素
driver.find_element_by_css_selector("a[_act='navigate'][_appid='writer']").click()
time.sleep(3)
print('输入收件人')
# 通过类名定位收件人,主题
# selenium.common.exceptions.WebDriverException: Message: unknown error: cannot focus element
# 解决上述问题->需要移动鼠标
elem_address=driver.find_element_by_class_name('wui-AddrInput')
action_a = ActionChains(driver)
action_a.move_to_element(elem_address).click().send_keys('收件人邮箱').send_keys(Keys.RETURN).perform()
print('输入主题')
# 报错 ① Message: invalid selector: Compound class names not permitted
# 有两个类名不能用空格,前后都要用 .
# ② selenium.common.exceptions.ElementNotVisibleException: Message: element not visible
# driver.execute_script("window.scrollBy(0,200)", "") # 向下滚动200px
# driver.execute_script("window.scrollBy(0,document.body.scrollHeight)", "") # 向下滚动到页面底部
# 解决,使用name定位
driver.find_element_by_name('subj').send_keys('Test')

print('输入邮件内容')
# 切换到写信部分所在框架
# frame 没有name,id时的定位方法
elem_frame = driver.find_element_by_class_name('iframe')
driver.switch_to_frame(elem_frame)
# sina邮箱比较特殊
driver.find_element_by_xpath('//body').send_keys('this is just a test based on selenium')
print('点击发送')
# 跳出当前框架进行发送
# driver.switch_to.parent_content() -> AttributeError: 'SwitchTo' object has no attribute 'parent_content'
driver.switch_to.default_content()
driver.find_element_by_class_name('mailPubText').click()
time.sleep(1)
print('发送成功')
driver.quit()

login_sina_post()

相关问题:
① 设置等待时间,等待页面加载之后再操作

②报错
1)selenium.common.exceptions.WebDriverException: Message: unknown error: cannot focus element
解决:

elem_address=driver.find_element_by_class_name('wui-AddrInput')
action_a = ActionChains(driver)
action_a.move_to_element(elem_address).click().send_keys('18846080950@163.com').send_keys(Keys.RETURN).perform()

详情参考(中间详细讲了几种可能)

2)Message: invalid selector: Compound class names not permitted
解决: 有两个类名不能用空格,前后都要用 .

3)selenium.common.exceptions.ElementNotVisibleException: Message: element not visible
存在frame,要切换到该frame中才能找到
最后要记得跳出frame
可以参考Python+Selenium定位不到元素常见原因及解决办法(报:NoSuchElementException)

 driver.switch_to_frame('login_frame')

很多时候是因为,搜索的不唯一,导致搜到别的地方,结果出错
③对于运行报错
一定先到stackoverflow搜索,直接搜报错原因,多看评论,多尝试


推荐阅读
  • 在Ubuntu系统中配置Python环境变量是确保项目顺利运行的关键步骤。本文介绍了如何将Windows上的Django项目迁移到Ubuntu,并解决因虚拟环境导致的模块缺失问题。通过详细的操作指南,帮助读者正确配置虚拟环境,确保所有第三方库都能被正确识别和使用。此外,还提供了一些实用的技巧,如如何检查环境变量配置是否正确,以及如何在多个虚拟环境之间切换。 ... [详细]
  • TypeScript 实战分享:Google 工程师深度解析 TypeScript 开发经验与心得
    TypeScript 实战分享:Google 工程师深度解析 TypeScript 开发经验与心得 ... [详细]
  • 本文详细介绍了如何使用Python中的smtplib库来发送带有附件的邮件,并提供了完整的代码示例。作者:多测师_王sir,时间:2020年5月20日 17:24,微信:15367499889,公司:上海多测师信息有限公司。 ... [详细]
  • 第二十五天接口、多态
    1.java是面向对象的语言。设计模式:接口接口类是从java里衍生出来的,不是python原生支持的主要用于继承里多继承抽象类是python原生支持的主要用于继承里的单继承但是接 ... [详细]
  • 线程能否先以安全方式获取对象,再进行非安全发布? ... [详细]
  • Python全局解释器锁(GIL)机制详解
    在Python中,线程是操作系统级别的原生线程。为了确保多线程环境下的内存安全,Python虚拟机引入了全局解释器锁(Global Interpreter Lock,简称GIL)。GIL是一种互斥锁,用于保护对解释器状态的访问,防止多个线程同时执行字节码。尽管GIL有助于简化内存管理,但它也限制了多核处理器上多线程程序的并行性能。本文将深入探讨GIL的工作原理及其对Python多线程编程的影响。 ... [详细]
  • 作为软件工程专业的学生,我深知课堂上教师讲解速度之快,很多时候需要课后自行消化和巩固。因此,撰写这篇Java Web开发入门教程,旨在帮助初学者更好地理解和掌握基础知识。通过详细记录学习过程,希望能为更多像我一样在基础方面还有待提升的学员提供有益的参考。 ... [详细]
  • Java环境中Selenium Chrome驱动在大规模Web应用扩展时的性能限制分析 ... [详细]
  • 字节码开发笔记:深入解析与应用技巧 ... [详细]
  • 深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案
    深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案 ... [详细]
  • 深入解析CAS机制:全面替代传统锁的底层原理与应用
    本文深入探讨了CAS(Compare-and-Swap)机制,分析了其作为传统锁的替代方案在并发控制中的优势与原理。CAS通过原子操作确保数据的一致性,避免了传统锁带来的性能瓶颈和死锁问题。文章详细解析了CAS的工作机制,并结合实际应用场景,展示了其在高并发环境下的高效性和可靠性。 ... [详细]
  • Cosmos生态系统为何迅速崛起,波卡作为跨链巨头应如何应对挑战?
    Cosmos生态系统为何迅速崛起,波卡作为跨链巨头应如何应对挑战? ... [详细]
  • 在深入掌握Spring框架的事务管理之前,了解其背后的数据库事务基础至关重要。Spring的事务管理功能虽然强大且灵活,但其核心依赖于数据库自身的事务处理机制。因此,熟悉数据库事务的基本概念和特性是必不可少的。这包括事务的ACID属性、隔离级别以及常见的事务管理策略等。通过这些基础知识的学习,可以更好地理解和应用Spring中的事务管理配置。 ... [详细]
  • 每日前端实战:148# 视频教程展示纯 CSS 实现按钮两侧滑入装饰元素的悬停效果
    通过点击页面右侧的“预览”按钮,您可以直接在当前页面查看效果,或点击链接进入全屏预览模式。该视频教程展示了如何使用纯 CSS 实现按钮两侧滑入装饰元素的悬停效果。视频内容具有互动性,观众可以实时调整代码并观察变化。访问以下链接体验完整效果:https://codepen.io/comehope/pen/yRyOZr。 ... [详细]
  • 本文探讨了SMTP AUTH扩展的问题及其在Python中的应用解决方案。通过分析SMTP协议的安全性不足,提出了使用SMTP AUTH扩展来增强邮件传输的安全性。文章详细介绍了SMTP AUTH的工作原理,并结合Python编程语言,提供了一种实现SMTP AUTH认证的方法。此外,还讨论了常见的实现问题及解决策略,为开发者提供了实用的参考。 ... [详细]
author-avatar
妩媚天天想我
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有