51Testing软件测试论坛

标题: python+selenium 自动化测试入门示例(邮件发送) [打印本页]

作者: 海鸥一飞    时间: 2018-2-7 17:41
标题: python+selenium 自动化测试入门示例(邮件发送)
        做了个测试的示例,第一写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读出来的数据是一个二维数组 所以下面
调用参数改为读取数组下标:
作者: 海鸥一飞    时间: 2018-2-7 17:43
  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文件截图:
[attach]110723[/attach]

作者: 死BEAR熊    时间: 2018-2-8 08:47
很棒
作者: 清晨一缕阳光    时间: 2018-2-8 08:53
支持分享!
作者: 死BEAR熊    时间: 2018-2-8 09:01
海鸥老师,能不能写一篇自动化测试的流程,就是从拿到需求到输出测试报告,感激不尽
作者: 微笑@开心    时间: 2018-5-9 16:07
能不能写一篇自动化测试的流程,就是从拿到需求到输出测试报告,感激不尽




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2