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 ...
随机推荐
- 全面解析Linux 内核 3.10.x - 如何开始
万事开头难 - 如何开始? 人总是对未知的事物充满恐惧!就像航海一样,在面对危难的时候,船员和船长是一样心中充满恐惧的!只是船员始终充满恐惧,而船长却能压抑恐惧并从当前找出突破口! 我没有船长之能,但 ...
- SuperSlide——再次接触
原来自己很早之前就接触过SuperSlider这个神奇的插件,原谅自己又得了“健忘症”,因此昨天就把自己“坑”了一把: 前言: 交易一期的项目即将上线,在解决测试同事们提出的bug的时候,无意间看到页 ...
- MySQL建表字段类型
1.数据库:在MySQL中,要存储数据,必须从数据库开始,因此首先要创建数据库,但由于学校的MySQL服务器对学生数据帐号有限止,学生不得创建数据库,故每个学生的帐号中已事先由信息中心为大家建立了一个 ...
- cocos2dx游戏--欢欢英雄传说--添加触摸响应
主要的调整就是将HelloWorldScene改成了MainSecne,然后将Player作为了MainScene的私有成员变量来处理.修改了人物图片,使用了网上找到的三国战纪的人物素材代替我之前画的 ...
- 【CSS系列】布局篇
一.让设计居中 1.使用自动空白边让设计居中 <style type="text/css"> body{ text-align:center; min-width:76 ...
- CRUX下实现进程隐藏(3)
通过一个内核模块拦截文件系统的回调函数来实现进程隐藏. VFS(Virtual File System)是Linux在实际文件系统(如ext3,ext4,vfat等)上抽象出的一个文件系统模型,简单来 ...
- 配置项目使用weblogic的JNDI数据源
项目结构构:Spring Framework + SpirngMVC + SpringData JPA + Maven 1.在weblogic的控制台界面中配置数据源(假定我们配置的数据源的名称为da ...
- 【BZOJ1630/2023】[Usaco2007 Demo]Ant Counting DP
[BZOJ1630/2023][Usaco2007 Demo]Ant Counting 题意:T中蚂蚁,一共A只,同种蚂蚁认为是相同的,有一群蚂蚁要出行,个数不少于S,不大于B,求总方案数 题解:DP ...
- jfinal关联查询给dto添加表结构以外的字段并返回的处理方式
官网栗子: http://www.jfinal.com/doc/5-10 5.10 表关联操作 JFinal ActiveRecord 天然支持表关联操作,并不需要学习新的东西,此为无招胜有招.表关联 ...
- ASP.NET的页面执行过程
对于ASP.NET来说,用户访问的页面,都由服务器IIS处理,具体的处理过程如下图: 对于用户模块还是有很多的东西没有写,未完待续...