使用 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: 获取弹框中的文字信息


目录
相关文章
|
5天前
|
存储 Shell Linux
快速上手基于 BaGet 的脚本自动化构建 .net 应用打包
本文介绍了如何使用脚本自动化构建 `.net` 应用的 `nuget` 包并推送到指定服务仓库。首先概述了 `BaGet`——一个开源、轻量级且高性能的 `NuGet` 服务器,支持多种存储后端及配置选项。接着详细描述了 `BaGet` 的安装、配置及使用方法,并提供了 `PowerShell` 和 `Bash` 脚本实例,用于自动化推送 `.nupkg` 文件。最后总结了 `BaGet` 的优势及其在实际部署中的便捷性。
38 10
|
6天前
|
Web App开发 数据采集 存储
WebDriver与Chrome DevTools Protocol:如何在浏览器自动化中提升效率
本文探讨了如何利用Chrome DevTools Protocol (CDP) 与 Selenium WebDriver 提升浏览器自动化效率,结合代理IP技术高效采集微博数据。通过CDP,开发者可直接操作浏览器底层功能,如网络拦截、性能分析等,增强控制精度。示例代码展示了如何设置代理IP、cookie及user-agent来模拟真实用户行为,提高数据抓取成功率与稳定性。适用于需要频繁抓取互联网数据的应用场景。
WebDriver与Chrome DevTools Protocol:如何在浏览器自动化中提升效率
|
3天前
|
数据采集 Web App开发 测试技术
使用Selenium与WebDriver实现跨浏览器自动化数据抓取
在网络爬虫领域,Selenium与WebDriver是实现跨浏览器自动化数据抓取的利器。本文详细介绍了如何利用Selenium和WebDriver结合代理IP技术提升数据抓取的稳定性和效率。通过设置user-agent和cookie来模拟真实用户行为,避免被网站检测和阻止。文章提供了具体的代码示例,展示了如何配置代理IP、设置user-agent和cookie,并实现了跨浏览器的数据抓取。合理的参数配置能有效减少爬虫被封禁的风险,提高数据抓取效率。
使用Selenium与WebDriver实现跨浏览器自动化数据抓取
|
2天前
|
Web App开发 Java 测试技术
自动化测试的利器:Selenium WebDriver入门与实践
【9月更文挑战第8天】在软件开发的海洋中,测试是确保我们不会溺水的那根救生索。Selenium WebDriver,作为自动化测试的明星工具,让这根救生索更加结实可靠。本文将带你快速上手Selenium WebDriver,从基础设置到实际操作,再到实战演练,让你的开发之旅更加平稳顺畅。
|
2天前
|
安全 JavaScript 前端开发
自动化测试的魔法:如何用Python编写你的第一个测试脚本
【8月更文挑战第41天】在软件的世界里,质量是王道。而自动化测试,就像是维护这个王国的骑士,确保我们的软件产品坚不可摧。本文将引导你进入自动化测试的奇妙世界,教你如何使用Python这把强大的魔法杖,编写出能够守护你代码安全的第一道防护咒语。让我们一起开启这场魔法之旅吧!
|
6天前
|
运维 监控 Devops
自动化运维之路:从脚本到DevOps
【9月更文挑战第4天】本文通过探索自动化在运维中的应用,揭示从简单的shell脚本到复杂的DevOps实践的转变过程。我们将讨论如何利用自动化工具来提升效率、减少错误并优化工作流程,同时分享一些实用的代码示例,帮助读者理解自动化运维的实际应用场景。
24 5
|
4天前
|
运维 监控 API
自动化运维:使用Python脚本进行日常管理
【9月更文挑战第6天】在现代的IT环境中,自动化运维已成为提升效率、减少人为错误的关键。本文将介绍如何通过Python脚本简化日常的运维任务,包括批量配置管理和日志分析。我们将从基础语法讲起,逐步深入到脚本的实际应用,旨在为读者提供一套完整的解决方案,以实现运维工作的自动化和优化。
11 1
|
6天前
|
机器学习/深度学习 人工智能 运维
自动化运维的演变之路:从脚本到智能
在数字化浪潮中,自动化运维如同一艘船,载着企业乘风破浪。本文将带你穿梭于自动化运维的历史长河,见证它如何从简单的脚本编写,发展成为今天集成了人工智能技术的智能运维平台。我们将探索这一变革背后的原因、影响以及面临的挑战,同时分享一些行业内的成功案例,为你的企业运维之旅提供启示和方向。
|
9天前
|
运维 Linux 测试技术
自动化运维:使用Python脚本简化日常任务
【8月更文挑战第34天】在快节奏的IT环境中,自动化运维成为提升效率、降低错误率的关键。本文以Python脚本为例,展示如何通过编写简单的脚本来自动化日常运维任务,如批量更改文件权限、自动备份数据等。文章不仅提供代码示例,还探讨了自动化运维带来的益处和实施时应注意的问题。
|
9天前
|
运维 监控 网络安全
自动化运维:使用Python脚本简化日常任务
【8月更文挑战第33天】在本文中,我们将深入探讨如何通过Python脚本来自动化执行常见的运维任务。从基础的服务器健康检查到复杂的部署流程,Python因其简洁和功能强大的特性,成为自动化工具的首选。文章将展示编写Python脚本的基本方法,并通过实际示例演示如何应用于真实场景,旨在帮助读者提升效率,减少重复性工作。