热门标签 | 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搜索,直接搜报错原因,多看评论,多尝试


推荐阅读
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社区 版权所有