使用 webdriver API 编写自动化脚本的基本语法

简介: 1. 打开和关闭浏览器1)打开浏览器并访问 URL2)关闭浏览器窗口2. 元素的定位1)以 id 定位元素2)以 name 定位元素3)以 tag name 定位元素4)以 class name 定位元素5)以 xpath 定位元素6)以 css selector 定位元素7)以 link text 定位元素8)以 partial link text 定位元素3. 操作测试元素1)键盘输入与鼠标点击2)submit 提交表单3)获取元素内容4. 添加等待1)sleep 休眠2)智能等待5. 打印网页 title 和 URL6. 浏览器操作1)设置浏览器

1. 打开和关闭浏览器

引入 webdriver API

from selenium import webdriver

在所有的对浏览器操作之前都要先获取浏览器驱动

# 获取 Chrome 浏览器驱动
driver = webdriver.Chrome()

1)打开浏览器并访问 URL

打开浏览器访问百度主页

driver.get("https://www.baidu.com/")

2)关闭浏览器窗口

下面两种方法都可以实现关闭浏览器的操作

但 close 方法仅仅关闭当前聚焦的浏览器窗口,quit 方法关闭所有浏览器窗口,并清除浏览器缓存


driver.quit()
driver.close()

2. 元素的定位

元素的定位是自动化测试的核心,要操作一个元素,首先就要先定位到该元素


webdriver 中提供了一系列使用元素不同属性定位元素的方法:


id

name

tag name

class name

xpath

link text

partial link text

css selector

在网页源代码中找到对应的属性值,就可以定位该元素


注:不管用哪种方法,都要保证在当前页面上该属性值是唯一的

1)以 id 定位元素

定位 id 属性值为 kw 的元素

driver.find_element_by_id("kw")


2)以 name 定位元素

定位 name 属性值为 wd 的元素

driver.find_element_by_name("wd")


3)以 tag name 定位元素

定位标签名为 input 的元素

driver.find_element_by_tag_name("input")

4)以 class name 定位元素

定位 class name 属性值为 s_ipt 的元素

driver.find_element_by_class_name("s_ipt")
• 1


5)以 xpath 定位元素

在浏览器 控制台中找到要定位的元素右键 选择 复制 XPath 来获取对应元素的 XPath 属性值


98.png


定位 xpath 属性值为 //*[@id=‘kw’] 的元素

driver.find_element_by_xpath("//*[@id='kw']")

6)以 css selector 定位元素

css selector 属性值的获取方式同 xpath 属性值的获取方式一样,点击 复制 selector 即可获取

定位 css selector 属性值为 #kw 的元素

driver.find_element_by_css_selector("#kw")


7)以 link text 定位元素

这种方式用来定位带有链接的文字,link text 属性值就是文字内容

driver.find_element_by_link_text("贴吧")


8)以 partial link text 定位元素

这种方式也是定位带有链接的文字,不过不同于上一种方法的是,这里的属性值可以是页面上具体文字链接内容的一部分

driver.find_element_by_partial_link_text("贴")


3. 操作测试元素

前面说了常用的定位元素的方法,定位只是第一步,定位之后需要对元素进行操作以完成测试


webdriver 中常用的操作元素的方法有:


click: 点击元素

send_keys: 模拟键盘在元素中输入内容

clear: 清空元素内容

submit: 提交

text: 得到元素内的文本信息

1)键盘输入与鼠标点击

from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
# 在百度搜索框中输入 python
driver.find_element_by_id("kw").send_keys("python")
# 点击搜索按钮
driver.find_element_by_id("su").click()
# 清空搜索框内容
driver.find_element_by_id("kw").clear

2)submit 提交表单

submit 只能在元素属性中 type=“sumit” 时使用,此时使用 submit 实现的效果和 click 点击相同

driver.find_element_by_id("kw").submit()
• 1

3)获取元素内容


使用 text 可以获取到已经定位的元素内所有的文本信息

text = driver.find_element_by_class_name("c-container").text
print(text)

4. 添加等待

等待是一个非常重要的事,由于网络延迟的问题,有时候页面还未加载出来时,但是代码已经执行到下一步,下一步的代码要定位的元素还未被浏览器加载出来,就无法定位导致出错,此时就需要添加等待来等待浏览器将页面加载出来再进行定位


添加等待还可以让我们更直观的看到浏览器执行的每一步

1)sleep 休眠

引入 time 包,在指定休眠时间即可

import time
time.sleep(3)


2)智能等待

通过 webdriver 下的 implicitly_wait() 方法就可以实现智能等待


智能等待 是指程序会在一个时间范围内等待,当脚本执行到某个元素的定位时,如果可以定位则等待结束,如果不能定位,则会继续等待,直到等待时间超过设置的最大等待时间

driver.implicitly_wait(3) # 最大等待时间 3s


5. 打印网页 title 和 URL

# 打印当前网页 URL
print(driver.current_url)
# 打印当前网页 title,即在 html 源码中 title 标签中的文字信息
print(driver.title)


6. 浏览器操作

1)设置浏览器窗口的宽和高

# 设置浏览器宽 400,高 1000
driver.set_window_size(400, 1000)


2)设置浏览器窗口最大化

driver.maximize_window()


3)浏览器页面的前进和后退

每个浏览器都会有前进和后退按钮,来操作浏览器返回下一个或上一个页面

# 后退,返回上一个页面
driver.back()
# 前进,返回下一个页面
driver.forward()


4)控制浏览器滚动条

浏览器滚动条的控制需要依靠 js 脚本

# 把滚动条拉到最底端
js1 = "var q=document.documentElement.scrollTop=10000"   
driver.execute_script(js1)
# 把滚动条拉到最顶端
js2 = "var q=document.documentElement.scrollTop=0"       
driver.execute_script(js2)

7. 键盘操作

要使用键盘操作,必须引入 Keys 包

键盘操作的按键通过 send_keys 调用,必须要先定位元素再操作

from selenium.webdriver.common.keys import Keys


1)键盘按键

# TAB 键
driver.find_element_by_id("user_login").send_keys(Keys.TAB)
# ENTER 键 
driver.find_element_by_id("user_password").send_keys(Keys.ENTER)
# 空格键
driver.find_element_by_id("user_login").send_keys(Keys.SPACE)
# ESC 键
driver.find_element_by_id("user_login").send_keys(Keys.ESCPACE)

2)组合键盘按键

# Ctrl + a,全选
driver.find_element_by_id("kw").send_keys(Keys.CONTROL, "a")
# Ctrl + x,剪切
driver.find_element_by_id("kw").send_keys(Keys.CONTROL, "x")
# Ctrl + c,复制
driver.find_element_by_id("kw").send_keys(Keys.CONTROL, "c")
# Ctrl + v,粘贴
driver.find_element_by_id("kw").send_keys(Keys.CONTROL, "v")

8. 鼠标事件

要使用鼠标操作,需要引入 ActionChains 包

同样的,需要先定位元素再进行操作

from selenium.webdriver.common.action_chains import ActionChains
# 鼠标双击
b = driver.find_element_by_id("su")
ActionChains(driver).double_click(b).perform()
# 鼠标右键
a = driver.find_element_by_id("kw")
ActionChains(driver).context_click(a).perform()
# 拖动鼠标到指定位置
a = driver.find_element_by_xpath("//*[@id='s-top-left']/div/a")   # 定位移动后的位置
ActionChains(driver).move_to_element(a).perform()

9. 定位一组元素

1)如何打开本地 HTML 页面

本地 HTML 页面打开时,在浏览器的 URL 显示为 “file:///” + 文件的绝对路径,所以我们需要拼接以下再进行打开


引入 os 包,使用 os.path.abspath(文件绝对路径) 来指定一个绝对路径,再使用字符串拼接的方法将前缀 “file:///” 加上,就得到了我们想要的URL


2)定位一组 checkbox

有如下 HTML 代码,需从中定位所有 checkbox 类型的 input,并全部勾选


<html>
<head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8" />
    <title>Checkbox</title>
</head>
<body>
<h3>checkbox</h3>
<div class="well">
    <form class="form-horizontal">
        <div class="control-group">
            <label class="control-label" for="c1">checkbox1</label>
            <div class="controls">
                <input type="checkbox" id="c1" />
            </div>
        </div>
        <div class="control-group">
            <label class="control-label" for="c2">checkbox2</label>
            <div class="controls">
                <input type="checkbox" id="c2" />
            </div>
        </div>
        <div class="control-group">
            <label class="control-label" for="c3">checkbox3</label>
            <div class="controls">
                <input type="checkbox" id="c3" />
            </div>
        </div>
        <div class="control-group">
            <label class="control-label" for="r">radio</label>
            <div class="controls">
                <input type="radio" id="r1" />
            </div>
        </div>
        <div class="control-group">
            <label class="control-label" for="r">radio</label>
            <div class="controls">
                <input type="radio" id="r2" />
            </div>
        </div>
    </form>
</div>
</body>
</html>

自动化脚本如下:

import os
import time
from selenium import webdriver
# 获取浏览器驱动
driver = webdriver.Chrome()
# 拼接 URL
url = "file:///" + os.path.abspath("D:\\JAVA\\Python\\project\\selenium\\test2.html")
# 打开 HTML 页面
driver.get(url)
# 定位所有的 input 标签,得到的结果是一个 list
elements = driver.find_elements_by_tag_name("input")
for element in elements:
    # 在 list 中筛选 checkbox 并勾选
    # get_attribute 得到元素的某一个属性值
    if element.get_attribute("type") == "checkbox":
        element.click()
        time.sleep(1)
time.sleep(3)
driver.quit()

10. 多层框架/窗口定位

在 HTML 页面的设计中,常常会有框架的嵌套,或者在操作浏览器时常常会出现多个窗口,此时若可以定位到某个具体的框架或者窗口,再去定位元素就会简单许多


100.png


1)多层框架定位

webdriver 中提供了下面两种方法来对框架进行定位

# 定位到当前页面内嵌套的某个框架
driver.switch_to.frame(frameName)
# 从嵌套中跳出,跳回最外面的默认页面
driver.switch_to.default_content()

注意:


在框架之间进行跳转时,只能从当前页面跳转到当前页面内嵌套的页面


如上图的框架嵌套:


default 可以跳转到 f1,不能到 f2


f1 可以到 f2,f2 不能到 f1


2)多窗口定位

webdriver 中针对窗口的方法是:switch_to.window


用法以 switch_to.frame 相同


11. alert 弹框的处理

webdriver 中提供了如下方法对 alert 弹框进行定位:


switch_to.alert: 定位到弹框

定位到弹框之后再使用如下方法对 alert 弹框进行处理:


accept: 点击确认按钮

dismiss: 点击取消按钮,如果有的话

send_keys: 向弹框中的输入框输入值,如果没有输入框就不可用

text: 获取弹框中的文字信息


目录
相关文章
|
8天前
|
监控 数据管理 测试技术
实现API接口的自动化
API接口自动化测试的最佳实践包括确定测试范围和目标、编写测试用例、选择合适的自动化测试工具、搭建测试环境、编写自动化测试脚本、执行自动化测试、分析测试结果和回归测试。通过这些步骤,可以提高测试效率和质量,确保API的稳定性和可靠性。此外,还介绍了如何利用API接口测试工具进行性能测试和压力测试,以及常见的挑战和解决方案。
|
5天前
|
存储 Python
Python自动化脚本编写指南
【10月更文挑战第38天】本文旨在为初学者提供一条清晰的路径,通过Python实现日常任务的自动化。我们将从基础语法讲起,逐步引导读者理解如何将代码块组合成有效脚本,并探讨常见错误及调试技巧。文章不仅涉及理论知识,还包括实际案例分析,帮助读者快速入门并提升编程能力。
23 2
|
7天前
|
运维 监控 Python
自动化运维:使用Python脚本简化日常任务
【10月更文挑战第36天】在数字化时代,运维工作的效率和准确性成为企业竞争力的关键。本文将介绍如何通过编写Python脚本来自动化日常的运维任务,不仅提高工作效率,还能降低人为错误的风险。从基础的文件操作到进阶的网络管理,我们将一步步展示Python在自动化运维中的应用,并分享实用的代码示例,帮助读者快速掌握自动化运维的核心技能。
19 3
|
8天前
|
安全 测试技术 API
如何实现API接口的自动化测试?
实现API接口的自动化测试涉及多个关键步骤:确定测试范围和目标、编写测试用例、选择自动化测试工具、搭建测试环境、编写测试脚本、执行测试、分析结果和回归测试。选择合适的工具和考虑团队熟悉度是成功的关键。常用工具包括Postman、JMeter和SoapUI。通过这些步骤和工具,可以有效提高测试效率和质量,确保API的稳定性和可靠性。
|
13天前
|
运维 监控 应用服务中间件
自动化运维:如何利用Python脚本提升工作效率
【10月更文挑战第30天】在快节奏的IT行业中,自动化运维已成为提升工作效率和减少人为错误的关键技术。本文将介绍如何使用Python编写简单的自动化脚本,以实现日常运维任务的自动化。通过实际案例,我们将展示如何用Python脚本简化服务器管理、批量配置更新以及监控系统性能等任务。文章不仅提供代码示例,还将深入探讨自动化运维背后的理念,帮助读者理解并应用这一技术来优化他们的工作流程。
|
14天前
|
运维 监控 Linux
自动化运维:如何利用Python脚本优化日常任务##
【10月更文挑战第29天】在现代IT运维中,自动化已成为提升效率、减少人为错误的关键技术。本文将介绍如何通过Python脚本来简化和自动化日常的运维任务,从而让运维人员能够专注于更高层次的工作。从备份管理到系统监控,再到日志分析,我们将一步步展示如何编写实用的Python脚本来处理这些任务。 ##
|
18天前
|
运维 Prometheus 监控
自动化运维之路:从脚本到DevOps
【10月更文挑战第25天】在数字化时代的浪潮中,运维不再是简单的服务器管理,而是成为了企业竞争力的核心。本文将带你走进自动化运维的世界,探索如何通过技术手段提升效率和稳定性,以及实现快速响应市场的能力。我们将一起学习如何从基础的脚本编写进化到全面的DevOps实践,包括工具的选择、流程的优化以及文化的建设。无论你是运维新手还是资深专家,这篇文章都将为你提供有价值的见解和实用的技巧。
17 3
|
19天前
|
JSON 测试技术 持续交付
自动化测试与脚本编写:Python实践指南
自动化测试与脚本编写:Python实践指南
24 1
|
1月前
|
人工智能 运维 Devops
自动化运维之路:从脚本到DevOps的转变
【10月更文挑战第7天】在这篇文章中,我们将一起探索自动化运维的演变历程,从最初的简单脚本到现代的DevOps实践。我们将深入理解自动化如何改变了运维工作的本质,并讨论实现这一转变的关键技术和策略。文章将不包含代码示例,而是聚焦于理念、工具和方法论的介绍,旨在为读者提供一个全面的自动化运维框架视图。
|
1月前
|
人工智能 运维 监控
自动化运维:从脚本到工具的演变之路
【10月更文挑战第8天】在数字化时代的浪潮中,运维不再是简单的硬件维护,它已经演变成一场关于效率、稳定性和创新的技术革命。本文将带您领略自动化运维的魅力,从最初的脚本编写到现代复杂的自动化工具,我们将一探究竟,看看这些工具如何帮助运维人员简化日常任务,提升工作效率,并最终推动业务发展。