- Selenium 介绍
- 安装 Selenium
- 安装 geckodriver 浏览器驱动
- Selenium 的元素定位
- 点击元素
- 清空文本输入框、向文本输入框输入文本
- 获取元素属性
- 下拉页面
- 页面弹窗的定位以及弹窗文本的获取
- 窗口跳转
- iframe 定位
什么是selenium
在官网上“Selenium automates browsers. That's it!”,即“Selenium 是自动化浏览器”。
selenium通常用于功能基本稳定,没有频繁变动的网页。
安装需要的库(命令)
pip3 install --upgrade pip pip3 install selenium
实验环境
环境测试(尝试打开一个浏览器并实现相关操作)
- 打开浏览器
- 进入百度网站
- 设置窗口大小为宽 800,高 400
- 等待 3 秒
- 刷新页面
- 最大化窗口
- 退出浏览器
- 倒退页面
- 前进页面
具体代码:
#! /usr/bin/python3
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from time import sleep
# 创建 WebDriver 对象,指明使用chrome浏览器驱动
wd = webdriver.Chrome(service=Service(r'D:\teststudy\chromedriver.exe'))
# 浏览器进入百度网站
wd.get("https://www.baidu.com")
# 设置浏览器宽800,高400
wd.set_window_size(800, 400)
# 等待3秒
sleep(3)
# 刷新页面
wd.refresh()
# 等待3秒
sleep(3)
# 最大化窗口
wd.maximize_window()
# 进入另一个网站
wd.get("https://blog.csdn.net/")
sleep(3)
# 后退到上一个页面--百度网站
wd.back()
sleep(3)
# 前进到下一个页面--CSDN网站
wd.forward()
sleep(3)
# 退出浏览器
wd.quit()
常见的定位元素及其对应方法
id | find_element(By.ID)() |
name | find_element(By.NAME)() |
class name | find_element_by_class_name() |
tag name | find_element_by_tag_name() |
link text | find_element_by_link_text() |
partial link text | find_element_by_partial_link_text() |
xpath | find_element_by_xpath() |
css selector | find_element_by_css_selector() |
操作名称 | 使用方法 | 示例 |
点击 | click() | find_element_by_xx().click() |
清空文本框 | clear() | find_element_by_xx().clear() |
输入文本框
| .send_keys(“内容”) | find_element_by_xx().send_keys("内容") |
文本信息 | .text | find_element_by_xx().text |
元素尺寸 | .size | find_element_by_xx().size |
其他属性 | .get_attribute("属性名") | find_element_by_xx()..get_attribute("想获取的属性名") |
注:上述列表后三项为获取元素属性的操作
注:查看元素的各个属性可通过 Chrome 自带的开发者工具
,快捷键为F12
,通过元素查看器
定位到想查看的元素,然后在开发者工具中查看具体的属性名,如class
、type
、id
等。
js = 'document.documentElement.scrollTop=具体的下拉高度值;'
页面弹窗 alert 的定位:driver.switch_to.alert
alert = driver.switch_to.alert
# 查看alert中的文字
print(alert.text)
# 点击确定
alert.accept()
# 点击取消(如果有)
alert.dismiss()
切换窗口:.switch_to.window()
# 获取窗口所有句柄
all_handles = driver.window_handles
# 获取当前窗口句柄
curr_window = driver.current_window_handle
# 遍历所有句柄
for k in all_handles:
# 如果不是当前窗口句柄
if k != curr_window:
# 窗口句柄切换
driver.switch_to.window(k)
定位 iframe:
- .switch_to.frame():切换到 iframe
- .switch_to.default_content(): 切换出 iframe
iframe = driver.find_element_by_xpath() # 切换到iframe driver.switch_to.frame(iframe) ...页面操作代码... # 跳出iframe driver.switch_to.default_content()
常用的测试方法包括:
等价类
、边界值
、正交排列
、因果图
、场景法
。
Xpath知识与实战
如何通过浏览器插件获取元素的xpath以及在特殊情况下自己写xpath
xpath使用路径表达式在XML文档中进行导航
(F12会弹出开发者工具)
表达式 | 描述 |
---|---|
/ | 从根节点选取 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 |
. | 选取当前节点 |
.. | 选取当前节点的父节点 |
@ | 选取属性 |
* | 匹配任何元素节点 |
分析一下这个 xpath://*[@id="header-navbar-collapses"]/ul[1]/li[3]/a
//
即从当前选择的文档节点开始*
匹配任何元素节点[@id="header-navbar-collapses"]
通过id
属性确认当前文档开始的节点位置,即从id
为header-navbar-collapses
的位置开始/
这个斜杠没有打头,所以这里意思是下一级
ul[1]
这里方括号中的1
表示第一个ul
标签。注意:xpath 中的标签数从 1 开始li[3]
表示第三个li
标签
“登录”的 xpath://*[@id="header-navbar-collapses"]/ul[2]/li[2]/a
//
即从当前选择的文档节点开始*
匹配任何元素节点[@id="header-navbar-collapses"]
通过id
属性确认当前文档开始的节点位置/
斜杠没有用作开头,所以这里是下一级
的意思ul[2]
定位到上面id
属性下一层的第二个ul
标签li[2]
定位到ul
下一层的第二个li
标签a
定位到li
标签下一层的a
标签
有时候我们用复制来的 xpath 并不能定位到我们想要的元素,原因在于有一些网站的id
元素属性也是变化的。这时候我们就只能自己来写 xpath 了。
2.4.1 例子一
我们来定位“实验楼”这个图片元素的 xpath,看到的 HTML 文档结构如下图:
分析:
分析:
- 目标元素是
img
标签 - 从
img
标签往上查找文档,看有没有唯一的属性值,如id
。注意,class
属性值一般不是唯一的,所以一般不用class
属性作为定位元素 - 发现文档中直到文档顶部也没有属性唯一的元素,所以这里我们就从文档顶部即根节点开始
/
的意思即从根节点选取
- 所以我们可以确定 xpath 开头是
/
- 第一层是
html
标签,所以 xpath 初步确定为/html
- 第二层是
body
标签,xpath 确定为/html/body
- 目标元素在
body
标签下第三个div
中,所以 xpath 确定为/html/body/div[3]
- 下一层只有一个
div
标签,这是可以省略后面的[1]
,即/html/body/div[3]/div
- 再下一层在第二个
div
中,所以 xpath 确定为/html/body/div[3]/div/div[2]
- 依次类推,继续向下一层定位,即可确定 xpath 为
/html/body/div[3]/div/div[2]/div/nav/div[1]/a/img
2.4.2 例子二
我们来定位搜索框的 xpath,看到的 HTML 文档结构如下图:
分析:
- 目标元素是
a
标签 - 从目标元素开始往上查找属性唯一的元素
- 发现有
id
属性,且该属性值固定不变,所以可以直接利用id
属性进行定位 //
即从当前选择的文档节点开始,即//*[@id='header-navbar-collapses']
- 下一层
ul
不唯一,所以 xpath 里要写索引,即//*[@id="header-navbar-collapses"]/ul[1]
- 接下来的
li
标签也不是唯一的,所以 xpath 确定为//*[@id="header-navbar-collapses"]/ul[1]/li[1]
- 最后定位到
a
标签,所以确定 xpath 为//*[@id="header-navbar-collapses"]/ul[1]/li[1]/a