对比

web自动化测试技术方案的对比

  1. 自动化控制浏览器
  2. 自动化控制页面内容
  3. 执行高级的指令(js代码)

搭建Selenium自动化测试环境

Web自动化测试原理:

Python > 浏览器 ×

Python > selenium > 浏览器驱动 > 浏览器

关键:

  1. selenium
  2. 浏览器驱动

安装selenium

这里简单介绍我安装的插件和版本,详情可以去看我的另一篇文章 配置 Selenium

这里再推荐一个浏览器驱动下载网站:

python 3.10

1
pip install selenium

安装浏览器驱动

  1. 操作系统类型:Windows
  2. 浏览器类型:chrome
  3. 浏览器版本:107.0.5304.122

一件搭建自动化环境

webdriver_helper:

  1. 自动判断浏览器类型,版本,操作系统
  2. 自动选择和下载浏览器驱动
  3. 自动启动浏览器

下载包:

使用方式:

1
2
3
4
from webdriver_helper import get_webdriver

# 启动浏览器,默认的是chrome
driver = get_webdriver("firefox")

这里再说明一下,如果你用的是默认的Google chrome,可以不用在括号里面添加chrome(可填可不填),如果你想用Firefox浏览器,就在括号里面添加浏览器名。

使用简单代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
from webdriver_helper import get_webdriver
import time

# 启动浏览器,默认的是chrome
driver = get_webdriver("firefox")

# 访问被测页面
url = "https://baidu.com"
driver.get(url)

time.sleep(10)

driver.quit()

对浏览器的控制

selenium是【面向对象】思路 来提供自动化操作:

  1. 获取数据:访问对象的属性
  2. 操作数据:调用对象的方法

元素定位

参数使用方法:

方法作用
maximize_window()窗口最大化
get(url)跳转指定页面
refresh()刷新
back()后退
forward()前进
get_screenshot_as_png()截图的base64内容
get_screenshot_as_file(path)截图保存到文件
current_url网址
page_source源码
current_window_handle当前窗口
window_handles所有窗口
switch_to.alert处理弹窗
switch_to.frame(“frame_name”)切换框架
switch_to.window(“window_name”)切换窗口

简单使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from webdriver_helper import get_webdriver
import time

# 启动浏览器,默认的是chrome
driver = get_webdriver("chrome")

# 访问被测页面
url = "https://baidu.com"
driver.get(url)

# 最大化窗口
driver.maximize_window()

# 获取窗口大小
print(driver.get_window_rect())

# 获取当前网站
print(driver.current_url)

# 获取所有窗口
print(driver.window_handles)

# 强制等待
time.sleep(3)

# 退出浏览器
driver.quit()

Selenium提供了8个定位策略:

定位器描述
id定位id属性于搜索值匹配的元素(整个网页唯一性)
name定位name属性与搜索值匹配的元素
tag name定位标签名称与搜索匹配的元素
class name定位属性与搜索值匹配的元素(不允许使用复合类名)
link text定位link text可视文本与搜索值完全匹配的锚元素
partial link text定位link text可视文本部分与搜索部分匹配的锚点元素
xpath定位于XPath表达匹配的元素
css selector定位CSS选择器匹配的元素

核心思想:从页面中无数的元素中,定位指定的那一个

根据属性进行定位:

1
2
3
4
5
6
7
8
9
10
<!-- tag_name -->
<input
type="text"
class="s_ipt"
name="wd"
id="kw"
maxlength="100"
autocomplete="off"
>
<!-- id 属性,整个网页唯一性 -->
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from webdriver_helper import get_webdriver
from selenium.webdriver.common.by import By
import time

# 启动浏览器,默认的是chrome
driver = get_webdriver()

# 访问被测页面
url = "https://baidu.com"
driver.get(url)

# 定位
# el = driver.find_element(By.TAG_NAME,"input") # 定位标签名称
el = driver.find_element(By.ID,"kw") # 定位 id 属性
# el = driver.find_element(By.NAME,"wd") # 定位 name 属性
# el = driver.find_element(By.LINK_TEXT,"新闻") # 定位 link text 可视文本(完全匹配)
# el = driver.find_element(By.PARTIAL_LINK_TEXT,"图") # 定位 link text 属性元素(部分匹配)

# 打印元素的标签类型
print(el.tag_name)

# 强制等待
time.sleep(3)

# 退出浏览器
driver.quit()

文本定位

定位到的都是a标签 超链接

1
<a href="http://image.baidu.com/" target="_blank" class="mnav c-font-normal c-color-t">图片</a>

表达式定位

根据表达式进行定位 所有元素

CSS选择器

XPath

  1. XPath基本语法

    1
    2
    3
    4
    5
    6
    7
    //*[@id="su"]

    //* 从任意节点 定位任意id属性等于元素
    //*[@id="su"]

    //*[@id="kw"]
    /html/body/div[1]/div[2]/div[5]/div[1]/div/form/span[1]
参数释义
字符含义
input选择所有的input元素
*选择所有的元素
/从当前中选择元素
//从当前节点及以下的任意节点中选择元素
.当前节点
..父节点
@根据属性进行筛选元素
[n]返回列结果第N项目
  1. XPath函数

    • text:获取文本,进行精确匹配
    • contains:对文本进行模糊匹配
    • starts-with:对文本进行起始内容匹配(模糊匹配)

对元素的控制

selenium通过【面向对象】方式提供自动化控制。

  • 属性
  • 方法

对浏览器的控制:WebDriver对象的调用

对元素的控制:WebElement对象的调用

属性内容例子
id唯一标记36f-6a18
tag_name标签名input
location元素坐标{‘x’:198,’y’:188}
size元素大小{‘height’:44,’width’:548}
rect元素范围{‘height’:44,’width’:548,‘x’:198,’y’:188}
parentWebDriver实例
screenshot_as_base64()截图base64内容iVBORw0KGgoAAAAN……
screenshot_as_png()截图二进制内容b’\x89PNG\r\n\x1a\n\x00.…..
get_attribute(name)获取元素的HTML属性
value_of_css_property获取CSS属性
click()点击
clear()清空内容
send_keys(content)输入内容

基础操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
from webdriver_helper import get_webdriver
from selenium.webdriver.common.by import By
import time

# 启动浏览器,默认的是chrome
driver = get_webdriver()

# 访问被测页面
url = "https://baidu.com"
driver.get(url)

# 最大化窗口
driver.maximize_window()

# 获取定位属性
el = driver.find_element(By.XPATH,'//*[@id="kw"]') # 输入框
el.send_keys("百度翻译") # 输入内容

el = driver.find_element(By.XPATH,'//*[@id="su"]') # 搜索按钮
el.click() # 点击

print(el.tag_name) # 打印元素的标签类型
print(el.screenshot_as_base64) # 获取 base64
print(el.screenshot_as_png) # 获取截图二进制内容
print(el.value_of_css_property) # 获取 css 属性

# 截图保存
el.screenshot("./image/el.png")

# 获取窗口大小
print(driver.get_window_rect())

# 获取当前网站
print(driver.current_url)

# 获取所有窗口
print(driver.window_handles)

# 强制等待
time.sleep(3)

# 退出浏览器
driver.quit()

Web自动化实战

  1. 打开被测页面
  2. 输入关键字
  3. 点击搜索按钮
  4. 遍历搜索结果
  5. 断言 搜索结果都包含指定的关键字
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
from webdriver_helper import get_webdriver
from selenium.webdriver.common.by import By
import time

# 打开浏览器
driver = get_webdriver() # 默认使用Google chrome,如需要用 Firefox,在括号内加入
# 强制等待
time.sleep(1)

# 窗口最大化
driver.maximize_window()

wd = "手机"
# 打开被测页面
url = "https://www.jd.com/"
driver.get(url)

el = driver.find_element(By.XPATH,'//*[@id="key"]') # 输入框
el.send_keys(wd) # 输入内容

el = driver.find_element(By.XPATH,'//*[@id="search"]/div/div[2]/button') # 定位
el.click() # 点击

# 强制等待
time.sleep(9)

# 同时定位到 N 个元素
# //*[@id="J_goodsList"]/ul/li[2]/div/div[4]/a/em
# //*[@id="J_goodsList"]/ul/li[3]/div/div[4]/a/em
# //*[@id="J_goodsList"]/ul/li[4]/div/div[4]/a/em
good_list = driver.find_elements(By.XPATH,'//*[@id="J_goodsList"]/ul')
print(good_list) # 遍历结果

for goods in good_list:
print(goods.text)
assert wd in goods.text # 断言

# 强制等待
time.sleep(3)

"""
1. 打开被测页面
2. 输入关键字
3. 点击搜索按钮
4. 遍历搜索结果
5. 断言 搜索结果都包含指定的关键字
"""

# 退出浏览器
driver.quit()