Tips : 命令行中退出python编辑: exit()
pip list 查看已经安装的包
from selenium.webdriver.common.action_chains import ActionChains #引入鼠标相关的操作
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys #键盘相关事件
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
import unittest,time,request,os,calendar,logging,csv
# 单元测试,强制等待时间,抓取网页,系统相关,时间日期相关,日志相关,excle表单相关
# import win32gui,win32con,tesseract #验证码识别相关
from selenium import webdriver
from chardet import detect
from time import sleep
driver = brow = browser = webdriver.Ie()
2.字符转换,编码
#coding=utf-8 #编辑器格式utf-8
reload(sys)
sys.setdefaultencoding("utf-8") #设置python默认编码格式为utf-8
csvfile = file(log_file, 'wb')
csvfile.write(codecs.BOM_UTF8) #设置写入的支持中文
for Eachline in fin:
spoken = Eachline.strip().decode('gbk', 'utf-8') #读取的utf-8转换为gbk
3.定时启动程序
SECONDS_PER_DAY = 24 * 60 * 60
def doFirst():
from datetime import datetime, timedelta
curTime = datetime.now()
desTime = curTime.replace(hour=2, minute=0, second=0, microsecond=0)
delta = curTime - desTime
skipSeconds = SECONDS_PER_DAY - delta.total_seconds()
print "Must sleep %d seconds" % skipSeconds
return skipSeconds
def doFunc():
print "do Function..."
4.定位元素需注意的问题:
a.时间不够,采用两种方式(self.implicitly_wait(30),sleep(2))
b.函数嵌套(<iframe></iframe>),层级定位,switch_to.frame
5.时间,日期相关的操作
print time.time()
print calendar.month(2016,10)
print time.clock()
ctime()
6.使用unittest框架
from appium import webdriver
import unittest
import HTMLTestRunner
class elementA(unittest.TestCase):
def test_(self):
desired_caps = {}
desired_caps['deviceName'] = 'S85P5DJJJNFATO4L' # adb devices查到的设备名
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '23'
desired_caps['appPackage'] = 'com.cmbchina.ccd.pluto.cmbActivity' # 被测App的包名
desired_caps['appActivity'] = '.SplashActivity ' # 启动时的Activity
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
driver.quit()
if __name__ == '__main__':
testunit = unittest.TestSuite() # 定义一个单元测试容器
testunit.addTest(elementA("test_")) # 将测试用例加入到测试容器中
filename = "./myAppiumLog.html" # 定义个报告存放路径,支持相对路径。
fp = file(filename, 'wb')
runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title='Report_title',description='Report_description')
# 使用HTMLTestRunner配置参数,输出报告路径、报告标题、描述
runner.run(testunit) # 自动进行测试
suite = unittest.TestSuite()
suite.addTest(RanzhiTest("test_login"))
suite.addTest(RanzhiTest("test_ranzhi"))
runner = unittest.TextTestRunner()
runner.run(suite)
7.键盘事件
# send_keys(Keys.BACK_SPACE) 删除键(BackSpace)
# send_keys(Keys.SPACE) 空格键(Space)
# send_keys(Keys.TAB) 制表键(Tab)
# send_keys(Keys.ESCAPE) 回退键(Esc)
# send_keys(Keys.ENTER) 回车键(Enter)
# send_keys(Keys.CONTROL,'a') 全选(Ctrl+A)
# send_keys(Keys.CONTROL,'c') 复制(Ctrl+C)
# send_keys(Keys.CONTROL,'x') 剪切(Ctrl+X)
# send_keys(Keys.CONTROL,'v') 粘贴(Ctrl+V)
text = brow.find_element_by_id("cp").text # 获取元素的文本
title = driver.title #获取当前页面title
size=brow.find_element_by_id("kw").size # 返回元素尺寸
attribute=brow.find_element_by_id("kw").get_attribute('type') # 属性值
result=brow.find_element_by_id("kw").is_displayed() # 设置该元素是否用户可见
driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)
driver.find_element_by_id("id").send_keys(Keys.TAB)
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')
driver.find_element_by_id("su").send_keys(Keys.ENTER)
# actionchains类鼠标操作的常用方法
# content_click() # 右击
# double_click() # 双击
# drag_and_drop(source,target) # 拖动
# content_click() # 鼠标悬停在一个元素上
# click_and_hold() # 按下鼠标左键在一个元素
8.鼠标相关的操作
#定位到要右击的元素
right =driver.find_element_by_xpath("xx")
ActionChains(driver).context_click(right).perform() #对定位到的元素执行鼠标右键操作
element = brow.find_element_by_name("xxx") #定位元素的原位置
target = brow.find_element_by_name("xxx") #定位元素要移动到的目标位置
ActionChains(driver).drag_and_drop(element,target).perform() #执行元素的移动操作
above = driver.find_element_by_xpath("xxx") #定位到鼠标移动到上面的元素
ActionChains(driver).move_to_element(above).perform() #对定位到的元素执行鼠标移动到上面的操作
left=driver.find_element_by_xpath("xxx")
ActionChains(driver).click_and_hold(left).perform() #对定位到的元素执行鼠标左键按下的操作
9.设置等待时间
# sleep() 设置固定休眠时间
# implicitly_wait() 超时等待时间
# WebDriverWait() 默认每隔一段时间检测当前页面元素是否存在,如果超时,抛出异常
# WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
# driver - WebDriver 的驱动程序(Ie, Firefox, Chrome 或远程)
# timeout - 最长超时时间,默认以秒为单位
# poll_frequency - 休眠时间的间隔(步长)时间,默认为0.5 秒
# ignored_exceptions - 超时后的异常信息,默认情况下抛NoSuchElementException 异常。
from selenium.webdriver.support.ui import WebDriverWait
element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id("someID"))
is_disappeared = WebDriverWait(driver, 30, 1, "ElementNotVisibleException").until_not(lambda x: x.find_element_by_id("someID").is_displayed())
# 或者until(method, message=’ ’)
10.定位一组对象
# 批量操作对象,比如将页面上所有的checkbox都勾上
# 先获取一组对象,再在这组对象中过滤出需要具体定位的一些对象,比如定位出页面上的checkbox,然后选择一个
driver = webdriver.Firefox()
file_path = 'file:///' + os.path.abspath('checkbox.html') #调用本地的html测试文件
driver.get(file_path)
# 选择页面上所有的tag name 为input 的元素
inputs = driver.find_elements_by_tag_name('input')
for input in inputs:
if input.get_attribute('type') == 'checkbox':
input.click()
11.层级定位
#点击Link1 链接(弹出下拉列表)
driver.find_element_by_link_text('Link1').click()
#在父亲元件下找到link 为Action 的子元素
menu =driver.find_element_by_id('dropdown1').find_element_by_link_text('Another_action')
#鼠标移动到子元素上
ActionChains(driver).move_to_element(menu).perform()
#定位frame中的对象
# 百度中的登录链接—登录页面
#通过二次定位找到用户名输入框,两次定位
div=driver.find_element_by_class_name("tang-content").find_element_by_name("userName")
div.send_keys("username")
#下拉框的处理
# 下拉框是鼠标放上去就弹出的,我们使用move_to_element()进行操作
对下拉列表定位采用select标签
# 选择部门
dp =self.driver.find_element_by_id('dept')
Select(dp).select_by_index(user['dept'])
# 选择角色
Select(self.driver.find_element_by_id('role')).select_by_index(user['role'])
12.窗口的切换
nowhandle=driver.current_window_handle #获得当前窗口
allhandles=driver.window_handles #获得所有窗口
for handle in allhandles: #循环判断窗口是否为当前窗口
if handle != nowhandle:
driver.switch_to_window(handle)
print 'now register window!'
browser.switch_to_window(browser.window_handles[0]) #第一个窗口
browser.switch_to_window(browser.window_handles[1]) #第二个窗口
13.alert/confirm/prompt 处理
# javascript所生成的alert\confirm以及prompt处理思路,使用switch_to.alert()方法定位到alert/confirm/prompt
# 然后使用text/confirm/dismiss/send_keys
# text 返回alert/confirm/prompt中的文字信息
# accept 点击确认按钮
# dismiss 点击取消按钮,如果有的话
# send_keys 输入值,这个alert/confirm没有对话框就不能用
#获取网页上的警告信息
alert=driver.switch_to_alert()
#接收警告信息
alert.accept()
14.分页处理:
1.获取总页数 2.翻页操作
#获取所有分页的数量,并打印
total_pages=len(driver.find_element_by_tag_name("select").find_elements_by_tag_name("option"))
print "total page is %s" %(total_pages)
sleep(3)
#再次获取所分页,并执行循环翻页操作
pages=driver.find_element_by_tag_name("select").find_elements_by_tag_name("option")
for page in pages:
page.click()
sleep(2)
15.文件下载
# 识别自动文件的下载类型可以使用curl,curl 是利用URL 语法在命令行方式下工作的开源文件传输工具。
import request
print request.head("http://www.python.org").headers["content-type"]
fp = webdriver.FirefoxProfile()
fp.set_preference("browser.download.folderList",2)
fp.set_preference("browser.download.manager.showWhenStarting",False)
fp.set_preference("browser.download.dir", os.getcwd()) #用于指定你所下载的文件的目录
fp.set_preference("browser.helperApps.neverAsk.saveToDisk","application/octet-stream") #内容类型
browser = webdriver.Firefox(firefox_profile=fp)
browser.get("http://pypi.python.org/pypi/selenium")
browser.find_element_by_partial_link_text("selenium-2").click()
16.文件的逐行读取与文件写入
source = open("D:\\source.txt","rb")
values = source.readlines()
for search in values:
print search
fin = open("test.txt","r+") #打开发话文文件txt格式
logging.basicConfig(filename="spokendialog.txt", filemode='w', level=logging.INFO) #设置log文件基本属性
for Eachline in fin:
spoken = Eachline.strip().decode('gbk', 'utf-8')
reader = csv.DictReader(open("test.csv","r+"))
--------------------------------------------------------------------------------------------
import os
os.rename("wenben.txt","shuaiqi.txt")
os.mkdir("happy")
os.rmdir("happy")
try:
fh = open("testfile", "w")
fh.write(codecs.BOM_UTF8)防止写入的文字乱码
writer.writerow(['発話文例', '応答文']) csv文件
data=[]
data.append((column_0 ,column_1))
writer.writerows(data)
fh.write("这是一个测试文件,用于测试异常!!" + "\n")
fh.write("这是一个测试文件,用于测试异常!!" + "\n")
fh.writelines("今天天气非常好啦啦啦" + "\n")
fh.writelines("今天天气非常好O(∩_∩)O" + "\n")
except IOError:
print "Error: 没有找到文件或读取文件失败"
else:
print "内容写入文件成功"
fh.close()
17.调用javascripts
# webdriver 提供了execute_script() 接口用来调用js代码。
# execute_script(script, *args)在当前窗口/框架同步执行javaScript,script:JavaScript 的执行。*args:适用任何JavaScript 脚本。
# 执行js的两种场景:一种是在页面上直接执行js,另一种是在某个已经定位的元素上执行js
#隐藏文字信息
driver.execute_script('$("#tooltip").fadeOut();')
time.sleep(5)
#隐藏按钮:
button = driver.find_element_by_class_name('btn')
driver.execute_script('$(arguments[0]).fadeOut()',button)
time.sleep(5)
#控制浏览器滚动条
# 使用滚动条的两个场景:1.判断用户是否阅读完成:滚动条是否拉到最下方2.操作元素不在视觉范围内
# <body οnlοad= "document.body.scrollTop=0 "> 滚动条在最下方
# <body οnlοad= "document.body.scrollTop=100000 "> 滚动条在最上方
#将页面滚动条拖到底部
js="var q=document.documentElement.scrollTop=10000"
driver.execute_script(js)
time.sleep(3)
18.cookie处理
# webdriver 操作cookie 的方法有:
# l get_cookies() 获得所有cookie 信息
# l get_cookie(name) 返回特定name 有cookie 信息
# l add_cookie(cookie_dict) 添加cookie,必须有name 和value 值
# l delete_cookie(name) 删除特定(部分)的cookie 信息
# l delete_all_cookies() 删除所有cookie 信息
# 获得cookie 信息
cookie= driver.get_cookies()
#将获得cookie 的信息打印
print cookie
19.验证码的问题:
# 1.去掉验证码 2.万能验证码 3.验证码识别技术4.记录cookie
# 验证码识别技术:python-tesseract 是光学字符识别,能够读取图片文件(JPG,GIF,PNG,TIFF等)
#add_cookie可能不太好用
#访问xxxx 网站
driver.get("http://www.xxxx.cn/")
#将用户名密码写入浏览器cookie
driver.add_cookie({'name':'Login_UserNumber', 'value':'username'})
driver.add_cookie({'name':'Login_Passwd', 'value':'password'})
#再次访问xxxx 网站,将会自动登录
driver.get("http://www.xxxx.cn/")
time.sleep(3)
from PIL import image
import pytesseract
image_to_string(Image.open('test.png'),lang="eng" config="-psm 7"
20.文件上传
# 1.input标签
upload = driver.find_element_by_id("file")
upload.send_keys("test.py") #send_keys
print upload.get_attribute("value") #check value
#2.非input标签
# 1.autoIT,借助外力,我们去调用其生成的au3或exe文件。
# 2.Python pywin32库,识别对话框句柄,进而操作
# 3.SendKeys库
# 4.keybd_event,跟3类似,不过是模拟按键,ctrl+a,ctrl+c, ctrl+v…
21.日志
logging.info("写入的东西,回自动换行")
logging.basicConfig(filename=log_file, filemode='w', level=logging.INFO) #设置log文件基本属性
22.python
23.python MYSQL
引入 API 模块。
获取与数据库的连接。
执行SQL语句和存储过程。
关闭数据库连接。
Python 标准数据库接口为 Python DB-API
二进制的安装:
$ gunzip MySQL-python-1.2.2.tar.gz
$ tar -xvf MySQL-python-1.2.2.tar
$ cd MySQL-python-1.2.2
$ python setup.py build
$ python setup.py install
fetchone(): 该方法获取下一个查询结果集。结果集是一个对象
fetchall():接收全部的返回结果行.
rowcount: 这是一个只读属性,并返回执行execute()方法后影响的行数。
原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性(durability)。持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import mysql
import MySQLdb
# 打开数据库连接.分别是数据库地址,用户名,密码,数据库名称
db = MySQLdb.connect("localhost","root","intern","mysql" )
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# 使用execute方法执行SQL语句
cursor.execute("SELECT VERSION()")
# 使用 fetchone() 方法获取一条数据库。
data = cursor.fetchone()
print "Database version : %s " % data
# SQL 查询语句
cursor.execute("SELECT * FROM EMPLOYEE WHERE INCOME > '%d'" % (1000))
# 获取所有记录列表
results = cursor.fetchall()
for row in results:
fname = row[0]
lname = row[1]
age = row[2]
sex = row[3]
income = row[4]
# 打印结果
print "fname=%s,lname=%s,age=%d,sex=%s,income=%d" % (fname, lname, age, sex, income )
# SQL 插入语句
sql = "INSERT INTO EMPLOYEE(FIRST_NAME,LAST_NAME, AGE, SEX, INCOME)VALUES ('%s', '%s', '%d', '%c', '%d' )" % ('Mac', 'Mohan', 20, 'M', 2000)
# SQL 更新语句
# sql = "UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = '%c'" % ('M')
# SQL 删除语句
# sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20)
try:
# 执行sql语句
cursor.execute(sql)
# 提交到数据库执行
db.commit()
except:
# 发生错误时回滚
db.rollback()
# 如果数据表已经存在使用 execute() 方法删除表。
cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")
# 关闭数据库连接
db.close()
错误处理:
DB API中定义了一些数据库操作的错误及异常,下表列出了这些错误和异常:
异常 | 描述 |
Warning | 当有严重警告时触发,例如插入数据是被截断等等。必须是 StandardError 的子类。 |
Error | 警告以外所有其他错误类。必须是 StandardError 的子类。 |
InterfaceError | 当有数据库接口模块本身的错误(而不是数据库的错误)发生时触发。 必须是Error的子类。 |
DatabaseError | 和数据库有关的错误发生时触发。 必须是Error的子类。 |
DataError | 当有数据处理时的错误发生时触发,例如:除零错误,数据超范围等等。 必须是DatabaseError的子类。 |
OperationalError | 指非用户控制的,而是操作数据库时发生的错误。例如:连接意外断开、 数据库名未找到、事务处理失败、内存分配错误等等操作数据库是发生的错误。 必须是DatabaseError的子类。 |
IntegrityError | 完整性相关的错误,例如外键检查失败等。必须是DatabaseError子类。 |
InternalError | 数据库的内部错误,例如游标(cursor)失效了、事务同步失败等等。 必须是DatabaseError子类。 |
ProgrammingError | 程序错误,例如数据表(table)没找到或已存在、SQL语句语法错误、 参数数量错误等等。必须是DatabaseError的子类。 |
NotSupportedError | 不支持错误,指使用了数据库不支持的函数或API等。例如在连接对象上 使用.rollback()函数,然而数据库并不支持事务或者事务已关闭。 必须是DatabaseError的子类。 |
23.网络编程socket
两个级别的网络服务:
1.BSD Sockets API,可以访问底层操作系统的socket接口的全部方法
2.高级别的网络服务模块socketserver,它提供了服务器中心类,可以简化网络服务器的开发
Socket又称"套接字",使主机间或者一台计算机上的进程间可以通讯。
socket.socket([family[, type[, proto]]])
family: 套接字家族可以使AF_UNIX或者AF_INET
type: 套接字类型可以根据是面向连接的还是非连接分为SOCK_STREAM或SOCK_DGRAM
protocol: 一般不填默认为0.
函数 | 描述 |
服务器端套接字 |
|
s.bind() | 绑定地址(host,port)到套接字, 在AF_INET下,以元组(host,port)的形式表示地址。 |
s.listen() | 开始TCP监听。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分应用程序设为5就可以了。 |
s.accept() | 被动接受TCP客户端连接,(阻塞式)等待连接的到来 |
客户端套接字 |
|
s.connect() | 主动初始化TCP服务器连接,。一般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。 |
s.connect_ex() | connect()函数的扩展版本,出错时返回出错码,而不是抛出异常 |
公共用途的套接字函数 |
|
s.recv() | 接收TCP数据,数据以字符串形式返回,bufsize指定要接收的最大数据量。flag提供有关消息的其他信息,通常可以忽略。 |
s.send() | 发送TCP数据,将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。 |
s.sendall() | 完整发送TCP数据,完整发送TCP数据。将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。 |
s.recvform() | 接收UDP数据,与recv()类似,但返回值是(data,address)。其中data是包含接收数据的字符串,address是发送数据的套接字地址。 |
s.sendto() | 发送UDP数据,将数据发送到套接字,address是形式为(ipaddr,port)的元组,指定远程地址。返回值是发送的字节数。 |
s.close() | 关闭套接字 |
s.getpeername() | 返回连接套接字的远程地址。返回值通常是元组(ipaddr,port)。 |
s.getsockname() | 返回套接字自己的地址。通常是一个元组(ipaddr,port) |
s.setsockopt(level,optname,value) | 设置给定套接字选项的值。 |
s.getsockopt(level,optname[.buflen]) | 返回套接字选项的值。 |
s.settimeout(timeout) | 设置套接字操作的超时期,timeout是一个浮点数,单位是秒。值为None表示没有超时期。一般,超时期应该在刚创建套接字时设置,因为它们可能用于连接的操作(如connect()) |
s.gettimeout() | 返回当前超时期的值,单位是秒,如果没有设置超时期,则返回None。 |
s.fileno() | 返回套接字的文件描述符。 |
s.setblocking(flag) | 如果flag为0,则将套接字设为非阻塞模式,否则将套接字设为阻塞模式(默认值)。非阻塞模式下,如果调用recv()没有发现任何数据,或send()调用无法立即发送数据,那么将引起socket.error异常。 |
s.makefile() | 创建一个与该套接字相关连的文件 |
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 文件名:server.py
#主机端
import socket # 导入 socket 模块
s = socket.socket() # 创建 socket 对象
host = socket.gethostname() # 获取本地主机名
port = 12345 # 设置端口
s.bind((host, port)) # 绑定端口
s.listen(5) # 等待客户端连接
while True:
c, addr = s.accept() # 建立客户端连接。
print '连接地址:', addr
c.send('欢迎访问菜鸟教程!')
c.close() # 关闭连接
#客户端
s = socket.socket() # 创建 socket 对象
host = socket.gethostname() # 获取本地主机名
port = 12345 # 设置端口好
s.connect((host, port))
print s.recv(1024)
s.close()
24.Python Internet 模块
以下列出了 Python 网络编程的一些重要模块:
协议 | 功能用处 | 端口号 | Python 模块 |
HTTP | 网页访问 | 80 | httplib, urllib, xmlrpclib |
NNTP | 阅读和张贴新闻文章,俗称为"帖子" | 119 | nntplib |
FTP | 文件传输 | 20 | ftplib, urllib |
SMTP | 发送邮件 | 25 | smtplib |
POP3 | 接收邮件 | 110 | poplib |
IMAP4 | 获取邮件 | 143 | imaplib |
Telnet | 命令行 | 23 | telnetlib |
Gopher | 信息查找 | 70 | gopherlib, urllib |
Python SMTP(Simple Mail Transfer Protocol)发送邮件,简单邮件传输协议
Python创建 SMTP 对象语法如下:
import smtplib
smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )
参数说明:
host: SMTP 服务器主机。 你可以指定主机的ip地址或者域名如:w3cschool.cc,这个是可选参数。
port: 如果你提供了 host 参数, 你需要指定 SMTP 服务使用的端口号,一般情况下SMTP端口号为25。
local_hostname: 如果SMTP在你的本机上,你只需要指定服务器地址为 localhost 即可。
Python SMTP对象使用sendmail方法发送邮件,语法如下:
SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options]