python_编程—主要是selenium

Tips : 命令行中退出python编辑: exit()

    pip list 查看已经安装的包


1.常用包

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.文件下载

# 识别自动文件的下载类型可以使用curlcurl 是利用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)在当前窗口/框架同步执行javaScriptscriptJavaScript 的执行。*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,借助外力,我们去调用其生成的au3exe文件。

#  2.Python pywin32库,识别对话框句柄,进而操作

#  3.SendKeys

#  4.keybd_event,跟3类似,不过是模拟按键,ctrl+actrl+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_STREAMSOCK_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 模块

= 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()                # 关闭连接

#客户端

= 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 SMTPSimple 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]


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值