51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 2010|回复: 5
打印 上一主题 下一主题

python+selenium 自动化测试入门示例(邮件发送)

[复制链接]
  • TA的每日心情
    无聊
    2024-9-27 10:07
  • 签到天数: 62 天

    连续签到: 1 天

    [LV.6]测试旅长

    跳转到指定楼层
    1#
    发表于 2018-2-7 17:41:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
            做了个测试的示例,第一写python,有很多问题还请高人指教
    首先需要安装python

    进入命令行 输入python –version 查看python版本,没有没有安装的话,建议安装python3.x版本,
    从2.x到3.x改动很大,下载地址和安装方法百度一下很多

    1、安装selenium,再命令行执行 python -m pip install selenium  

    若安装成功之后,在命令行执行 python -m pydoc -p 8888   (-p 是指定端口号)  

    访问http://127.0.0.1:8888 在页面的最下面site-packages 一栏 会多出一个selenium项,

    当前python下安装的包和api都能在这边查得到



    2、本示例是以谷歌浏览操作的(其他浏览器大同小异),下载chromdriver驱动,驱动包放在python根目录下



    3、接下来开始进入正题

    1) 首先得了解邮件发送的步骤,

    第一步:打开浏览器,调到登录页面,输入账号密码并登录;

    第二部:点击写邮件,输入地址、标题和内容,并发送;

    第三部:关闭浏览器;

    2) 打开浏览器并调到登录页面:

    创建main.py文件并写入
    1. # coding = utf-8  
    2.   
    3. from selenium import webdriver   
    4.   
    5. driver = webdriver.Chrome()  
    6. driver.maximize_window() #浏览器最大化  
    7. url = 'http://qiye.163.com/login/'  
    8. driver.get(url)  
    9. [python] view plain copy
    10. driver.find_element_by_id('accname').clear()  
    11. driver.find_element_by_id('accname').send_keys('123456@qq.com')  
    12. driver.find_element_by_id('accpwd').clear()  
    13. driver.find_element_by_id('accpwd').send_keys('123456')  
    14. driver.find_element_by_xpath('/html/body/section/div/div/div[2]/div[2]/form[1]/div[4]/button').click()  
    15. time.sleep(3)  
    复制代码
            点击写邮件,输入地址、标题和内容,并发送:

    再main.py文件开头引入依赖的包
    1. from selenium.common.exceptions import NoSuchElementException  
    2. [python] view plain copy
    3. from selenium.webdriver.common.keys import Keys  
    4. import time  
    复制代码
           并将下面代码写在后面
    1. driver.switch_to.frame('folder') #切换到iframe  
    2. driver.find_element_by_xpath('/html/body/div/div/div/table/tbody/tr[1]/td/h1/a[2]').click() #点击写信按钮  
    3. driver.switch_to.default_content() #切到主文档  
    4. driver.switch_to.frame('foldmain') #切换到另一个iframe  
    5. driver.find_element_by_xpath('//*[@id="oDivTo"]/div[1]/input').send_keys('123456@qq.com') #输入地址  
    6. driver.find_element_by_xpath('//*[@id="subject"]').send_keys('这是测试标题')   #输入标题  
    7. driver.switch_to.frame('editor')  
    8. driver.switch_to.frame('HtmlEditor') #找到内容区的webdriver  
    9. driver.find_element_by_xpath('/html/body').send_keys('这是测试内容') #输入内容  
    10. driver.switch_to.default_content() #切到主文档  
    11. driver.switch_to.frame('foldmain') #切换到外层webdriver  
    12. driver.find_element_by_xpath('//*[@id="oSendButton2"]').click() #点击发送  
    13. driver.switch_to.default_content() #切到主文档  
    14. time.sleep(1)  
    复制代码
            关闭浏览器:
    1. driver.close()  
    复制代码
         完整的main.py文件:
    1. # coding = utf-8  
    2. from selenium import webdriver  
    3. from selenium.webdriver.common.keys import Keys  
    4. from selenium.common.exceptions import NoSuchElementException  
    5. import time  
    6. driver = webdriver.Chrome()  
    7. driver.maximize_window() #浏览器最大化  
    8. #跳转登录页并登录  
    9. url = 'http://qiye.163.com/login/'  
    10. driver.get(url)  
    11. driver.find_element_by_id('accname').clear()  
    12. driver.find_element_by_id('accname').send_keys('123456@qq.com')  
    13. driver.find_element_by_id('accpwd').clear()  
    14. driver.find_element_by_id('accpwd').send_keys('123456')  
    15. driver.find_element_by_xpath('/html/body/section/div/div/div[2]/div[2]/form[1]/div[4]/button').click()  
    16. time.sleep(3)  
    17. #填写地址标题内容等并发送  
    18. driver.switch_to.frame('folder') #切换到iframe  
    19. driver.find_element_by_xpath('/html/body/div/div/div/table/tbody/tr[1]/td/h1/a[2]').click() #点击写信按钮  
    20. driver.switch_to.default_content() #切到主文档  
    21. driver.switch_to.frame('foldmain') #切换到另一个iframe  
    22. driver.find_element_by_xpath('//*[@id="oDivTo"]/div[1]/input').send_keys('123456@qq.com') #输入地址  
    23. driver.find_element_by_xpath('//*[@id="subject"]').send_keys('这是测试标题')   #输入标题  
    24. driver.switch_to.frame('editor')  
    25. driver.switch_to.frame('HtmlEditor') #找到内容区的webdriver  
    26. driver.find_element_by_xpath('/html/body').send_keys('这是测试内容') #输入内容  
    27. driver.switch_to.default_content() #切到主文档  
    28. driver.switch_to.frame('foldmain') #切换到外层webdriver  
    29. driver.find_element_by_xpath('//*[@id="oSendButton2"]').click() #点击发送  
    30. driver.switch_to.default_content() #切到主文档  
    31. time.sleep(1)  
    32.   
    33. #关闭浏览器  
    34. driver.close()  
    复制代码
           写到这里也算一个流程写完了,但是这里发送信息都是写死了而且代码写的很臃肿;
    下面我数据来源改为从读取文件,代码模块化提高代码的重用性;
    首先我们把登录模块单独提出来写在login.py文件里:
    1. #coding=utf-8  
    2. from selenium import webdriver  
    3. from selenium.common.exceptions import NoSuchElementException  
    4. import time  
    5.   
    6. def login(driver):  
    7.     driver.maximize_window() #浏览器最大化  
    8.     url = 'http://qiye.163.com/login/'  
    9.     driver.get(url)  
    10.     driver.find_element_by_id('accname').clear()  
    11.     driver.find_element_by_id('accname').send_keys('123456@qq.com')  
    12.     driver.find_element_by_id('accpwd').clear()  
    13.     driver.find_element_by_id('accpwd').send_keys('123456')  
    14.     driver.find_element_by_xpath('/html/body/section/div/div/div[2]/div[2]/form[1]/div[4]/button').click()  
    15.     time.sleep(3)  
    复制代码
           将发送模块单独提出来写在send.py文件里:
    1. #coding=utf-8  
    2. from selenium import webdriver  
    3. from selenium.common.exceptions import NoSuchElementException  
    4. import time  
    5.   
    6. def send(driver,datarow):  
    7.     driver.switch_to.frame('folder') #切换到iframe  
    8.     driver.find_element_by_xpath('/html/body/div/div/div/table/tbody/tr[1]/td/h1/a[2]').click() #点击写信按钮  
    9.     driver.switch_to.default_content() #切到主文档  
    10.     driver.switch_to.frame('foldmain') #切换到另一个iframe  
    11.     driver.find_element_by_xpath('//*[@id="oDivTo"]/div[1]/input').send_keys('123456@qq.com') #输入地址  
    12.     driver.find_element_by_xpath('//*[@id="subject"]').send_keys('这是测试标题')   #输入标题  
    13.     driver.switch_to.frame('editor')  
    14.     driver.switch_to.frame('HtmlEditor') #找到内容区的webdriver  
    15.     driver.find_element_by_xpath('/html/body').send_keys('这是测试内容') #输入内容  
    16.     driver.switch_to.default_content() #切到主文档  
    17.     driver.switch_to.frame('foldmain') #切换到外层webdriver  
    18.     driver.find_element_by_xpath('//*[@id="oSendButton2"]').click() #点击发送  
    19.     driver.switch_to.default_content() #切到主文档  
    20.     time.sleep(1)  
    复制代码
             将退出方法写在了login.py文件里,login.py文件内容如下:
    1. #coding=utf-8  
    2. from selenium import webdriver  
    3. from selenium.common.exceptions import NoSuchElementException  
    4. import time  
    5.   
    6. def login(driver):  
    7.     driver.maximize_window() #浏览器最大化  
    8.     url = 'http://qiye.163.com/login/'  
    9.     driver.get(url)  
    10.     driver.find_element_by_id('accname').clear()  
    11.     driver.find_element_by_id('accname').send_keys('123456@qq.com')  
    12.     driver.find_element_by_id('accpwd').clear()  
    13.     driver.find_element_by_id('accpwd').send_keys('123456')  
    14.     driver.find_element_by_xpath('/html/body/section/div/div/div[2]/div[2]/form[1]/div[4]/button').click()  
    15.     time.sleep(3)  
    16.   
    17. def loginout(driver):  
    18.     driver.close()  
    复制代码
          将这两模块提出来之后main.py只是引用和调用:
    1. # coding = utf-8  
    2.   
    3. from selenium import webdriver  
    4. from selenium.webdriver.common.keys import Keys  
    5. from selenium.common.exceptions import NoSuchElementException  
    6. import time,login,send  
    7.   
    8. driver = webdriver.Chrome()  
    9. login.login(driver)  
    10. send.send(driver)  
    11.   
    12. time.sleep(3)  
    13. login.loginout(driver)  
    复制代码
        将login和send模块引入
    这里说明下,调用方法必须要传入webdriver对象传入


    到这里我们就已经将代码模块化了,接下来我们再见发送文本从文件中读取:
    这里我们用的python里面csv模块读取文件
    将excel文件保存为emails.csv 格式为csv

           csv模块能将文件每行读取为二维数组,方便后面调用
          将main.py修改为:
    1. # coding = utf-8  
    2.   
    3. from selenium import webdriver  
    4. from selenium.webdriver.common.keys import Keys  
    5. from selenium.common.exceptions import NoSuchElementException  
    6. import time,login,send,csv,os  
    7.   
    8. driver = webdriver.Chrome()  
    9. login.login(driver)  
    10.   
    11. filename = os.path.dirname(os.sys.argv[0])+'\\emails.csv' #csv文件路径  
    12. print(filename)  
    13. data = []  
    14. try:  
    15.     with open(filename) as f:  
    16.         reader = csv.reader(f)  
    17.         header = next(reader)  
    18.         data = [row for row in reader]  
    19. except csv.Error as e:  
    20.     print("Error reading CSV file at line %s: %s"%(reader.line_num, e))  
    21.   
    22. if header:  
    23.     print(header)  
    24.     print("=====================")  
    25. for datarow in data:  
    26.     send.send(driver,datarow) #遍历发送邮件  
    27.   
    28. time.sleep(3)  
    29. login.loginout(driver)  
    复制代码
            从emails.csv读出数据 遍历 调用send方法  并将遍历当前对象传送给send方法


    当然,相应的send.py的send方法也得需要修改,上面说过csv读出来的数据是一个二维数组 所以下面
    调用参数改为读取数组下标:
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏2
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2024-9-27 10:07
  • 签到天数: 62 天

    连续签到: 1 天

    [LV.6]测试旅长

    2#
     楼主| 发表于 2018-2-7 17:43:44 | 只看该作者
    1. #coding=utf-8  
    2. from selenium import webdriver  
    3. from selenium.common.exceptions import NoSuchElementException  
    4. import time  
    5.   
    6. def send(driver,datarow):  
    7.     driver.switch_to.frame('folder') #切换到iframe  
    8.     driver.find_element_by_xpath('/html/body/div/div/div/table/tbody/tr[1]/td/h1/a[2]').click() #点击写信按钮  
    9.     driver.switch_to.default_content() #切到主文档  
    10.     driver.switch_to.frame('foldmain') #切换到另一个iframe  
    11.     driver.find_element_by_xpath('//*[@id="oDivTo"]/div[1]/input').send_keys(datarow[0]) #输入地址  
    12.     driver.find_element_by_xpath('//*[@id="subject"]').send_keys(datarow[1])   #输入标题  
    13.     driver.switch_to.frame('editor')  
    14.     driver.switch_to.frame('HtmlEditor') #找到内容区的webdriver  
    15.     driver.find_element_by_xpath('/html/body').send_keys(datarow[2]) #输入内容  
    16.     driver.switch_to.default_content() #切到主文档  
    17.     driver.switch_to.frame('foldmain') #切换到外层webdriver  
    18.     driver.find_element_by_xpath('//*[@id="oSendButton2"]').click() #点击发送  
    19.     driver.switch_to.default_content() #切到主文档  
    20.     time.sleep(1)  
    复制代码
       
    到这里就算所有的都完成了,最后在将最终的文件展示出来
    主函数main.py:
    1. # coding = utf-8  
    2.   
    3. from selenium import webdriver  
    4. from selenium.webdriver.common.keys import Keys  
    5. from selenium.common.exceptions import NoSuchElementException  
    6. import time,login,send,csv,os  
    7.   
    8. driver = webdriver.Chrome()  
    9. login.login(driver)  
    10.   
    11. filename = os.path.dirname(os.sys.argv[0])+'\\emails.csv' #csv文件路径  
    12. print(filename)  
    13. data = []  
    14. try:  
    15.     with open(filename) as f:  
    16.         reader = csv.reader(f)  
    17.         header = next(reader)  
    18.         data = [row for row in reader]  
    19. except csv.Error as e:  
    20.     print("Error reading CSV file at line %s: %s"%(reader.line_num, e))  
    21.   
    22. if header:  
    23.     print(header)  
    24.     print("=====================")  
    25. for datarow in data:  
    26.     send.send(driver,datarow) #遍历发送邮件  
    27.   
    28. time.sleep(3)  
    29. login.loginout(driver)  
    复制代码
    登录模块login.py:
    1. #coding=utf-8  
    2. from selenium import webdriver  
    3. from selenium.common.exceptions import NoSuchElementException  
    4. import time  
    5.   
    6. def login(driver):  
    7.     driver.maximize_window() #浏览器最大化  
    8.     url = 'http://qiye.163.com/login/'  
    9.     driver.get(url)  
    10.     driver.find_element_by_id('accname').clear()  
    11.     driver.find_element_by_id('accname').send_keys('123456@qq.com')  
    12.     driver.find_element_by_id('accpwd').clear()  
    13.     driver.find_element_by_id('accpwd').send_keys('123456')  
    14.     driver.find_element_by_xpath('/html/body/section/div/div/div[2]/div[2]/form[1]/div[4]/button').click()  
    15.     time.sleep(3)  
    16.   
    17. def loginout(driver):  
    18.     driver.close()  
    复制代码
          发送邮件send.py:
    1. #coding=utf-8  
    2. from selenium import webdriver  
    3. from selenium.common.exceptions import NoSuchElementException  
    4. import time  
    5.   
    6. def send(driver,datarow):  
    7.     driver.switch_to.frame('folder') #切换到iframe  
    8.     driver.find_element_by_xpath('/html/body/div/div/div/table/tbody/tr[1]/td/h1/a[2]').click() #点击写信按钮  
    9.     driver.switch_to.default_content() #切到主文档  
    10.     driver.switch_to.frame('foldmain') #切换到另一个iframe  
    11.     driver.find_element_by_xpath('//*[@id="oDivTo"]/div[1]/input').send_keys(datarow[0]) #输入地址  
    12.     driver.find_element_by_xpath('//*[@id="subject"]').send_keys(datarow[1])   #输入标题  
    13.     driver.switch_to.frame('editor')  
    14.     driver.switch_to.frame('HtmlEditor') #找到内容区的webdriver  
    15.     driver.find_element_by_xpath('/html/body').send_keys(datarow[2]) #输入内容  
    16.     driver.switch_to.default_content() #切到主文档  
    17.     driver.switch_to.frame('foldmain') #切换到外层webdriver  
    18.     driver.find_element_by_xpath('//*[@id="oSendButton2"]').click() #点击发送  
    19.     driver.switch_to.default_content() #切到主文档  
    20.     time.sleep(1)
    复制代码
        emails.csv文件截图:

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-2-6 14:59
  • 签到天数: 4 天

    连续签到: 1 天

    [LV.2]测试排长

    5#
    发表于 2018-2-8 09:01:59 来自手机 | 只看该作者
    海鸥老师,能不能写一篇自动化测试的流程,就是从拿到需求到输出测试报告,感激不尽
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2018-5-24 15:01
  • 签到天数: 27 天

    连续签到: 1 天

    [LV.4]测试营长

    6#
    发表于 2018-5-9 16:07:06 | 只看该作者
    能不能写一篇自动化测试的流程,就是从拿到需求到输出测试报告,感激不尽
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-18 00:38 , Processed in 0.068308 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表