本期做一个selenium详细实例,会把我在元素定位中遇到的一些阻塞和经验分享给大家。

(浏览器为Chrome)

(如果只需要最终的完整代码,请直接跳转到文章最后)

浏览器打开QQ邮箱登录网址

from selenium import webdriver

import time

zhengyi = webdriver.Chrome()

zhengyi.get('https://mail.qq.com/')

这一步没有遇到问题,至于为什么导入时间库,后面会说。

元素定位,输入QQ账号和QQ密码

手动进入QQ邮箱登录网页,按下F12打开开发者工具,点击查看元素,选择元素:

可以看到QQ账号输入框的id、name等属性,都是可以直接拿来定位的好选择。

我这里选择最通用的xpath方法来定位,id=‘u',并用send事件输入QQ账号

(也可以用zhengyi.find_element_by_id(‘u')来定位,代码更清晰,不过我个人习惯采用通用的xpath)

zhengyi.find_element_by_xpath('//*[@id="u"]').send_keys("XXXXXXXXX")

同理,QQ密码元素属性id=‘p',同样定位方法

zhengyi.find_element_by_xpath('//*[@id="p"]').send_keys("XXXXXXXX")

再同理,登录按钮元素属性id=‘login_button',这里不需要发送信息,所以选择click点击事件

zhengyi.find_element_by_xpath('//*[@id="login_button"]').click()

好的,原则上到此为止,运行pycharm应该是能够输入账号和密码,并登陆成功。

but事情没有那么简单,运行后发现,selenium报错,无法找到id为u的元素。

进过仔细观察,发现是frame嵌套页面在作怪。

我们可以这样理解,每一个网页都是一个父类的frame,从我们访问这个网址开始,就已经进入了这个父类frame嵌套。顾名思义,有父即有子。frame(父)里嵌套了iframe(子),如果我们要定位的元素在iframe里,那么我们需要先切换至iframe。

iframe也是有自己的元素属性的,selenium也提供了switch方法供我们使用

重新F12往上找iframe信息,可以看到被iframe嵌套了,id和name都是‘login_frame'

在定位元素之前,先输入如下代码:

zhengyi.switch_to.frame("login_frame")

这样就切换到iframe了,再继续之前的元素定位,即可成功。

这一步的完整代码为:

# 定位login_frame

zhengyi.switch_to.frame("login_frame")

zhengyi.find_element_by_xpath('//*[@id="switcher_plogin"]').click()

# 定位账号、密码,并输入

zhengyi.find_element_by_xpath('//*[@id="u"]').send_keys("839811794")

zhengyi.find_element_by_xpath('//*[@id="p"]').send_keys("199306zy")

# 定位登录按钮

zhengyi.find_element_by_xpath('//*[@id="login_button"]').click()

这个时候网页已经可以成功QQ邮箱。

元素定位,写信界面

继续,邮箱登录成功之后,来到写信界面,按照常规操作,我们需要先点击左上角写信按钮,展开具体写信界面

同样的方法,F12操作起来,查看写信按钮,元素定位为id=‘composebtn',发送点击事件

# 定位写信按钮

zhengyi.find_element_by_xpath('//*[@id="composebtn"]').click()

这个时候调试程序,网页成功打开结果为selenium定位不到id为composebtn的元素。

这个时候就暴露了在上一个环节中出现的问题,之前的代码将嵌套切换到了iframe的login_frame中,而此时的写信元素,不在iframe中,所以在定位之前,需要先离开这个嵌套,返回到主文档中

zhengyi.switch_to.default_content()

这样嵌套就切换到主文档了,再次运行程序,发现还是报错

通过反复查资料,终于发现,写信是在QQ登录后才会出现的。如果我们登陆之后的瞬间就去定位写信按钮,这个时候受网速、PC的客观影响,会定位不到元素。

我们只需要加一个sleep一秒,即可完美解决。(这个时候就体现了导入时间库的作用了~)

#离开login_frame

zhengyi.switch_to.default_content()

#等待一秒

time.sleep(1)

# 定位写信按钮

zhengyi.find_element_by_xpath('//*[@id="composebtn"]').click()

这样即可定位到写信按钮,进入到了发邮件的步骤

元素定位,邮件发送

邮件内容编辑有四个部分,收件人、主题、正文,以及最后点击发送按钮

通过之前踩的坑,到了这一步,我对iframe嵌套变得格外小心,准备定位的每个元素都去观察是否被iframe嵌套。

果不其然,“收件人”、“主题”和“发送”被主文档下的mainFrame嵌套了,而“正文”又被mainFrame的子frame嵌套了。

so,这一步的逻辑为:

1、先切换到mainFrame,

2、分别定位 收件人 和 主题 ,调用发送事件

3、继续切换到子frame

4、定位正文,调用发送事件

5、从子frame,返回到它的父frame,也即是mainFrame中

6、定位发送按钮,调用点击事件

这一步中,也有很多意向不到的坑:

1、定位收件人的时候,发现定位到的元素,还有子div,经过模拟,发现只有第二个子div才是真正能够定位到收件人的元素,于是先定位id=‘toAreaCtrl',然后选择第二个div中的input作为定位。

具体xpath定位内容为:“//*[@id=‘toAreaCtrl']/div[2]/input”

2.同样是定位收件人遇到的问题,必须在切换到mainFrame后、定位收件人之前,加一个延迟执行,不然一定会无法定位到收件人元素。原因不明,所以我建议如果以后遇到元素定位不到,可以尝试加一个time.sleep。

3.定位正文时,从mainFrame切换到iframe,发现iframe的id和name是动态的一串数字,但是switch_to.frame只支持固定id或者name。所以想了别的法子,先用iframe的class进行xpath定位,然后把传给switch_to.frame来切换。具体为:

#切换到iframe

zhengyi.switch_to.frame(zhengyi.find_element_by_xpath('//*[@class="qmEditorIfrmEditArea"]'))

4.邮件正文需要先调用一个点击事件激活,才能启动send事件。如果没有先点击再编写,那么send的内容会放在主题后面的文本框中。(也不知道为啥会有这样的设定~)

所以综上所述,这一步的代码为:

# 切换到mainFrame

zhengyi.switch_to.frame('mainFrame')

time.sleep(1)

# 定位收件人,并输入

zhengyi.find_element_by_xpath("//*[@id='toAreaCtrl']/div[2]/input").send_keys("XXXXXXXXX@qq.com")

# 定位主题,并输入

zhengyi.find_element_by_xpath('//*[@id="subject"]').send_keys("来自zhengyi的邮件")

# 定位邮件正文,先进入到iframe

zhengyi.switch_to.frame(zhengyi.find_element_by_xpath('//*[@class="qmEditorIfrmEditArea"]'))

# 必须先点击正文,再send_keys

zhengyi.find_element_by_xpath('/html/body').click()

zhengyi.find_element_by_xpath('/html/body').send_keys("Hello World","\nZhengyi")

# 返回到mainframe

zhengyi.switch_to.parent_frame()

# 定位发送按钮

zhengyi.find_element_by_xpath('//*[@name="sendbtn"]').click()

(就这么短短数十行,耗死了不少脑细胞)

元素定位总结

1、frame很重要,一定要看清楚是否被嵌套,以及注意切换

2、元素的id或者name如果是动态的,请放弃

3、用xpath定位真香

4、如果元素有子节点,使用相对路径继续定位

5、实在排查不出为什么定位失败,尝试一下用time.sleep()

最终程序代码

from selenium import webdriver

#导入时间模块

import time

# 注意大写Chrome的C

zhengyi = webdriver.Chrome()

zhengyi.get('https://mail.qq.com/')

# 定位login_frame

zhengyi.switch_to.frame("login_frame")

zhengyi.find_element_by_xpath('//*[@id="switcher_plogin"]').click()

# 定位账号、密码,并输入

zhengyi.find_element_by_xpath('//*[@id="u"]').send_keys("839811794")

zhengyi.find_element_by_xpath('//*[@id="p"]').send_keys("199306zy")

# 定位登录按钮

zhengyi.find_element_by_xpath('//*[@id="login_button"]').click()

# 离开login_frame

# zhengyi.switch_to.parent_frame()

zhengyi.switch_to.default_content()

# 等待一秒

time.sleep(1)

# 定位写信按钮

zhengyi.find_element_by_xpath('//*[@id="composebtn"]').click()

# 切换到mainFrame

zhengyi.switch_to.frame('mainFrame')

time.sleep(1)

# 定位收件人,并输入

zhengyi.find_element_by_xpath("//*[@id='toAreaCtrl']/div[2]/input").send_keys("839811794@qq.com")

# 定位主题,并输入

zhengyi.find_element_by_xpath('//*[@id="subject"]').send_keys("来自zhengyi发来的邮件")

# 定位邮件正文,先进入到iframe

zhengyi.switch_to.frame(zhengyi.find_element_by_xpath('//*[@class="qmEditorIfrmEditArea"]'))

# 必须先点击正文,再send_keys

zhengyi.find_element_by_xpath('/html/body').click()

zhengyi.find_element_by_xpath('/html/body').send_keys("Hello World","\nZhengyi")

# 返回到mainframe

zhengyi.switch_to.parent_frame()

# 定位发送按钮

zhengyi.find_element_by_xpath('//*[@name="sendbtn"]').click()

time.sleep(5)

#关闭浏览器

zhengyi.quit()

tips

分享几点在开发者工具里,比较方便的小窍门:

1、在开发者工具里,选中元素,点击Console,可以很直观的看到元素是否被iframe嵌套

2、Elements,选中想定位的元素,右键–COPY–Copy XPath,可以直接复制元素的xpath

3、希望您能给我分享一点tips

总结

以上所述是小编给大家介绍的selenium+python实现自动登陆QQ邮箱并发送邮件功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

python自动登录qq邮箱_selenium+python实现自动登陆QQ邮箱并发送邮件功能相关推荐

  1. python模拟登录163邮箱_selenium+python 模拟登陆网易邮箱

    selenium 模拟登陆网易邮箱实例 selenium 一.selenium 模拟登陆网易邮箱老样子,先来看看效果图吧(我没有设置正确的账号和密码,大家自己试的时候可以设置自己的账号密码),思路和分 ...

  2. python实现自动登录软件_Python selenium实现微博自动登录的示例代码

    (一)编程环境 操作系统:Win 10 编程语言:Python 3.6 (二)安装selenium 这里使用selenium实现. 如果没有安装过python的selenium库,则安装命令如下 pi ...

  3. python自动登录校园网 密码_python实现校园网自动登录的示例讲解

    因为最近想用树莓派搞个远程监控系统,又因为学校的网需要从网页登录而树莓派又不方便搞个显示器带着,所以寻思着搞个能够自动登录校园网的脚本程序,省去了每次都要打开浏览器输入账号密码的烦恼. 1.工具 火狐 ...

  4. python自动登录校园网_免费自动登录国科大校园网python脚本

    UCAS-Network-Login A python program that helps you log in UCAS network for free. 免费自动登录国科大校园网 声明:本软件 ...

  5. Python 自动登录某游戏平台及游戏自动登录

    某游戏平台及自动登录功能 以下原代码为本人原创,仅供交流使用,不做任何其他功能,如作他用后果自负 import time from os import getcwd from xunlu1_1 imp ...

  6. php微信自动登录,利用php怎么实现一个自动登录微信并获取昵称的功能

    利用php怎么实现一个自动登录微信并获取昵称的功能 发布时间:2021-02-18 14:55:53 来源:亿速云 阅读:58 作者:Leah 这篇文章将为大家详细讲解有关利用php怎么实现一个自动登 ...

  7. html如何实现自动登录,JS实现两周内自动登录功能

    本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下 两周内自动登录 两周内自动登录 var oTxt1 = document.getElementsByName('u ...

  8. qq三国登录显示服务器繁忙,陕西广电宽带登陆QQ三国后服务器繁忙与更新没关系昨晚就这样了...

    2008-12-23 回答 QQ三国版本再次更新,本次更新的版本里为广大玩家带来了一系列节日活动!圣诞.元旦.春节--一个都不能少!圣诞老人.财神爷降临三国,"馅儿饼"砸向三国-- ...

  9. qq空间h5页面,如何在微信中直接打开qq空间链接却不需要登陆qq账号密码

    我们在玩微信营销的时候,发现一个有趣的问题:在微信上打开qq页面,不需要登陆qq账号密码,这是怎么回事呢? 这个qq空间h5页面是怎么做的呢? 微信打开免登陆QQ: 如果随便一篇QQ空间文章或者说说, ...

最新文章

  1. 0x03.基本算法 — 前缀和与差分
  2. javascript初学
  3. LeetCode 75. 颜色分类(Sort Colors)
  4. 南宁网络推广浅析如何分析SEO数据,才能助力网站优化效果更“事半功倍”?...
  5. Tensorflow矩阵过大问题的解决
  6. 别傻了,年轻人买“养生奶茶”才不是为了养生!
  7. PHP结合Ueditor并修改图片上传路径
  8. Linux的内存理解
  9. UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb8 in position 24: invalid start byte
  10. android按钮对齐方式,表格行中三个按钮的对齐方式Android
  11. 力扣-1267 统计参与通信的服务器
  12. memcached—认识Memcache
  13. 云计算简史_云计算的概念和发展历史
  14. JQuery $(function(){})和$(document).ready(function(){})
  15. Android 最全面试题汇总(问题+答案+详解链接)
  16. Python快速统计文件中高频词
  17. 2014阿里校园招聘软件工程师笔试题(9.22武汉站)
  18. java as2_使用AS2(http)协议实现 B2B 商用数据交换 (二) [译]
  19. 【免费素材】必备国内外常用blender材质模型下载网站
  20. SOLIDWORKS参数化设计方法

热门文章

  1. 【转载】企业即时通讯为什么兴不起也衰不了
  2. 今天的几经沧桑的飞鸽传书2011
  3. JS中自动执行函数小结
  4. 盖茨依然坐镇微软搜索团队 要与谷歌争高下
  5. 历史习题与答案解析(1-50期)
  6. 寄存器分配图着色_【02】从零开始的卡通渲染-着色篇1
  7. pcl完整分割聚类流程
  8. 嵌入式开发板02---点亮LED升级版
  9. STM32----摸石头过河系列(一)
  10. 生物研究中不得缺少的数字概念