5.1 Python 基础知识 Selenium 3+Python 3 自动化测试
第 5 章 Selenium 元素定位
自 Selenium 2.0 之后,WebDriver 就出现在大众的视野中。它是一种利用浏览器原生的 API 封装了一些底层操作的功能,使得它作为一套框架更容易使用。Selenium 支持多种编程语言如 Python、Java、PHP 等。本书采用 Python 3 语言,在开始自动化测试之前有必要先了解一些 Python 基础知识,而后学习 Selenium 八大定位。
5.1 Python 基础知识
Python 是跨平台、开源免费的高级编程语言之一,在自动化测试行业内使用比较广泛。它支持伪编译,可以将 Python 源程序转换为字节码来提高性能。Python 也支持将多语言程序无缝拼装(比如 Python 调用 C 程序代码),这样可以更好地发挥不同工具或语言的优势来满足不同的需求。本节将简单介绍在 Selenium 中经常用到的 Python 基础知识。
Python 变量,变量不需要事先声明变量名和数据类型,可以直接赋值使用,并且适用于任意类型的对象。变量的类型也是随时变化的。如下面的例子:
在定义变量名时,要注意的事项如下:
· 变量名定义须以字母或下画线开头。
· 变量名中不能包含空格及标点符号(括号、引号、逗号、问号、句号等)。
· 不能使用关键字作为变量名,对于关键字可以在导入 keyword 模块后,执行「print(keyword.kwlist)」查看。
· 变量名对英文的大小写敏感。
对象模型在 Python 中是一个非常重要的概念,在 Python 中处理的一切都是对象,比如内置对象和非内置对象。内置对象可以直接调用,非内置对象需要导入相关的模块才可以使用。
5.1.1 数字类型
类型名称有 int、float、complex,分别是整型、浮点型和复杂型数字的类型。Python 中的数字大小没有限制,并且支持复数及其相关计算。如整型「1234」、复数型「4+5j」。这里常用的整型按照进制分为二进制、八进制、十进制和十六进制。
· 二进制,必须以「0b」开头,如 0b101 等。
· 八进制,必须以「0o」,如 0o23、0o12 等。
· 十进制,最常用,如 123、-5、0
· 十六进制,必须以「0x」开头,如 0x11、0xfb 等。
5.1.2 字符串类型
在 Python 中,字符串可以用双引号或单引号来指定,如「上海」或者『上海』。测试代码如下:
以上代码执行之后的结果如图 5.1 所示,代码的第 3 行和第 4 行是对字符串的切片操作,其作用是分别打印字符串中的第 2 个汉字和第 1 个汉字。
图 5.1
在 Python 中会经常用到特殊字符,和其他开发语言一样,需要转义。Python 常用的转义表如图 5.2 所示。
图 5.2
5.1.3 常用的判断与循环语句
作为一门编程语言,基本的判断与循环功能是必须的。比较常用的判断语句如「if」。下面以一个简单的例子来说明 Python 中判断语句的用法,代码如下:
以上代码输出结果为「数字等于 10」。需要注意的有以下两点:
(1)if、elif 及 else 关键字的写法。
(2)每个判断语句都是以冒号「:」结尾的,注意代码中涉及的标点符号都是英文符号。
以上是 if 判断语句的用法,比较容易掌握。
Python 中的 for 循环运用也比较广泛。比如要处理一批 Python 对象(特别是有关联的对象)时,需要对列表、集合内的所有元素进行处理,就要运用 for 循环语句来提高代码效率。下面举例说明 for 的用法,代码如下:
以上代码用两种方法实现了用 for 循环遍历列表元素,都能实现遍历元素的目的:其中第一种方法采用直接遍历元素的方式;而第二种方法采用通过列表下标的方式来获取列表元素。
这里用到了 range()函数。Python 中的 range()函数功能很强大。正如官方 API 描述的那样,如果你需要在一连串的数字上进行迭代,那么内置的 range()函数是一个好的选择。在上例中,「len(list1)」的意思是获取列表的长度,如在上例中列表的长度为「4」;「range(4)」表示 0、1、2、3 这 4 个数字组成的列表,但其实该函数返回的是一个可迭代对象(range 对象),而不是一个列表,这样也是为了节约内存空间。Range 函数在 Python 中运用非常广泛,语法如下:
range(start,stop,step)
参数说明:
start:计数是从 start 开始的,默认是从 0 开始的。
stop:计数到 stop 结束,但是不包括 stop 自身。
step:步长,默认为 1。
range()函数的测试代码如下:
以上测试代码执行的结果如图 5.3 所示,运行结果和预期一致。
图 5.3
5.1.4 集合
集合的类型名称为「set」或「frozenset」。所有的元素放到一对大括号中,元素之间用逗号隔开,且元素不允许重复。set 集合的元素是可变的,而 frozenset 集合的元素是不可变的。
Python 中的集合一般有如下特性:
· 无序。
· 集合中的元素必须是不可变类型。
创建集合的方法可以直接赋值,也可以运用 set 方法,具体如下代码所示:
以上创建集合代码的执行结果如图 5.4 所示,从遍历集合元素的结果可以看出,集合拥有无序的特性。
图 5.4
集合的相关运算包括子集、并集、交集和差集等运算。
子集运算的示例代码如下,执行结果如图 5.5 所示。
图 5.5
以下的示例代码将介绍并集、交集和差集的用法。并集是指与操作符相关的集合的所有元素的集合,去掉重复的元素。交集是指两个集合,由其中既属于 A 集合又属于 B 集合的元素组成的集合。差集(比如 A 集合与 B 集合的差集)是指由所有属于 A 集合但不属于 B 集合的元素所组成的集合。
以上代码的执行结果如图 5.6 所示。
图 5.6
5.1.5 列表对象
在 Python 中,列表是非常重要的概念之一。在运用 Python 进行自动化测试的过程中,列表的使用极其广泛。因此,需要重点掌握它的基本用法。列表的类型名称为「list」,有些类似于其他编程语言的数组。所有的元素都被一对方括号包含,元素之间使用英文逗号分隔,并且它们可以是不同的类型。Python 列表的功能和 C 语言的数值相似,但是 Python 的列表的使用更加灵活简单。在单个列表中,其列表元素可以是不同的数据类型,包括整型数字、浮点型数字、字符串,以及对象等。典型的列表写法如下:
list_1 = [3,6,9,”selenium”,”8.9093”,[“a”,”B”,”C”,”abc”]]
示例:打印出列表 list_1,代码如下。
以上示例代码的执行结果如图 5.7 所示。
图 5.7
Python 提供了三种方法向列表对象中添加元素。
(1)append()方法:实现在列表的最后添加一个元素,并且一次只能添加一个元素。示例代码如下:
以上代码的执行结果如图 5.8 所示。
图 5.8
(2)extend()方法:实现一次添加多个元素功能,新添加的元素也是在列表的最后的位置。示例代码如下:
以上代码的执行结果如图 5.9 所示。
图 5.9
(3)insert()方法:实现在特定位置上添加元素。这里的位置是指元素所在列表中的位置索引号。注意,索引号是从 0 开始的。示例代码如下:
以上代码的执行结果如图 5.10 所示,实现了在列表的第一个位置上添加元素「0」。
图 5.10
删除列表元素的操作在 Python Selenium 中也会经常碰到,下面介绍常用的三种方法。
(1)remove()方法:删除列表中的特定元素。例如,假定在列表 list_1 中有一个元素值是「3」,如果要删除它,代码可以写成「list_1.remove(3)」,示例代码如下:
以上代码的执行结果如图 5.11 所示,成功地删除了列表元素「3」。
图 5.11
(2)del 方法:删除列表中指定位置的元素。例如,如果要删除列表 list_1 中位置序号为 1 的元素,代码可以写成「del list_1[1]」,示例代码如下:
以上代码的执行结果如图 5.12 所示,成功地删除了位置序号为 1 的元素,也就是列表中的第 2 个元素。
图 5.12
(3)pop()方法:将列表中的最后一个元素返回,并将其从列表中删除。示例代码如下:
以上代码的执行结果如图 5.13 所示,成功地返回了列表的最后一个元素「-9」并删除。
图 5.13
列表分片:是指获取列表中的部分元素作为一个新的列表元素。示例代码如下:
以上代码执行成功,列表分片操作的预期结果如图 5.14 所示。
图 5.14
接下来,列举三种常用的列表操作符:
(1)+:作用是多个列表直接进行拼接。示例代码如下:
以上代码执行结果如图 5.15 所示,拼接后的列表元素是列表 1 和列表 2 的综合。
图 5.15
(2)*:作用是实现列表的成倍数的复制和添加,示例代码如下:
以上代码的执行结果如图 5.16 所示,将列表 list_1 中的元素复制 3 倍后返回新列表。
图 5.16
(3)> 和 <:作用是比较数据型列表的元素。示例代码如下:
以上代码的执行结果如图 5.17 所示,list_1 的元素是小于 list_2 的。