python webdriver 登录163邮箱发邮件加附件, 外加数据和程序分离,配置文件的方式
配置文件:UiObjectMapSendMap.ini用来存放配置信息

GetOptionSendMail.py 用来读取配信息
#encoding=utf-8
from selenium.webdriver.support.ui import WebDriverWait
import ConfigParser
import os
from selenium import webdriver
class GetOption(object):
def __init__(self):
# 获取存放页面元素定位表达方式及定位表达式的配置文件所在绝对路径
# os.path.abspath(__file__)表示获取当前文件所在路径目录
self.uiObjMapPath = os.path.dirname(os.path.abspath(__file__))\
+ "\\UiObjectMapSendMail.ini"
#print self.uiObjMapPath
def getOption(self,sectionName, optionName):
try:
# 创建一个读取配置文件的实例
cf = ConfigParser.ConfigParser()
# 将配置文件内容加载到内存
cf.read(self.uiObjMapPath)
# 根据section和option获取配置文件中的配置信息
section = cf.get(sectionName, optionName)
#print "section:",section
except Exception, e:
raise e
else:
# 当页面元素被找到后,将该页面元素对象返回给调用者
return section
if __name__ == '__main__':
getoption=GetOption()
print getoption.getOption("mailaccount","username")
test.py脚本文件,用webdriver进入邮箱发邮件的脚本
#encoding=utf-8
import unittest
import time
from GetOptionSendMail import GetOption
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException, NoSuchElementException
import traceback
class Visit163ByFirefox(unittest.TestCase):
def setUp(self):
#启动IE浏览器
self.obj=GetOption()
self.driver=webdriver.Firefox(executable_path='d:\\geckodriver')
#self.driver = webdriver.Ie(executable_path = "e:\\IEDriverServer")
def test_HandleIFrame(self):
url = "https://mail.163.com/"
# 访问自动以测试网页
self.driver.get(url)
try:
username=self.obj.getOption("mailaccount","username")
print "username:",username
password=self.obj.getOption("mailaccount","password")
print "password:",password
attachname=self.obj.getOption("attachment","directory")
print "attachname:",attachname
mailtoaddress=self.obj.getOption("mailto","address")
print "mailtoaddress:",mailtoaddress
#显示等待
wait=WebDriverWait(self.driver,15,0.2)
#切换frame
self.driver.switch_to.frame(self.driver.find_element_by_xpath("//*[@id='x-URS-iframe']"))
#self.driver.switch_to.frame("x-URS-iframe")
#显示等待获取用户名输入框元素
name=wait.until(lambda x:x.find_element_by_xpath("//*[@class='j-inputtext dlemail']"))
name.send_keys(username)
#显示等待获取密码输入框元素
passwd=wait.until(lambda x:x.find_element_by_xpath("//*[@class='j-inputtext dlpwd']"))
passwd.send_keys(password)
#登录
login=wait.until(lambda x:x.find_element_by_id("dologin"))
login.click()
#切回到默认framae
self.driver.switch_to.default_content()
#获取写信按钮元素
iwrite=wait.until(lambda x:x.find_element_by_xpath("//li[@id='_mail_component_74_74']/*[@class='oz0']"))
iwrite.click()
#获取收件人输入框元素
receiver=wait.until(lambda x:x.find_element_by_xpath("//input[@class='nui-editableAddr-ipt'and @role='combobox']"))
#receiver.click()
receiver.send_keys(mailtoaddress)
#获取主题输入框元素
theme=wait.until(lambda x:x.find_element_by_xpath("//input[@class='nui-ipt-input' and @type='text' and @maxlength='256']"))
#theme.click()
theme.send_keys(u"这是夏晓旭的第一个自动化发邮件脚本!")
#发送附件,找添加附件的元素,直接send_keys("目录")就可以,不用点击操作
attach=wait.until(lambda x:x.find_element_by_xpath("//div[@class='by0']//input[@class='O0']"))
attach.send_keys(attachname)
#切到写信内容部分的frame
self.driver.switch_to.frame(self.driver.find_element_by_xpath("//*[@class='APP-editor-iframe']"))
#获取写信区域的元素
editBox = wait.until(lambda x:x.find_element_by_xpath("/html/body"))
editBox.click()
editBox.send_keys(u'这是夏晓旭的第一个自动化发邮件脚本!')
#切回到默认frame
self.driver.switch_to.default_content()
#获取发送按钮元素
send=wait.until(lambda x:x.find_element_by_xpath("//*[@class='jp0']//*[@role='button']//*[.='发送']"))
send.click()
except TimeoutException, e:
# 捕获TimeoutException异常
print traceback.print_exc()
except NoSuchElementException, e:
# 捕获NoSuchElementException异常
print traceback.print_exc()
except Exception, e:
# 捕获其他异常
print traceback.print_exc()
if __name__ == '__main__':
unittest.main()
执行过程:找到各个元素,输入字符,添加附件

发送成功!

总结一下:
添加附件时,不是通过点击按钮,选择文件,而是找到添加附件按钮的元素,直接用send_keys("附件目录")这样来传就可以
读取配置文件的目的是实现程序和数据的分离,作用有两个:
一是方便维护所取的配置项,比如我可以把用户名和密码、邮箱地址在配置文件里随便改,程序不用动,直接去取你所配置的选项就可以了
二是可以给不懂代码逻辑的人员进行操作,不必要研究代码是怎么实现的,实现了程序和数据的隔离,方便使用
python webdriver 登录163邮箱发邮件加附件, 外加数据和程序分离,配置文件的方式的更多相关文章
- mailx加163邮箱发邮件
mailx加163邮箱发邮件 参考:https://www.cnblogs.com/myvic/p/9579954.html 配置 $ yum install mailx -y $ vim /etc/ ...
- python webdriver 登陆163邮箱给QQ邮箱发送一个邮件,显示等待
#encoding=utf-8 import unittest import time from selenium import webdriver from selenium.webdriver i ...
- 5、Selenium+Python自动登录163邮箱发送邮件
1.Selenium实现自动化,需要定位元素,以下查看163邮箱的登录元素 (1)登录(定位到登录框,登录框是一个iframe,如果没有定位到iframe,是无法定位到账号框与密码框) 定位到邮箱框( ...
- Python selenium登录163邮箱示例
思路:使用python自带的unittest单元测试框架测试163邮箱登录成功的case import unittestfrom selenium import webdriverimport tim ...
- python向多个邮箱发邮件--注意接收是垃圾邮件
群发邮件注意:三处标红的地方 # -*- coding: UTF-8 -*- import smtplib from email.mime.text import MIMEText from emai ...
- [Python爬虫] Selenium实现自动登录163邮箱和Locating Elements介绍
前三篇文章介绍了安装过程和通过Selenium实现访问Firefox浏览器并自动搜索"Eastmount"关键字及截图的功能.而这篇文章主要简单介绍如何实现自动登录163邮箱,同时 ...
- python selenium模拟登录163邮箱和QQ空间
最近在看python网络爬虫,于是我想自己写一个邮箱和QQ空间的自动登录的小程序, 下面以登录163邮箱和QQ空间和为例: 了解到在Web应用中经常会遇到frame/iframe 表单嵌套页面的应用, ...
- 【webdriver自动化】使用unittest实现自动登录163邮箱然后新建一个联系人
#练习:登录163邮箱然后新建一个联系人 import unittest import time from selenium import webdriver from selenium.webdri ...
- python+selenium实现163邮箱登陆—iframe动态ID定位 及常用定位方法
今天发现之前的登录163邮箱脚本定位不到iframe了,原因是iframe拼接了动态ID,修改后的脚本如下: from selenium import webdriver driver = webdr ...
随机推荐
- Maven(二)-- 搭建私服,上传jar
一.在setting中配置 私服的镜像,在mirrors标签中加上: <!--第一步 配置私服的镜像--> <mirror> <!--此处配置所有的构建均从私有仓库中下载 ...
- Qt5的cmake文件位置
D:\APICenter\Qt\Qt5.8.0\5.8\msvc2015\lib\cmake\Qt5\Qt5Config.cmake
- nutch爬取时Exception in thread “main” java.io.IOException: Job failed!
用cygwin运行nutch 1.2爬取提示IOException: $ bin/nutch crawl urls -dir crawl -depth 3 -topN 10 crawl started ...
- Nginx遇上Access Denied提示怎么解决
这几天在摆弄linux下面的各种服务器,对nginx非常有兴趣. 于是把phpmyadmin传上去了,先是phpmyadmin配了半天,结果配好之后发现phpmyadmin一些logo.css.js文 ...
- js中hover事件时候的BUG以及解决方法
hover事件是我们在开发前段时候遇到的稀松平常的问题,但是有没有发现会出现有一个BUg,比如,你移动到一个元素上,让它执行一个方法,然后你快速的移入移出的时候,他会进行亮瞎你眼睛的频闪效果,而且跟得 ...
- 《C++ Primer Plus》第9章 内存模型和名称空间 学习笔记
C++鼓励程序员在开发程序时使用多个文件.一种有效的组织策略是,使用头文件来定义用户类型,为操纵用户类型的函数提供函数原型,并将函数定义放在一个独立的源代码文件中.头文件和源代码文件一起定义和实现了用 ...
- 学习JQuery - 10
第四章 Styling and Animating 1. 使用内联属性修改CSS 我们知道HTML在onload时会读取css的各项值. 那么,我们能不能在之后的操作中改变css值呢? 答案是肯定的! ...
- OpenGL ES2学习笔记(6)-- Line Strip和Line Loop
Line Strip 上一篇文章画了两条线段,但是用了4个点.如果几条线段首尾相接的话,可以让OpenGL把他们当成Line Strip来画,这样就可以用n+1个点来画n条线段. 代码 import ...
- 关于Java中按值传递和按引用传递的问题详解
写了两个方法,一个是多关键字的快速排序,一个是基于多关键字的基速排序.两个方法的参数列表是一样一样的,但是快速排序正常工作,但是基数排序传出来的参数一点没有改变,苦思冥想了半天也没想通是怎么回事,于是 ...
- Windows Phone 自定义一个启动画面
1.新建一个UserControl <UserControl x:Class="LoadingPage.PopupSplash" xmlns="http://sch ...