硒+ python实现自动登陆QQ邮箱并发送邮件功能

  

本期做一个硒详细实例,会把我在元素定位中遇到的一些阻塞和经验分享给大家。
  (浏览器为Chrome)
  

  

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

  

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

  

QQ邮箱登录地址为:https://mail.qq.com/

        从硒进口webdriver   导入的时间   正意=webdriver.Chrome ()   zhengyi.get (“https://mail.qq.com/?      

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

  

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

  

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

  

硒+ python实现自动登陆QQ邮箱并发送邮件功能

  

可以看到QQ账号输入框的id、名称等属性,都是可以直接拿来定位的好选择。
  我这里选择最通用的xpath方法来定位,id=皍”,并用发送事件输入QQ账号
  

  

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

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

同理、QQ密码元素属性id=皃”,同样定位方法

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

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

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

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

  

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

  

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

  

我们可以这样理解,每一个网页都是一个父类的框架,从我们访问这个网址开始,就已经进入了这个父类框架嵌套。顾名思义,有父即有子.frame(父)里嵌套了iframe(子),如果我们要定位的元素在iframe里,那么我们需要先切换至iframe。
  iframe也是有自己的元素属性的,硒也提供了开关方法供我们使用

  

重新F12往上找iframe信息,可以看到被iframe嵌套了,id和名称都是“login_frame”

  

硒+ python实现自动登陆QQ邮箱并发送邮件功能

  

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

        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 (“199306 zy”)   #定位登录按钮   zhengyi.find_element_by_xpath ('//* [@ id=" login_button "]”) .click ()      

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

  

<强>元素定位,写信界面

  

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

  

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

        #定位写信按钮   zhengyi.find_element_by_xpath ('//* [@ id=" composebtn "]”) .click ()      

这个时候调试程序,网页成功打开结果为硒定位不到id为composebtn的元素。
  这个时候就暴露了在上一个环节中出现的问题,之前的代码将嵌套切换到了iframe的login_frame中,而此时的写信元素,不在iframe中,所以在定位之前,需要先离开这个嵌套,返回到主文档中

        zhengyi.switch_to.default_content ()      

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

  

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

硒+ python实现自动登陆QQ邮箱并发送邮件功能