精华内容
下载资源
问答
  • 这篇文章主要介绍了selenium+python实现自动登陆QQ邮箱并发送邮件功能,本文给大家分享完整实例代码,需要的朋友可以参考下 本期做一个selenium详细实例,会把我在元素定位中遇到的一些阻塞和经验分享给大家。 ...

    这篇文章主要介绍了selenium+python实现自动登陆QQ邮箱并发送邮件功能,本文给大家分享完整实例代码,需要的朋友可以参考下
    本期做一个selenium详细实例,会把我在元素定位中遇到的一些阻塞和经验分享给大家。
    (浏览器为Chrome)
    (如果只需要最终的完整代码,请直接跳转到文章最后)

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

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

    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
    写到这里,给大家推荐一个资源很全的python学习聚集地,点击进入,这里有资深程序员分享以前学习

    心得,学习笔记,还有一线企业的工作经验,且给大家精心整理一份python零基础到项目实战的资料,

    每天给大家讲解python最新的技术,前景,学习需要留言的小细节

    总结

    以上所述是小编给大家介绍的selenium+python实现自动登陆QQ邮箱并发送邮件功能,希望对大家有所帮

    展开全文
  • python模拟登陆1. 模拟登录主要掌握几点:要抓住真正要登录的URL;要拿到要post的表单数据Form data,一般是以字典形式;填写好header,有的网站可能会认证User-Agent,Host,Referer等等请求头。2. 举例:模拟登录...

    python模拟登陆

    1. 模拟登录主要掌握几点:要抓住真正要登录的URL;

    要拿到要post的表单数据Form data,一般是以字典形式;

    填写好header,有的网站可能会认证User-Agent,Host,Referer等等请求头。

    2. 举例:模拟登录csdn博客

    2.1. 首先打开csdn的登录页面

    2.2. 登录过程分析

    2.2.1. chrome浏览器按下F12打开开发者工具

    点击Network,找到过滤器,筛选XHR,等会登录的时候,Method那一列会显示POST GET。

    点击Headers旁边的叉,关闭后就是下面的效果

    chrome_dev1.png

    注意,分析工具要设置保存log (设置中Preferences标签下面Network的 “Preserve log”打开,页面中也可以看到这个开关),因为有些网站是登录后跳转,会把post那个log删除,当然,你也可以输入错误的密码就不会跳转,方便抓取。

    2.2.2. 点击POST一栏可以看到url数据,Request Head数据,,post数据获取url链接数据

    chrome_dev2.png

    Head数据,比如

    User-Agent:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36

    如果我们不指定 user agent,使用默认的,他不是一个正常的用户,所以可能会被网站拒绝了出现403错误。我们加上上面的Head数据就可以了。

    Form Data表单数据

    username:你的用户名

    password:你的密码

    lt:LT-736919-1mfGXdeQovq5gfbI9luJfgFMXYaPHg

    execution:e8s1

    _eventId:submit

    Form Data表单数据分析

    username和password是用户名和密码,lt数据每次打开这个登录网站都不一样,所以要去网站中获取。

    2.3. 简单登录代码

    开始需要获取网页中的’lt’数据,后面把表单数据post就可以了。

    import requests

    from bs4 import BeautifulSoup as bs

    def get_lt_value(str):

    '''

    提取lt流水号,将数据化为一个字典

    '''

    soup = bs(str)

    mydict = {}

    for inp in soup.form.find_all('input'):

    if inp.get('name') != None:

    mydict[inp.get('name')] =inp.get('value')

    return mydict

    s = requests.Session()

    r = s.get("http://passport.csdn.net/account/login")

    dictvalue = get_lt_value(r.text)

    header = {

    'User-Agent':'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0'}

    payload ={

    'username':'**',

    'password':'**',

    'lt':dictvalue["lt"],

    'execution':'e1s1',

    '_eventId':'submit'}

    print(payload)

    r = s.post("http://passport.csdn.net/account/login",data=payload,headers=header)

    print(r.text)

    2.4. 优化,保存cookie,这样下次就不需要重新发送登录请求了import requests

    import time

    import os

    from bs4 import BeautifulSoup as bs

    from http.cookiejar import LWPCookieJar

    def get_lt_value(str):

    '''

    提取lt流水号,将数据化为一个字典

    '''

    soup = bs(str)

    mydict = {}

    for inp in soup.form.find_all('input'):

    if inp.get('name') != None:

    mydict[inp.get('name')] =inp.get('value')

    return mydict

    # cookie setting

    s = requests.Session()

    s.cookies = LWPCookieJar('cookiejar')

    header = {'User-Agent':'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0'}

    if not os.path.exists('cookiejar'):

    print("there is no cookie,setting")

    r = s.get("http://passport.csdn.net/account/login")

    dictvalue = get_lt_value(r.text)

    payload ={

    'username':'***',

    'password':'***',

    'lt':dictvalue["lt"],

    'execution':'e1s1',

    '_eventId':'submit'}

    print(payload)

    r = s.post("http://passport.csdn.net/account/login",data=payload,headers=header)

    s.cookies.save(ignore_discard=True)

    print(r.text)

    else:

    print("cookie exists,restore")

    s.cookies.load(ignore_discard=True)

    r = s.get("http://write.blog.csdn.net/postlist",headers=header)

    print(r.text)

    3. 参考文献:技术交流学习,请加QQ微信:631531977

    展开全文
  • 本期做一个selenium详细实例,会把我在元素定位中遇到的一些阻塞...浏览器打开QQ邮箱登录网址 QQ邮箱登录地址为:https://mail.qq.com/ from selenium import webdriver import time zhengyi = webdriver.Chrome() ...

    本期做一个selenium详细实例,会把我在元素定位中遇到的一些阻塞和经验分享给大家。
    (浏览器为Chrome)
    (如果只需要最终的完整代码,请直接跳转到文章最后)

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

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

    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
    最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员定时讲解Python技术,分享一些学习的方法和需要留意的小细节
    总结

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

    展开全文
  • selenium+python实现自动登陆QQ邮箱,并发送邮件

    千次阅读 多人点赞 2019-12-12 18:01:17
    这里写自定义目录标题selenium+pycharm实战,登录QQ邮箱,并发送邮件浏览器打开QQ邮箱登录网址元素定位,输入QQ账号和QQ密码元素定位,写信界面插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个...

    selenium+pycharm实战,登录QQ邮箱,并发送邮件

    本期做一个selenium详细实例,会把我在元素定位中遇到的一些阻塞和经验分享给大家。
    (浏览器为Chrome)
    (如果只需要最终的完整代码,请直接跳转到文章最后)

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

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

    	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("xxxxxxxx")
        zhengyi.find_element_by_xpath('//*[@id="p"]').send_keys("xxxxxxxx")
        # 定位登录按钮
        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("XXXXXXXXX")
    zhengyi.find_element_by_xpath('//*[@id="p"]').send_keys("XXXXXXXXX")
    # 定位登录按钮
    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("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()
    time.sleep(5)
    #关闭浏览器
    zhengyi.quit()
    

    tips

    分享几点在开发者工具里,比较方便的小窍门:
    1、在开发者工具里,选中元素,点击Console,可以很直观的看到元素是否被iframe嵌套
    在这里插入图片描述
    2、Elements,选中想定位的元素,右键–COPY–Copy XPath,可以直接复制元素的xpath
    3、希望您能给我分享一点tips

    希望这篇博客能给工程师们一点帮助,感谢阅读~

    展开全文
  • python实现qq机器人qqbot

    2018-06-01 10:24:00
    title: python实现qq机器人qqbot tags: python date: 2018-6-1 10:19:00 --- 以下内容为转载 一、介绍 qqbot 是一个用 python 实现的、基于腾讯 SmartQQ 协议的 QQ 机器人框架,可运行在 Linux 、 Windows 和 Mac...
  • 今天小编就为大家分享一篇Python Tkinter 简单登录界面实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 具体内容如下项目环境:软件环境:OS:RedHat6.3Lib:PygtkLanguage:PythonSupport tool:Glade3项目简述:①Glade3设计用户的登录窗口,功能主窗口②通过Gtk.Builder初始化,载入界面③在Mysql.py文件中实现Python操作...
  • import urllib.request import urllib.parse ... def gethtml(url): ... cookie_jar = urllib.request.HTTPCookieProcessor...第一个print语句可以打印出两行cookie 第二个print html一直打印的登陆界面,求高手指教。。
  • # qq两个字 import tkinter as tk win = tk.Tk() win.geometry('480x390') # win.title('') label = tk.Label( win, text='QQ', fg='#FFFFFF', bg='#0000FF', height=2, width=5, fo...
  • python实现UI界面化图书管理系统

    千次阅读 多人点赞 2020-12-19 13:03:10
    文章目录前言一、程序架构二、登录注册部分界面三、学生界面四.管理员界面五、总结 ...如果有想学习程序的小伙伴们,可以加我QQ,我的QQ在下面的图片中哦,欢迎各位与我交流学习 话不多说,上图!
  • 最近,QQ的办公版本——TIM进行了一次更新升级。本次更新升级大幅修改了界面的样式,看起来更加的清爽、简洁和高效了。...州的先生看到这个出自大厂的图形界面程序,不由得想用 Python 的图形界面模块来实现...
  • 最近,QQ的办公版本——TIM进行了...我看到这个出自大厂的图形界面程序,不由得想用 Python 的图形界面模块来实现一个。 在上古时代,前端开发还是被称为“切图仔”的岗位,那时候的绝佳一个练手方式就是使用手写 HT
  • 最近,QQ的办公版本——TIM进行了一次更新升级。本次更新升级大幅修改了界面的样式,看起来更加的清爽、简洁和高效了。...州的先生看到这个出自大厂的图形界面程序,不由得想用 Python 的图形界面...
  • 最近,QQ的办公版本——TIM进行了一次更新升级。本次更新升级大幅修改了界面的样式,看起来更加的清爽、简洁和高效了。...州的先生看到这个出自大厂的图形界面程序,不由得想用 Python 的图形界面模块来实现...
  • 本文实例为大家分享了python实现网页自动签到功能的具体代码,供大家参考,具体内容如下第1步、环境准备(用的chrome浏览器)1.安装selenium包pip install selenium2.下载chromedriver驱动;找到符合自己浏览器版本的...
  • 简单登陆 有些地方还未完善。 创建数据库 import sqlite3 #建一个数据库 def create_sql(): sql = sqlite3.connect("user_data.db") sql.execute("""create table if not exists %s( %s integer...
  • 一,获取QQ音乐登陆二维码
  • Python 实现简单的登录注册界面

    万次阅读 多人点赞 2019-06-07 22:01:00
    Python 实现简单的登录注册界面 注意:编写代码之前需要导入很重要的包 import tkinter as tk import pickle from tkinter import messagebox 主要实现的功能 首先在python字典里定义一对值{'admin':'...
  • python实现QQ机器人(自动登录,获取群消息,发送群消息)   版权声明: https://blog.csdn.net/zhujunxxxxx/article/details/29412297 一次偶然的机会我看见了一个群里的一个QQ号总是根据你所发的消息自动回复,...
  • 一个完整的qq登陆界面及好友列表,解压导入后可直接运行
  • Pyqt5+python2.7 美观的登陆界面制作(一) 简介 因为毕业设计中有制作界面的需要,开始学习了pyqt5,在csdn和百度上找了很多的资料,发现大多都是在讲制作登陆界面的一些逻辑上的connect,大多数的代码运行起来...
  • Python开发qq批量登陆

    2019-09-25 02:23:57
    1.打开qq软件 2.移动鼠标到qq输入处 3.在输入处,点击鼠标,输入帐号 4.模拟按下tab键,输入密码,模拟点回车登录 #coding=utf-8 import os import win32gui import win32api import win32con ...
  • 刚入学python,使用pycharm工具开发了一个注册登陆的页面,可供学习使用。将压缩包解压后放在workspace路径下,即可运行。
  • 主要介绍了Python制作一个仿QQ办公版的图形登录界面,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
  • selenium+pycharm实战,登录QQ邮箱,并发送邮件浏览器打开QQ邮箱登录网址元素定位,输入QQ账号和QQ密码元素定位,写信界面元素定位,邮件发送元素定位总结最终程序代码tips selenium+pychar...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,588
精华内容 1,835
关键字:

python实现qq登录界面

python 订阅