Mysql查询语句之连表查询和增删改查语句补充

前言

Hey,大家好,我是码农星期八!

上次怎么大概说了一下or,!=,in/not in between,like,limit,order by,group by。

但是还没完,咱们接着往下说!

查询

我们的数据是这样的。

Mysql查询语句之连表查询和增删改查语句补充

发现class_id是一个数字,这是因为我们在设计时,将学生表班级表分开设计的。

Mysql查询语句之连表查询和增删改查语句补充

但是如果我们偏偏想要查询这个人是几班的,怎么办?

连表查询

方式一,where连表

语法

SELECT * from1,表2 WHERE1.外键列=表2.被外键列;
SELECT1.1,表1.2,表2.1,... from1,表2 WHERE1.外键列=表2.被外键列;

连表显示所有列

SELECT * from student,class WHERE student.class_id=class.id;

执行结果

Mysql查询语句之连表查询和增删改查语句补充

喏,这样就知道哪个学生是哪个班的了!

连表显示指定列

SELECT student.id,student.`name`,class.title from student,class WHERE student.class_id=class.id;

执行结果

Mysql查询语句之连表查询和增删改查语句补充

方式二,left连表

通过where连表固然简单,但是缺点明显。

因为我们的where后面是要跟判断条件的,使用where进行连表会造成逻辑有些混乱

在一般连表操作中,使用的也是left进行连表。

语法

SELECT * from1 LEFT JOIN2 on1.外键字段=表2.被外键字段;
SELECT1.1,表1.2,表2.1,... from1 LEFT JOIN2 on1.外键字段=表2.被外键字段;

连表显示所有列

SELECT * from student LEFT JOIN class on student.class_id=class.id;

执行结果

Mysql查询语句之连表查询和增删改查语句补充

选择指定列查询

SELECT student.id,student.`name`,class.title from student LEFT JOIN class on student.class_id=class.id;

执行结果

Mysql查询语句之连表查询和增删改查语句补充

其实这和where连表是一样的。

方式三,inner连表

inner和left是差不多的,只不过left是正向连表,inner是反向连表。

就像学生表和课程表。

如果是通过学生表连课程表,属于正向,用left。

如果是通过课程表连学生表,就属于反向,用inner。

如果反向连表硬生生用left,会出现一些空值现象。

inner语法同left,只不过是表的前后顺序不一样。

其他操作

上述所有的操作,都属于查询操作,基本上入门是可以的,下面咱们来看一下剩下的增,删,改操作。

增(insert)

单条插入

语法

INSERT INTO 表(列名1,列名2,...) values(值1,值2,...);

添加一条学生信息

INSERT into student(name,age,gender,class_id) VALUES("吴彦祖",22,"男",1);

执行结果

Mysql查询语句之连表查询和增删改查语句补充

表内容

Mysql查询语句之连表查询和增删改查语句补充

多条插入

语法

INSERT INTO 表(列名1,列名2,...) values(值1,值2,...),(值1,值2,...);

批量添加学生信息

INSERT INTO student (NAME, age, gender, class_id)
VALUES
    ("范冰冰", 18, "女", 2),
    ("成龙", 24, "男", 3);

执行结果

Mysql查询语句之连表查询和增删改查语句补充

表内容

Mysql查询语句之连表查询和增删改查语句补充

改(update)

语法

UPDATE <表> set 列 = 值 where <条件>;

将李四的年龄修改成88岁

UPDATE student set age = 88 where name = "张三"

执行结果

Mysql查询语句之连表查询和增删改查语句补充

删除(delete)

语法

delete from <表名>
delete from <表名> where <条件>

删除张三

DELETE from student where name="张三"

执行结果

Mysql查询语句之连表查询和增删改查语句补充

总结

这章有点像收尾部分,补充了连表查询,后续又补充了Mysql的增删改查。

连表查询要区分一下left和inner的区别,一个是正向连,一个是反向连。

插入数据可以插入单条数据和多条数据,多跟参数即可。

如果在操作过程中有任何问题,记得下面留言,我们看到会第一时间解决问题。

越努力,越幸运。

我是码农星期八,如果觉得还不错,记得动手点赞一下哈。

感谢你的观看。

如何来理解Python中的字典数据类型

大家好,我是IT共享者,人称皮皮。今天给大家讲解下Python中的字典数据类型。

一、前言

字典是Python中的数据类型,可让将数据存储在键/值对中。

二、什么是字典理解?

字典理解是创建字典的一种优雅简洁的方法。

字典理解优化

使用字典理解优化函数。

例:

# 字典理解例:
square_dict = {num: num*num for num in range(1, 11)}
print(square_dict)

运行结果:

注·:

创建了square_dict带有数字平方键/值对的字典。但是,使用字典理解可以使在一行中创建字典。

三、使用字典理解

字典理解的最小语法为:

dictionary = {key: value for vars in iterable}

1. 图解析语法

让将此语法与上例中的字典理解进行比较。

2. 案例

如何使用字典理解

例:

#item price in dollars
old_price = {'milk': 1.02, 'coffee': 2.5, 'bread': 2.5}


dollar_to_pound = 0.76
new_price = {item: value*dollar_to_pound for (item, value) in old_price.items()}
print(new_price)

输出结果

注:

可以看到以美元为单位检索商品价格并将其转换为英镑。使用字典理解使此任务更加简单和短。

四、字典理解中的条件

可以通过添加条件来进一步自定义字典理解。让来看一个实例。

案例

1. 如果条件字典理解

例:

original_dict = {'jack': 38, 'michael': 48, 'guido': 57, 'john': 33}


even_dict = {k: v for (k, v) in original_dict.items() if v % 2 == 0}
print(even_dict)

输出结果

可以看到,由于if字典理解中的子句,仅添加了具有偶数值的项目。

2. 多重if条件字典理解

例:

original_dict = {'jack': 38, 'michael': 48, 'guido': 57, 'john': 33}


new_dict = {k: v for (k, v) in original_dict.items() if v % 2 != 0 if v < 40}
print(new_dict)

输出结果

在这种情况下,仅奇数值小于40的项目已添加到新字典中。

这是因为if字典理解中有多个子句。等效于and必须同时满足两个条件的操作。

3. if-else条件字典理解

例:

original_dict = {'jack': 38, 'michael': 48, 'guido': 57, 'john': 33}


new_dict_1 = {k: ('old' if v > 40 else 'young')
    for (k, v) in original_dict.items()}
print(new_dict_1)

输出结果

在这种情况下,将通过子典理解来创建新字典。

价值大于等于40的商品的值为“old”,而其他商品的值为“young”。

五、嵌套字典理解

可以将字典理解本身添加到字典理解中以创建嵌套字典。

案例

具有两个字典理解的嵌套字典

例:

dictionary = {
    k1: {k2: k1 * k2 for k2 in range(1, 6)} for k1 in range(2, 5)
}
print(dictionary)

输出结果

注:

在嵌套字典中构造了一个乘法表,用于2到4的数字。每当使用嵌套字典理解时,Python都会首先从外部循环开始,然后再进入内部循环。

六、使用字典理解的优势

如所见,字典理解大大缩短了字典初始化的过程。

它使代码更具pythonic风格,在的代码中使用字典理解可以缩短代码行,同时保持逻辑完整。

七、总结

本文基于Python基础,介绍了如何使用字典。通过分类对每一模块,进行详细的讲解。使用图解析语法,实例代码演示,运行效果图的展示,能够帮读者更好的理解。

在实际案例中遇到的问题,提供了一些有效的解决方案。使用Python语言,能够更直观的,加深读者对内容的理解。

代码很简单,希望能够帮助你更好的学习。

Python矩阵和Numpy数组的那些事儿

大家好,我是IT共享者,人称皮皮。今天给大家介绍矩阵和NumPy数组。

一、什么是矩阵?

使用嵌套列表和NumPy包的Python矩阵。矩阵是一种二维数据结构,其中数字按行和列排列。

二、Python矩阵

1. 列表视为矩阵

Python没有矩阵的内置类型。但是,可以将列表的列表视为矩阵。

例:

A = [[1, 4, 5], 
    [-5, 8, 9]]

可以将此列表的列表视为具有2行3列的矩阵。

如图:

2. 如何使用嵌套列表。

A = [[1, 4, 5, 12], 
    [-5, 8, 9, 0],
    [-6, 7, 11, 19]]


print("A =", A) 
print("A[1] =", A[1])      # 第二行
print("A[1][2] =", A[1][2])   # 第二行的第三元素
print("A[0][-1] =", A[0][-1])   # 第一行的最后一个元素
column = [];        # 空 list
for row in A:
  column.append(row[2])   


print("3rd column =", column)

当运行程序时,输出为:

三、NumPy数组

1. 什么是NumPy?

NumPy是用于科学计算的软件包,它支持强大的N维数组对象。

在使用NumPy之前,需要先安装它。

2. 如何安装NumPy?

如果使用Windows,使用PyCharm 安装NumPy,NumPy它带有一些其他与数据科学和机器学习有关的软件包。

成功安装了NumPy,就可以导入和使用它。

NumPy提供数字的多维数组(实际上是一个对象)。

例 :

import numpy as np
a = np.array([1, 2, 3])
print(a)               # 输出: [1, 2, 3]
print(type(a))         # 输出: <class 'numpy.ndarray'>

NumPy的数组类称为ndarray。

注:

NumPy的数组类称为ndarray。

3. 如何创建一个NumPy数组?

有几种创建NumPy数组的方法。

3.1 整数,浮点数和复数的数组

import numpy as np


A = np.array([[1, 2, 3], [3, 4, 5]])
print(A)


A = np.array([[1.1, 2, 3], [3, 4, 5]]) # 浮点数组
print(A)


A = np.array([[1, 2, 3], [3, 4, 5]], dtype = complex) # 复数数组
print(A)

运行效果:

3.2 零和一的数组

import numpy as np


zeors_array = np.zeros( (2, 3) )
print(zeors_array)
ones_array = np.ones( (1, 5), dtype=np.int32 ) // dtype
print(ones_array)      # 输出: [[1 1 1 1 1]]

在这里,指定dtype了32位(4字节)。因此,该数组可以采用从到的值。-2-312-31-1

3.使用arange()和shape()

import numpy as np


A = np.arange(4)


print('A =', A)


B = np.arange(12).reshape(2, 6)


print('B =', B)

四、矩阵运算

两个矩阵相加,两个矩阵相乘以及一个矩阵转置。在编写这些程序之前,使用了嵌套列表。让看看如何使用NumPy数组完成相同的任务。

两种矩阵的加法

使用+运算符将两个NumPy矩阵的对应元素相加。

import numpy as np


A = np.array([[2, 4], [5, -6]])
B = np.array([[9, -3], [3, 6]])
C = A + B      # 元素聪明的加法
print(C)

两个矩阵相乘

为了将两个矩阵相乘,使用dot()方法。

注意:用于数组乘法(两个数组的对应元素的乘法),而不是矩阵乘法。

import numpy as np


A = np.array([[3, 6, 7], [5, -3, 0]])
B = np.array([[1, 1], [2, 1], [3, -3]])
C = A.dot(B)
print(C)

矩阵转置

使用numpy.transpose计算矩阵的转置。

import numpy as np


A = np.array([[1, 1], [2, 1], [3, -3]])
print(A.transpose())

注:

NumPy使的任务更加轻松。

五、案例

1. 访问矩阵元素

与列表类似,可以使用索引访问矩阵元素。让从一维NumPy数组开始。

import numpy as np
A = np.array([2, 4, 6, 8, 10])


print("A[0] =", A[0])     # First element     
print("A[2] =", A[2])     # Third element 
print("A[-1] =", A[-1])   # Last element

运行该程序时,输出为:

现在,让看看如何访问二维数组(基本上是矩阵)的元素。

import numpy as np


A = np.array([[1, 4, 5, 12],
    [-5, 8, 9, 0],
    [-6, 7, 11, 19]])


#  First element of first row
print("A[0][0] =", A[0][0])  


# Third element of second row
print("A[1][2] =", A[1][2])


# Last element of last row
print("A[-1][-1] =", A[-1][-1])

当运行程序时,输出将是:

2. 访问矩阵的行

import numpy as np


A = np.array([[1, 4, 5, 12], 
    [-5, 8, 9, 0],
    [-6, 7, 11, 19]])


print("A[0] =", A[0]) # First Row
print("A[2] =", A[2]) # Third Row
print("A[-1] =", A[-1]) # Last Row (3rd row in this case)

当运行程序时,输出将是:

3. 访问矩阵的列

import numpy as np


A = np.array([[1, 4, 5, 12], 
    [-5, 8, 9, 0],
    [-6, 7, 11, 19]])


print("A[:,0] =",A[:,0]) # First Column
print("A[:,3] =", A[:,3]) # Fourth Column
print("A[:,-1] =", A[:,-1]) # Last Column (4th column in this case)

当运行程序时,输出将是:

注:

使用NumPy(而不是嵌套列表)可以更轻松地处理矩阵,而且甚至都没有涉及基础知识。建议详细研究NumPy软件包,尤其是当尝试将Python用于数据科学/分析时。

六、总结

本文基于Python基础,介绍了矩阵和NumPy数组,重点介绍了NumPy数组,如何去安装NumPy模块,如何去创建一个NumPy数组的两种方式。

通过案例的分析,代码的演示,运行效果图的展示,使用Python语言,能够让读者更好的理解。

读者可以根据文章内容,自己实现。有时候看到别人实现起来很简单,但是到自己动手实现的时候,总会有各种各样的问题,切勿眼高手低,勤动手,才可以理解的更加深刻。

代码很简单,希望对你学习有帮助。

手机自动化测试IDE—–Airtest实战篇

大家好,我是IT共享者,人称皮皮。上篇文章我们介绍了

手机自动化测试IDE —– 手把手教你用Airtest模拟器来连接手机,这篇我们来讲讲Airtest实际操作方法,一起来看看吧。

前言

前面我们讲到了Airtest的基础知识,手机自动化测试IDE—–Airtest基本操作方法,手机自动化测试IDE —– Airtest的安装和IDE控件详解,今天我们就来说说Airtest的具体操作方法吧,让我们轻松实现软件自动化,真正解放我们的双手吧。

基本操作

我们就是用我们说的跨平台API模块中的方法来操作我们的APK,下面来看下吧。我们先点击Touch,然后框选App所在的区域,如图:

这里框选好了后就会在脚本编辑器中自动生成代码了,如图:

这里就相当于点击了拼多多这个App了。当然这里只是给大家讲了一个例子,我们真正来做开发时,可以选择一些短视频软件,比如抖音,微视,快手等下面我们就以抖音为主来讲解下具体操作流程。

1.点击目标APP并等待界面加载完毕

我们要做自动点击肯定不能只是点击App就完事了啊,还有每个APP启动后的时间都不固定,我们肯定得等APP启动完毕之后我们才可以进行下一步操作,那么这样怎样做呢?我们以短视频软件微视为主,下面请看:

我们先点击微视,打开微视有两种方法,如下:

1).根据图像识别来打开

上面的这种方法就是根据图像识别来打开的。使用这种方法你要打开的APP必须在当前页,不可在其它页,否则搜索不到。

2).根据包名打开

这里我们首先需要获取到所有的包名,然后找到微视的包名,如下;

dev=device()  # 先获取到当前设备对象,即是Android对象
print(dev.list_app())  # 平台接口列表
start_app('com.tencent.weishi')#利用包名打开微视

喜欢哪种方法就用哪种方法。建议用第一种,因为有时候包名太多不好找。

2.点赞评论关闭

由于刚刚微视崩溃了,所以这里采用抖音短视频,这里我们需要将需要打开的APP的图像截取下来,先等到它在这篇区域出现然后点击才能进行其它操作 ,如下:

然后就是输入评论,输完后关闭评论,最后退出。

这样我们就实现了打开抖音视频并且给视频点赞和评论,然后关闭抖音回到桌面。这里有个小技巧分享给大家,就是大家在点击某一个区域的图像时记得先Wait一下哦,因为如果Wait的话如果你直接点击的话就会报错了。

3.截屏加滑动屏幕

如果想要捕捉操作截图的话,可以使用Snapshot进行截图,记得指定绝对地址哦。如下:

snapshot(filename=r'C:\Users\Administrator\Desktop\test.jpg',msg='截图成功')

成功截图了;然后我们给它添加个滑动视频的动作,因为我们不知道我们鼠标此时所处的位置的坐标的值是多少,所以我们需要开启Airtest中的一项重要功能—-实时坐标显示。设置方法如下图所示:

第二个代码补全对于电脑配置好的可以开启,电脑配置太差不建议开启。

可看到鼠标的坐标了。然后我们需要使用Swipe的帮助,有了它我们可以进行滑动屏幕的操作了,如下:

这行代码是我通过截取视频中两个地方的图像然后才得到的方法参数,这里是向量位移的操作。我们可以看到我们进行了这么多操作,但是都是一些图片,而且图片有的大有的小,看着不美观,我们其实可以将这些图片转换为代码,如下:

只需选中图片代码模式切换即可,我们所截取的图片都在这个文件里,大家可以去看看就知道了。其实这个就是PY文件里的内容。

4.不断滑动屏幕

那么重点来了,我们该如何将它重复一直滑动了,很简单,死循环,顺便给它加个随机延时。

import random


wait(Template(r"tpl1594203055954.png", record_pos=(0.356, 0.562), resolution=(1080, 2340)))
sleep(1)


touch(Template(r"tpl1594203066034.png", record_pos=(0.354, 0.564), resolution=(1080, 2340)))
sleep(2)
exists(Template(r"tpl1594203382253.png", record_pos=(0.415, 0.139), resolution=(1080, 2340)))
sleep(2)
snapshot(filename=r'C:\Users\Administrator\Desktop\test.jpg',msg='截图成功')
sleep(2)
assert_exists(Template(r"tpl1594203920118.png", record_pos=(0.411, 0.33), resolution=(1080, 2340)), "请填写测试点")


while True:#死循环,不断滑动短视频
    aa=random.randint(1,5)
    swipe((700,1950),(700,300))
    sleep(aa)

我们也可以在这个死循环里加入其它的操作,比如点赞,评论啥的,上面我都有说到,大家可以结合试试。

总结

通过对Airtest框架的学习,我们就能轻松做出短视频的点赞评论滑动以及其它功能,很多互粉的小盆友需要的正是这种神器了。

我是皮皮,如果觉得文章不错,记得三连噢,大家有问题也可以点击下方的图片,加我好友,交个朋友也好呀~

手机自动化测试IDE —– 手把手教你用Airtest模拟器来连接手机

大家好,我是IT共享者,人称皮皮。上篇文章讲了Airtest的安装和IDE控件详解相关知识,手机自动化测试IDE—–Airtest基本操作方法、手机自动化测试IDE —– Airtest的安装和IDE控件详解,这篇文章来给大家分享用Airtest模拟器来连接手机。

前言

也许有人觉得抓手机的数据包都费劲,还搞什么自动化,而且肯定不简单。但我要告诉你的是,这一切都被一个叫Airtest的自动化测试软件给搞定了,你只需要把它一直运行着,你的手机上的所有操作,就都交给它了,直接就是点点点。

连接设备

1.模拟器手机连接Airtest

这里我们需要连接手机,由于小编有模拟器,为了不影响小编玩手机,所以我决定用Airtest模拟器来连接手机,打开模拟器,选择关于平板电脑,如图:

连击多次版本号,直到出现开发者选项功能,然后打开开发者选项下的USB调试,如图:

这样我们就开启了USB调试,下面我们Airtest来远程连接我们的模拟器,如图:

这里有一个知识需要向大家说明的就是,我们连接的远程端口号不是随便弄的,而是根据模拟器的不同而使用的不同的端口号,模拟器和端口号一一对应关系如下:

这样选择好我们的主机地址和端口号后就可以进行连接了,然后我们点击connect就可以直接连接了,如图:

由于我们是使用模拟器连接,所以图上第一项最好选上,不然模拟器即使连接上了也是没有画面的。如果还是没有画面,那可能是因为屏幕捕捉程序“yosemite.apk”没有下载到模拟器中,在Airtest中找出来,直接拖动到模拟器中,再次连接模拟器,打开一看,如图:

成功连接上了。下面就上面三个选项跟大家简单描述下:

use javacap:#解决IDE中手机画面黑屏的问题
use ADB orientation :#解决IDE中屏幕旋转的问题
use ADB touch:#解决IDE中屏幕无法点击的问题

2.连接WIndows桌面应用

这里我们不光可以和模拟器建立连接,还可以和我们已打开或者未打开的应用进行连接操作,我们可以点击选定窗口,选择指定的应用程序,这样程序就会被加载到Airtest中去了,这里我打开了360浏览器,如图:

可以看到被加载进去了,我们可以在里面浏览了,但是此时我们的桌面上的浏览器却不翼而飞,这就是因为Airtest正在使用我们的浏览器,当我们点击断开当前设备就可以关闭掉这个设备,此时便可以重新看到浏览器又回到了我们的桌面了,如图:

2.Android真机连接Airtest

虽然模拟器很方便,但是毕竟很麻烦,而且万一你的电脑配置不行的话,那么模拟器可能开不了几个应用就爆了,所以这里我们也要使用手机来连接Airtest,手机相比其它的连接方式略显复杂,下面请看我表演。

1).设置开发者相关选项

首先我们需要将数据线插入电脑的USB接口,然后还是打开开发者选项和USB调试;只不过手机可不像模拟器,除了以上选项要设置之外,我们还需要设置默认USB配置,并把它设为MIDI,默认USB配置就在USB调试的下方,如图:

然后选择MIDI,如图:

这样手机端的开发者选项设置算是全部完结了,但是这样还是远远不够的,你还需要一大堆操作,是的,没错,一大堆,这款IDE最大的毛病就在这,正是验证了一句话,安装两小时,编程两分钟,哈哈哈哈。

2).安装手机相关驱动程序

因为小编手机是Vivo的,所以小编在网上下了一个Vivo的驱动程序包,如果你的手机跟小编不是一个版本,那么请看下面:

三星: http://www.samsung.com/cn/support/downloads
华为: http://consumer.huawei.com/minisite/HiSuite_cn/
小米: http://bigota.d.miui.com/tools/xiaomi_usb_driver.rar
Vivo: http://zs.vivo.com.cn/download.php
魅族:http://care.meizu.com/
一加:http://service.oneplus.cn/
华硕: http://www.asus.com.cn/support/
联想: http://www.lenovocare.com.cn/default.aspx
LG: http://www.lg.com/us/support/software-firmware-drivers
索尼: https://developer.sony.com/develop/drivers/
摩托罗拉: https://mobilesupport.lenovo.com/us/en/solution/MS88481
HTC: http://www.htc.com/us/software/htc-sync-manager/
谷歌: https://developer.android.com/studio/run/win-usb.html
黑莓: https://swdownloads.blackberry.com/Downloads/entry.do?code=4EE0932F46276313B51570F46266A608
戴尔: http://www.dell.com/support/home/us/en/04/Products?app=drivers&lwp=rt
宏基: https://www.acer.com/ac/en/US/content/drivers

如果上面还是没有,那么你可能需要一款兼容所有设备的驱动软件,驱动人生或者驱动精灵,随意挑选一个即可。

3).配置输入法和模拟位置

如果我们在Airtest中要输入文字的话,使用手机自带的输入法是没办法输入的,必须使用我们前面提到的“yosemite”输入法,这里在我们安装好手机的驱动后会自动下载到你的手机的,你只需要安装即可。如图:

然后我们再设置系统默认输入法为这个输入法即可,如图:

虽然设置好了后我们可以输入文字了,但是有时候的话可能鼠标点击的不是很准确,那么这个时候,我们还需要设置模拟位置,同样在开发者选项中,如图:

这样设置好后,回到我们的Airtest主界面,我们就可以看到已经出现了设备的名称和状态了,如图:

4).连接设备

还是如模拟器一样,点击Connect 勾选Use Javacap,这时设备就已经成功连接上了,如图:

5).无线连接Android真机

这里我们无需准备数据线也可以连接上我们的安卓机,只要你三个步骤完成好了,就简单了。我们首先需要知道安卓真机的IP地址,可在这里查看,如图:

然后我们使用这个IP地址在Airtest中建立连接,如图:

注意这里的端口号是5555,如果你写其它的端口的话也可以运行,但是它是无法监听TCP/IP信息的,如果你想指定多个这样的端口,命令提示符输入如下命令即可:

adb tcpip 666#开启666端口

这里有个前提,就是手机必须和我们IDE所处在同一个Wifi网络环境下才行,否则是访问不到的。

6).使用脚本连接

这里我们双击脚本编辑窗,设置一个编辑器的脚本文件,如下:

设置完毕后返回即可看到如下画面:

然后我们就可以在这里面连接安卓机了,具体代码如下:

connect_device('Android://127.0.0.1:5037/手机IP地址:5555')#前面是本机号和端口后面就是你手机的IP地址了

请大家注意,这里同样需要安卓机子和IDE处在同一个WiFi网络环境下哦。

总结

今天我们讲的是这款自动化工具的安装和界面功能的剖析,这个工具整体上来说,用法比较简单,就是安装坑太多,新手小白可能要花一些时间才能整明白,在此特与大家分享,愿大家学习之路更加平坦顺畅。下次我们再来讲讲IDE的妙用。

手机自动化测试IDE—–Airtest基本操作方法

大家好,我是IT共享者,人称皮皮。这篇我们来讲讲手机自动化测试IDE—–Airtest。

前言

前面我们讲到了Airtest的界面和安装技巧,今天我们就来说说Airtest的具体操作方法吧,让我们轻松实现软件自动化,真正解放我们的双手吧。

一、基本API介绍

我们在做自动化脚本的时候,每个生成的脚本文件会给我们自动生成一些代码,如图:

手机自动化测试IDE-----Airtest基本操作方法

这里所导入的模块其实就是跨平台的API,除了跨平台的API还有平台特定的API,比如:

airtest.core.android #安卓平台
airtest.core.ios   #苹果平台
airtest.core.win   #Windows平台

这里我们来详细说说这些模块。

1.跨平台API模块

这里我们要介绍的第一个就是跨平台模块:

from airtest.core.api import * #导入所有方法

1).初始化设备

这里初始化设备我们也有两种方案,下面请看:

1)).根据设备的UUID来初始化

语法格式:

init_device(platform='Android',uuid='',cap_method=JAVACAP for Android)
#平台 – Android,IOS或Windows
#uuid –目标设备的uuid,例如,用于Android的serialno,用于Windows的handle,用于iOS的uuid
#kwargs –可选的平台特定关键字args,例如cap_method = JAVACAP for Android

下面我们来列举一下实例,如下:

init_device(platform='Android',uuid='127.0.0.1:62001',cap_method='JAVACAP')
2)).根据设备的URL来初始化

语法格式如下:

android:///   连接当前安卓设备
android://adbhost:adbport/serial NO.?cap_method=javacap&touch_method=adb
windows:///    连接本地桌面程序
ios:///     连接IOS设备

这里我们主要是传入了ADB地址,端口和连接的夜神模拟器的序列号而连接上的。具体例子如下:

connect_device('android://127.0.0.1:5037/127.0.0.1:62001?cap_method=javacap&touch_method=adb')

2).返回当前活动设备

device()
手机自动化测试IDE-----Airtest基本操作方法

3).设置当前活动设备

有时候如果我们连接了多个设备,我们需要切换的话,就是用这个函数来达到目的,可以使用设备的索引或者设备的序列号来进行切换哦。

set_current(0)
set_current('127.0.0.1:62001')

4).运行环境配置

auto_setup(basedir = None,devices = None,logdir = None,project_root = None,compress = 0 )
basedir 设置当前脚本的所在位置,__file__也可以。
devices 指定运行脚本的设备以列表形式存在
logdir 设置脚本运行时的日志保存路径,默认为None,设为True可保存
project_root  设置api的项目根目录

5).开启并执行远程Shell命令

shell(cmd) #ls / data / local / tmp

6).在设备上启动程序

start_app('启动的应用程序包名')

7).在设备上停止程序

stop_app('启动的应用程序包名')

8).清除设备上的应用程序数据

clear_app('启动的应用程序包名')

9).在设备上安装应用程序

install(filepath='要在目标设备上安装的文件的路径')

10).在设备上卸载应用程序

uninstall('应用程序包名')

11).截图并保存到文件中

snapshot(filename='1.jpg',msg='hello',quality=3)
filename:图片名
msg:屏幕截图的简短描述
quality:图像质量,范围为[1,99]的整数

12).唤醒并解锁设备

wake('设备')

13).返回目标设备的主屏幕

home('设备')

14).设备屏幕上执行点击,滑动,捏,按键,输入操作

click(v=Template(x,y),times=2) #单击
v:触摸目标,可以是Template实例,也可以是绝对坐标(x,y)
times:执行多少次触摸


double_click() #双击
swipe(v1,v2)#滑动起点和终点
swipe(v1,vector=(x,y))#沿向量移动,向量可以是坐标也可以是屏幕百分比
#返回值:原点位置和目标位置


pinch()#捏操作,相当于缩放,参数如下:
in_or_out:放大或缩小
center:默认为None表示屏幕中心
percent:捏动作的屏幕比例,默认值为0.5 
keyevent(keyname='Home')#按键操作


text('文本')#在设备上输入文本

15).睡眠,等待

sleep(2)#睡眠两秒,延迟两秒
wait(v,timeout,interval,intervalfunc)#等待与设备屏幕上的模板匹配
v:等待的目标对象
timeout:超时时间
interval:尝试找到匹配项的时间间隔(秒)
intervalfunc:在每次未成功尝试找到相应匹配项后调用
返回值:匹配目标的坐标

16).检查给定目标在设备屏幕上是否存在

exists(v)
v:检查对象
如果找不到目标,则为False,否则返回目标的坐标

17).在设备屏幕上查找所有出现的目标并返回其坐标

find_all(v)
v:寻找目标
返回坐标列表

18).断言操作

assert_exists(v,msg) #断言目标存在于设备屏幕上
assert_not_exists(v,msg) #断言目标在设备屏幕上不存在
v:要检查的目标
msg:断言的简短描述


assert_equal(v1,v2,msg) #断言两个值相等
assert_not_equal(v1,v2,msg) #断言两个值不相等
v1:第一个值
v2:第二个值
msg:断言的简短描述

这里基本上我们就把使用方法说完了,下面我们来进行下实际操作,下一篇文章即将奉上。

二、总结

这篇文章主要介绍了Airtest的基本操作方法,可以让我们轻松实现软件自动化,下一篇文章将带大家一起进行实际操作,敬请期待!

我是皮皮,如果觉得文章不错,记得三连噢。

浅析Python模块的引入和调用

大家好,我是IT共享者,人称皮皮。这篇文章我们来浅析Python模块的引入和调用。

一、前言

Python中的模块,有过C语言编程经验的朋友都知道在C语言中如果要引用sqrt函数,必须用语句#include引入math.h这个头文件,否则是无法正常进行调用的。

那么在Python中,如果要引用一些其他的函数,该怎么处理呢?

在Python中有一个概念叫做模块(module),这个和C语言中的头文件以及Java中的包很类似,比如在Python中要调用sqrt函数,必须用import关键字引入math这个模块,下面就来了解一下Python中的模块。

说的通俗点 :模块就好比是工具包,要想使用这个工具包中的工具(就好比函数),就需要导入这个模块。

二、模块引入

1. import

在Python中用关键字import来引入某个模块,比如要引用模块math,就可以在文件最开始的地方用import math来引入。

形如 :

 import module1,mudule2...

当解释器遇到import语句,如果模块在当前的搜索路径就会被导入。

在调用math模块中的函数时,必须这样引用:

  模块名.函数名

为什么必须加上模块名调用呢?

因为可能存在这样一种情况:在多个模块中含有相同名称的函数,此时如果只是通过函数名来调用,解释器无法知道到底要调用哪个函数。所以如果像上述这样引入模块的时候,调用函数必须加上模块名。

   import math


    #这样会报错
    print sqrt(2)


    #这样才能正确输出结果
    print math.sqrt(2)

有时候我们只需要用到模块中的某个函数,只需要引入该函数即可,此时可以用下面方法实现:

   from 模块名 import 函数名1,函数名2....

不仅可以引入函数,还可以引入一些全局变量、类等。

注意:

  1. 这种方式引入的时候,调用函数时只能给出函数名,不能给出模块名,但是当两个模块中含有相同名称函数的时候,后面一次引入会覆盖前一次引入。也就是说假如模块A中有函数function( ),在模块B中也有函数function( ),如果引入A中的function在先、B中的function在后,那么当调用function函数的时候,是去执行模块B中的function函数。

2. 如果想一次性引入math中所有的东西,还可以通过from math import 来实现

2. from…import

Python的from语句让你从模块中导入一个指定的部分到当前命名空间中。

语法如下:

   from modname import name1[, name2[, ... nameN]]

例如,要导入模块fib的fibonacci函数,使用如下语句:

   from fib import fibonacci

注意:

  • 不会把整个fib模块导入到当前的命名空间中,它只会将fib里的fibonacci单个引入。

3. from … import *

把一个模块的所有内容全都导入到当前的命名空间也是可行的,只需使用如下声明:

   from modname import *

注意:

  • 这提供了一个简单的方法来导入一个模块中的所有项目。然而这种声明不该被过多地使用。

4 . 定位模块

当你导入一个模块,Python解析器对模块位置的搜索顺序是:

  1. 当前目录
  2. 如果不在当前目录,Python则搜索在shell变量PYTHONPATH下的每个目录。
  3. 如果都找不到,Python会察看默认路径。UNIX下,默认路径一般为/usr/local/lib/python/
  4. 模块搜索路径存储在system模块的sys.path变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录。

三、as 的三种用法

1. with…as…

第一种是和with结合使用,主要用于文件的读写操作,省去了关闭文件的麻烦。

写法:

with open("文件路径","读写方式") as 赋值变量:
    #  执行代码块

实例:

#test.py
with open("1.txt") as f:
    print f.read()


#1.txt(两个文件在同一目录下)

运行结果:

 

2. 导入模块起别名

导入模块是对模块进行重命名,也就是给模块起一个别名。示例代码在下方的第三点有演示。

3. except结合使用

第一种:给traceback模块起别名为a

示例代码 :

import traceback as a
try:
    while 1/0 < 0:
        print True

第二种:和except组合使用,将捕获到的异常对象赋值给e。

实例代码 :

except Exception as e:
    print "e=",e
    a.print_exc()

四、总结

本文详细的讲解了Python基础 ( 模块 )的引入,调用 。介绍了常用的三种模块。模块时的需要注意的事项,以及在实际操作中会遇到的问题,提供了解决方案。希望可以帮助你更好的学习Python。

说说Python集合的那些事儿

大家好,我是IT共享者,人称皮皮。今天给大家来捋一捋Python集合。

一、什么是集合?

集合(set)和字典(dict)类似,它是一组 key 的集合,但不存储 value。集合的特性就是:key 不能重复。

二、集合常用操作

1. 创建集合

set 的创建可以使用 {} 也可以使用 set 函数:

s1 = {'a', 'b', 'c', 'a', 'd', 'b'}  # 使用 {}
print(s1)
(['a', 'c', 'b', 'd'])

s2 = set('helloworld')  # 使用 set(),接收一个字符串
print(s2)
set(['e', 'd', 'h', 'l', 'o', 'r', 'w'])
s3 = set(['.mp3', '.mp4', '.rmvb', '.mkv', '.mp3'])  # 使用 set(),接收一个列表
print(s3)
set(['.mp3', '.mkv', '.rmvb', '.mp4'])

说说Python集合的那些事儿

2. 遍历集合

s = {'a', 'b', 'c', 'a', 'd', 'b'}
for e in s:
    print(e)

说说Python集合的那些事儿

3. 添加元素

add() 方法可以将元素添加到 set 中,可以重复添加,但没有效果。

s = {'a', 'b', 'c', 'a', 'd', 'b'}
print(s)
set(['a', 'c', 'b', 'd'])
s.add('e')
print(s)
set(['a', 'c', 'b', 'e', 'd'])
s.add('a')
print(s)
set(['a', 'c', 'b', 'e', 'd'])
s.add(4)
print(s)
set(['a', 'c', 'b', 4, 'd', 'e'])

说说Python集合的那些事儿

4. 删除元素

remove() 方法可以删除集合中的元素, 但是删除不存在的元素,会抛出 KeyError,可改用 discard()

例子:

s = {'a', 'b', 'c', 'a', 'd', 'b'}
print(s)
set(['a', 'c', 'b', 'd'])
s.remove('a')  # 删除元素 'a'
print(s)
set(['c', 'b', 'd'])
s.remove('e')  # 删除不存在的元素,会抛出 KeyError

说说Python集合的那些事儿

s = {'a', 'b', 'c', 'a', 'd', 'b'}
print(s)
set(['a', 'c', 'b', 'd'])
s.remove('a')  # 删除元素 'a'
print(s)
set(['c', 'b', 'd'])
s.discard('e')  # 删除不存在的元素, 不会抛出 KeyError

说说Python集合的那些事儿

三、交集/并集/差集

Python 中的集合也可以看成是数学意义上的无序和无重复元素的集合,因此,我们可以对两个集合作交集、并集等。

看看例子:

s1 = {1, 2, 3, 4, 5, 6}
s2 = {3, 6, 9, 10, 12}
s3 = {2, 3, 4}
print(s1 & s2 ) # 交集
set([3, 6])
print(s1 | s2)  # 并集
set([1, 2, 3, 4, 5, 6, 9, 10, 12])
print(s1 - s2)  # 差集
set([1, 2, 4, 5])
print(s3.issubset(s1))  # s3 是否是 s1 的子集

print(s3.issubset(s2))  # s3 是否是 s2 的子集

print(s1.issuperset(s3))  # s1 是否是 s3 的超集

print(s1.issuperset(s2))  # s1 是否是 s2 的超集

说说Python集合的那些事儿

四、总结

本文主要介绍了Python的另外一种形式(集合),通过讲解集合中如何去创建集合,遍历集合,解释了两种常见的集合操作,添加元素和删除元素。最后通过一个小项目,介绍了集合之间中的三种关系。希望能够帮助大家更好的学习。

浅析装饰器的那些事儿

一、装饰器的简单定义

外层函数返回里层函数的引用,里层函数引用外层函数的变量。

二、装饰器的作用

通俗来讲装饰器的作用就是在不改变已有函数代码前提下,为该函数增加新的功能。

def run():
   print('我会跑')
fun()

现在我想在原有函数的基础上新增一个功能:我会唱歌。这个时候利用装饰器则轻松可以帮我们实现这个功能。

三、实例理解

(1)不传参的装饰器

def outer(fun):
   def inner():
      fun()  //fun是外层函数的变量,在inner里面用
   return inner //inner就是里层函数的引用

(2)传递参数的装饰器:

def func(fun):
   def add(*args,**kwarge):
      return fun(*args,**kwargs)
   return add

现在对于装饰器的基本格式有一定的了解,就可以直接写函数了。下面实现文章开头的 我会唱歌 的功能

def outer(fun):
    def inner(*args, **kwarge):
        print("我会唱歌")
        return fun(*args, **kwarge)
    return inner

四、如何使用装饰器

方法一:使用@符号+装饰器的名字   把它放在想要装饰函数的上一行即可
@outer
def run():
   print('我会跑')
   
run()




方法二:
def run():
    print('我会跑')


run=outer(run)   #就等价于@outer
run()


最终打印结果是:
我会唱歌
我会跑

如果我想知道fun 传递的参数是什么,在装饰器内部可以使用如下方式:

def outer(fun):
    a = 1
    def inner(*args, **kwarge): # args是一个数组,kwargs一个字典
        print(fun.__name__) #打印fun接收的函数的名字
        print("我会唱歌")
        return fun(*args, **kwarge)
    return inner

但是如果我们 print(run.__name__,6666666) 输出的结果是inner,并不是我们想要的run,这里的函数被warpTheFunction替代了。它重写了我们函数的名字和注释文档(docstring)。解决方法如下:

from functools import wraps


def outer(fun):
    @wraps(fun)
    def inner(*args, **kwargs):
        print(fun.__name__,11111111111)
        print("我会唱歌")
        return fun(*args, **kwargs)
    return inner


@outer
def run():
   print('我会跑')
   
 print(run.__name__,6666666)  //输出结果为 run 666666

五、自己实现装饰器

def subuser_keymanage(view_func):
    '''功能是实现用户管理权限的判定'''
    def _wrapper_view(request, *args, **kwargs):
        user = request.user #一个Customer对象,包含了用户名/密码等信息
        customer = user.customer.customer_id #用户的id
        select_status = get_curuser_permission(user=user, customer=customer)#调用函数返回的值有两种0和1
        if not select_status:#如果返回0表示没有权限,返回错误码
            return render_response(request, ErrorCode.FAILED)
        return view_func(request, *args, **kwargs)
    return _wrapper_view
@subuser_keymanage 
def generate_subuser_ak_sk(request):
    params = json.loads(request.body) #获取卡前端传递的参数
    user_id_only = params.get("user_id") #获取用户表示id值
    中间代码就忽略了......
    return render_response(request, ErrorCode.FAILED)

六、装饰器小结

通过装饰器很大程度上可以减少代码的复用,在代码规范中这一点是很重要的。

以上就是装饰器的基本知识,即便没有任何基础,按照作者的思路,套用固定的格式,不需要完全理解,只要按照流程一步一步就能写出高端大气上档次的装饰器了,恭喜你!

前方高能请注意:装饰器传参,三层嵌套函数一般用的比较少,其实也不难,一层一层看,跟上文讲的一样,仅作为知识的拓宽。

import logging
def use_logging(level):
    def decorator(func):
        def wrapper(*args, **kwargs):
            if level == "warn":
                logging.warn("%s is running" % func.__name__)
            elif level == "info":
                logging.info("%s is running" % func.__name__)
            return func(*args)
        return wrapper


    return decorator


@use_logging(level="warn")
def foo(name='foo'):
    print("i am %s" % name)


foo()
i am foo
WARNING:root:foo is running

如果在操作过程中有任何问题,记得下面留言,我们看到会第一时间解决问题。

手把手教你用用Python爬取上道网的赞助公司名称

一、前言

上道网是一个手游发行推荐与投融资交易平台。平台聚集手游CP、手游发行、手游渠道、手游外包,投资商以及IP授权商,IP合作、一站式服务。并为之提供合作交易机会。

今天教如何去爬取上道网的赞助公司名称,方便有关人士投资。

二、实现目标

获取对应的公司名称,保存文档。

三、项目准备

软件:PyCharm

需要的库:requests,fake_useragent,time

网址:
http://www.daogame.cn/qudao-p-2.html?s=/qudao-p-{}.html

四、项目分析

如何网页访问?

http://www.daogame.cn/qudao-p-2.html?s=/qudao-p-1.html

http://www.daogame.cn/qudao-p-2.html?s=/qudao-p-2.html

http://www.daogame.cn/qudao-p-2.html?s=/qudao-p-3.html

http://www.daogame.cn/qudao-p-2.html?s=/qudao-p-4.html

点击下一页时,每增加一页p-{}.html自增加1,用{}代替变换的变量,再用for循环遍历这网址,实现多个网址请求。

五、项目实现

1. 定义一个class类继承object,定义init方法继承self,主函数main继承self。导入需要的库、请求地址。

import requests
from lxml import etree
from fake_useragent import UserAgent
import time


class Shangdao(object):
    def __init__(self):
        self.url = "http://www.daogame.cn/qudao-p-2.html?s=/qudao-p-{}.html"  #网站
    def main(self):
        pass


if __name__ == '__main__':
    Siper = Shangdao()
    Siper.main()

2. 随机产生UserAgent,防止反爬。

for i in range(1, 50):
            self.headers = {
                'User-Agent': ua.random,
            }

3. 发送请求 获取响应, 页面回调,方便下次请求。

   def get_page(self, url):
        res = requests.get(url=url, headers=self.headers)
        html = res.content.decode("utf-8")
        return html

4. 获取公司名称,for遍历。

   def page_page(self, html):
        parse_html = etree.HTML(html)
        one = parse_html.xpath('//h2/a/text()')
        for i in one:
            print(i)

5. 写入文档。

           f = open('公司.doc', 'a', encoding='utf-8')  # 以'w'方式打开文件
            f.write(str(i))

6. 调用方法,实现功能。

   def main(self):
        stat = int(input("输 入 开 始 (2开始):"))
        end = int(input("输 入 结 束:"))
        for page in range(stat, end + 1):
            url = self.url.format(page)
            print(url)
            html = self.get_page(url)
            self.page_page(html)
            print("==================第%s页爬取成功!!!!=====================" % page)

项目优化:

1. 设置时间延时。

time.sleep(1.4)

六、效果展示

点击绿色小三角运行输入起始页,终止页( 从0页开始 )。

渠道公司名,结果显示控制台。

保存文档。

七、总结

  1. 不建议抓取太多数据,容易对服务器造成负载,浅尝辄止即可。

  1. 希望通过这个项目,能够帮助了解xpath解析页面的基本流程,字符串是如何拼接,format函数如何运用。

  2. 本文基于Python网络爬虫,利用爬虫库,实现爬取上道网,但是到自己动手实现的时候,总会有各种各样的问题,切勿眼高手低,勤动手,才可以理解的更加深刻。

    看完本文有收获?请转发分享给更多的人

    IT共享之家

    入群请在微信后台回复【入群】

    ——————- End ——————-

    往期精彩文章推荐: