02

python 

%拼接的作用,

name = 'zhangsan'
age = 25
print("name: %s,age %d" %(name,age))#%是拼接,%s是字符串,%d是整数---结果name: zhangsan,age 25
for i in xx -- for i not in xx
eg:

a = 3
b=4
if a>b:
print("max: %d" %a)
else:
print("max: %d" %b)----打印结果为4

ctime是指当前时间

引用同级目录包的方法,如account.py有add函数--别的文件引入:from account import add  --print(add(2,3)) 

跨目录: 如有一个abc目录有一个count.py文件里有个add方法,和不同目录下有另外一个py文件,---一定要在abc目录内加一个_init_.py的文件

import sys

sys.path.append('\abc') ---加入环境变量中---也可以直接复制当前路径在里面就可以引包了

from abc import count

print(count.add(3,5))  ---打印结果为8

异常处理:

b='hello'
if b=='hello':
raise NameError('b not hello')

3课

定义类有三种写法,其实都是一样的:

class A:

class A():--第二种用的最多

class A(object):

类下的方法函数是 def add(self,a,b):---一定要写self规范

class a():
def add(self,a,b):
return a+b
b = a()
c = b.add(5,6)
print(c) --打印结果为11---也可以直接用 print(a().add(5,6))
eg:
class a():
def __init__(self,a,b):
self.a = int(a)
self.b = int(b)---self.a的作用是相当于成为全局变量,下面add方法没有a,b两个参数,用self.a就可以用了


def add(self):
return self.a + self.b
print(a().add(7,8))
类的继承--在下面在定义一个函数
class b(a): --这样就相当于b类继承类a类的方法
def sub(self)
return self.a-self.b
if _name_=='_main_':---作用是别人调用的时候 if下的代码都不会执行到,只有自己用的时候被执行到
a=b(5,6)
引包机制:
import count
r=count.a(8,9).add()---调用count.py文件下a()类的add()方法
print(r)
还一种不在同一目录引包--from public.count import add --public是文件名,count是py文件,add是count.py的方法
还有一种:导入sys模块--sys.path.append("/文件名") --print(sys.path)--查看是否成功--也可以用绝对路径,相对路径就是文件名--python3不用加_init_.py文件
异常处理:
try:

open("abc.text","r")

except BaseException as e:---所以的异常都可以用
print(e)#---打印[Errno 2] No such file or directory: 'abc.text'---可以加elese--也可以加finally表示有没有报错都会被执行
4课:
8种定位方式:
find_element_by_xpath("//*[@id='kw']")--//表示某个标签下--再就是id为kw
也可以为
find_element_by_xpath("//input[@id='kw']")---也可以为input标签下的id值--在同一条线上
或者input标签的属性值不唯一,可以找上一级如:
find_element_by_xpath("//span[@id='kw']/input")---这样再找input标签的值--以此类推
还有一种方式:用and
find_element_by_xpath("//input[@id='kw',and @name='wd']")----都在同一条线上,可以and多个
a标签属性为空时
find_element_by_xpath("//input[@name='wd']/../a")---input和a标签是同级类似兄弟,所以先找到大家的父标签,在写a标签
find_element_by_css_selector("form#form>span.bg>input#kw")--->表示下一级层级关系(大括号)---也可以在插件里下载firemath插件
5课
1.控制浏览器大小
driver=webdriver.chrom()
driver.set_window_size(480,800)---大小
driver.maximize_window()---全屏
driver.back()---后退
driver.forward()---  前进
click()---任何都可以点击
submit()---只能提交-表单
size 返回元素尺寸
text 获取元素的文本,测试用例中的断言
get_attribute(name)---获得属性值
is_displayed()----设置该元素是否可见
文件格式:如读取外部文件或网页可以不识别时候可以
files=open("abc.txt",'r','utf-8') 也可以用 files=file.encode('utf-8')---encode编码,decode转码
鼠标事件:--封装到ActionChains类里面

比如有的元素放上去下面会出来更多元素时---鼠标悬停
el=driver.find_element_by_link_text("设置")
ActionChains(driver).move_to_element(ele).perform()---driver一定要传,perform是执行
context_click()右击
double_click()双击
drag_and_drop()拖动
move_to_element()鼠标悬停
eg:拖动
el=driver.find_element_by_link_text("xx")
el2=driver.find_element_by_link_text("xx2")
ActionChains(driver).drag_and_drop(el,el2).perform()----从el到el2
键盘操作---封装到webdriver里面,要先引包
from selenium from webdriver,common.keys import Keys---单独封装到keys一个类里面
driver.find_element_by_link_text("设置").send_keys(keys.BACK_SPACE)--删除一个置字,还有keys.SPACE是空格键,一定要加keys获取验证信息:title,url,text--可以用来断言和做验证信息
显示等待--针对某个元素进行等待--要引包--from selenium import webdriver.suuport.ui import WebDriverWait--
-还要条件,也要引包from selenium.webdriver.support
import expected_conditions as EC   和 from selenium.webdriver.common.by import BY 也要引这个包
隐式等待:--针对当前页面中的所有元素等待---第二种好点
eg:--显示等待
ele=WebDriverWait(driver,5,0.5)untill()EC.presence_of_element_located(BY.ID,'kw')----driver一定要传,5秒为这个总时间,在0.5秒之内检查一次,
也可以用is_displayed()---判断是否显示---可以加for循环--for i in range(10)---循环10次
eg:隐式等待
from selenium import webdriver.suuport.ui import WebDriverWait
driver=webdriver.chrom()
driver.implicitly_wait(10)---隐式等待10,如果10之前提前找到就执行下一步,指10之内,这个等待10s是指下面3个操作,不是指一个单一的定位元素
driver.get(http://wwww.baidu.com)
input_=driver.find_element_by_id("kw")
input_.send_keys('hha')
6课
定位一组元素--
find_elements_by_tag_name('input')  ---就是element后面多了个s---tag_name主要用于一组元素定位,因为它主要是定位有几个input标签的
eg:
import os,time ----因为打开是本地文件所以要导入os模块---对应path路径--可以直接driver.get(path)
inputs=find_elements_by_xpath('//input[type=checkbox]') ---获取所有的input标签---用xpath更简单--css也可以
inputs=find_elements_by_tag_name('input') 

for i in inputs:---循环点击
if i.get_attribute('type')=='checkbox' ---只有是复选框的才点击
i.click()
time.sleep(3)---每隔几秒
选择点击第几个
find_elements_by_xpath('//input[type=checkbox]').pop(0).click()---选择点击第一个,从0开始
find_elements_by_xpath('//input[type=checkbox]')[2].click()---也可以用数组的方式去点击
多表单切换:表单嵌套--html嵌套html
可以直接用:driver.switch_to_frame("if")-----切换内置的html直接定位到里面的id为if----再定位元素即可
也可以用xpath:
xp = find_element_by_xpath("//fram[@id='if']")
driver.switch_to_frame(xp)
driver.find_element_by_id('kw').send_keys('selenium')---这里就可以正常操作类
退出表单:
driver.switch_to_default_content()---退出表单最外层--x新写法中间部分可写成to.default
driver.switch_to.parent_content()返回上一级表单
多窗口切换
search_windows=driver.current_window_handle---先打开一个窗口,再可以切换
all_handles = driver.window_handles---获得当前所有打开的窗口句柄
for handle in all_handles:
if handle!=search_windows:
driver.switch_to_window(handle)
警告框处理:---无法通过元素定位
1,接收弹框:driver.switch_to_alert().accept()
2,处理方式有几种:
text 返回alert/confirm/prompt中的文字信息
accept 点击确认按钮
dismiss 点击取消按钮,如果有的话
send_keys 输入值,这个alert/confirm没有对话框就不能用类,不然会报错
文件上传:
比如点击浏览按钮---会弹出windows窗口---可以定位浏览的元素按钮(name=file)
eg:
import os
driver= webdriver.chrom()
file path='file///'+os.path.abspath(upfile.html)---打开上传功能页面
driver.get(file_path)
driver.find_element_by_name("file").send_keys(要上传的文件路径)
还有一种AutoIt第三方工具,是window的gui自动化工具--要下载---可以定位window窗口的元素,直接把小原点拉大想定位的地方就会出现class,或者其他一些属性值

在该工具中找到compile script to.exe(..这个工具打开---选择exe,再选择brows(浏览)找到刚刚编写的au3的脚本--再点击convert生成一下--再用python掉用exe文件--os.sys(exe文件地址)--调用exe文件上传程序就完成了,不用加driver---但是不推荐,因为这个不受python控制

8课-模型

1,库里面是一些类和方法:sleep()os,sys可以有参数和无参数--可以帮你解决一件事情

框架-framework如django,unittest--是解决一类问题的,提供很多方法--比如解决web开发

工具:jemeter,是指独立的界面,有自己的页面,或者程序

数据驱动含义:因为数据的改变导致结果的改变--就是参数化

关键字驱动:就是相当与把功能封装成函数,调用时相当于是函数的关键字,不同关键字,功能不一样

9课:模块化--把功能封装一个函数。然后再调用

1,比如把登陆和退出功能定义成连个函数在aa.py里面,然后再在别的py文件里去调用登陆退出函数即可如:login(driver),logout(driver),定义函数和调用函数两个py文件

都要里面带driver,不然会调用失败,因为另一个没定义,都写相当于创建一个driver接口

2,也可以定义一个LOGIN()类,把登陆和退出函数放在这个类下面,类方法下的login函数等就要写成login(self,driver):---一定要写self

掉用的时候就是要写成 LOGIN(driver).login()--类的时候要初始化--调用类,类也要带括号

 

 数据驱动:--实现不同用户登陆

读字典的方式读取用户名和密码

 

文件读取用户名和密码--如tex文件存放用户名和密码
read()读取整个文件
readline()读取一行数据
readlines()读取所有行数据

读取csv文件--一组信息--csv文件必须先创建一个exe文件,再另存为csv文件格式,直接把文件改成csv格式是没有效果的

读取xml文件--主要处理数据,跟html不一样,html是展示页面

 

 

 

10课 selenium ide---浏览器安装--浏览器安装之后--可以在浏览器工具上找selenium--可以录制脚本

selenium2.0=selenium1.0+webdriver

断言是停止脚本的运行,

验证是指出错还是执行下一步

11课:unittest单元测试框架是组织和执行测试用例的--提供丰富比较方法,日志

eg:

import unittest

class TestCount(unittest.TestCase)  --定义这个类要继承uinttest的方法

      def test_add(self): # 一定要以test开头

     之后  self.assertEqual(add,6)-                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            --断言add方法的值是不是6--一定要加self因为assertEqual是继承TestCase里的方法

if _name_=="_main_":---执行测试类的测试方法

 unittest.main()---main是指执行tes_这类函数的

测试套件就是存放测试用例的一个容器

def setup(self)和def teardown(self)---都要加selfprint('hahh')测试套件用的方法:

if _name_=="_main_":
suit=unittest.TestSuit()---测试套件
suit.addTest(abc.TestCount("tast_add"))---引用测试套件的addTst方法--是abc的py文件的TestCount的类下面的test_add方法
runner=unittest.TextTestRunner()运行测试用例
runnner.run(suit)运行里的run方法
断言--in

 

有一种只用加载一行就能执行所有的测用例

test_dir='./testcase'  ----指定测试目录:

run=discover=unittest.defaultTestLoader.discover(test_dir,pattern='test*.py')---patter是指哪些文件需要执行--discover是按顺序执行

runner(run)  ---执行

多个用例执行顺序:1-9, A-Z,a-z,顺序

如果想指定那个用例先执行就用测试套件-控制顺序-但不可取

想要某个用例不执行在函数前加@unittest.skip('就是不想让你执行')  --也是在dicover里面用

有条件跳过该测试用例

13生成测试报告---用的unittest框架--有htmltestrunner--去下载,是一个py的文件要复制到pthon的lib目录里面--python要该py里面的相应信息,不然不支持--
from HTMLTestRunner import HTMLTestRunner ---引包--这是下载的上面的文件名,和类方法

生成测试报告--以html的形式

测试报告中对于每个测试用例的注解

 

每次按时间撮生成新的报告

 14,自动发邮件功能--1种以html的方式去发送

from smtplib import SMTP--要引包

 

2种,以附件的方式去发送--如果想多个人接收就receive=[zhangsan@163.com,lisi@163.com,wangwu@163.com]

步骤如下:

 

怎么找到最新的报告--加时间

找最新报告的方法:

os.listdir(报告path)---会得到该路径下的所有报告

匿名函数就是没有函数名---lambda a,b:a+b  ---a,b就是入参,a+b就是结果,如果key=lambda a,b:a+b ,则key就是这么模块的名字

15课,page object的设计模式--页面对象--把元素分离出来,封装成一个方法

16-selenium-grid--用于做分布式(现以集成到seleniumserver中了),本地的脚本可以去不同的操作系统--下载jar包,

java环境下载:http://www.java.com/zc-CN/download/manual.jsp---看是否安装成功,在终端输入java,和javac命令

再下载seleniumserver--浏览器上下载

运行seleniumserver-方法-打开终端输入 java -jar selenium-server-standlone-2.46.0.jar

指定主节点:java -jar selenium-server-standlone-2.46.0.jar -role hub

指定分支节点:java -jar selenium-server-standlone-2.46.0.jar -role node -port 5555  ----主节点端口号被占用,可以从新取个新的分支节点

 eg:

启动不同浏览器

启动远程的节点--远程的分支节点--装虚拟机-先ipconfig虚拟机的ip地址,在本机上ping 虚拟机的ip地址看是否通的,反过来通过本机ipconfig查本机ip。然后在虚拟机上ping--然后如下:

 

分布式:可以在不同平台上执行

多线程:同时执行多个用例

18课--项目总和

有时候悬停的位置元素不太稳定,可以看下href一般是当前页面地址加上href的地址拼接就转到该页面里--根据attribute

 19i课:--多线程技术-并发

进程:比如启动了一个qq就是启动了一个进程--耗资源点

线程:线程是进程里的子进程--更稳定

 

 

 

 

 

 引包:from thresding import Thread--多线程--也不是同一时间,只是时间可以忽略,很短

import multiprocessing   ---多进程模块

守护进程,join()--是指把join上面的进程执行完成才执行join下面的

eg:--线程

 

 

 

 升级版:多线程

 

 

 

 20--bbd行为驱动开发--通过用户行为开发

add--根据验收来开发---python的有lettuce框架-生菜

安装--pip install lettuce

 

 






























 
 





















 
 























 

 
 

 

转载于:https://www.cnblogs.com/star77/p/11415345.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值