【学习笔记】Selenium 与浏览器交互
学习目的
了解浏览器交互的作用和用法。
第一部分:获取浏览器信息
获取标题
从浏览器中读取当前页面的标题:
title = driver.title
获取当前URL
从浏览器的地址栏读取当前的 URL:
url = driver.current_url
第二部分:浏览器导航
打开网站
启动浏览器后你要做的第一件事就是打开你的网站:
driver.get(url)
后退
按下浏览器的后退按钮:
driver.back()
前进
按下浏览器的前进按钮:
driver.forward()
刷新
刷新当前页面:
driver.refresh()
第三部分:弹窗处理
- WebDriver提供了一个API, 用于处理JavaScript提供的警告框,提示框和确认框这三种类型的原生弹窗。
- 警告框显示一条自定义消息和一个用于关闭该警告的按钮,WebDriver可以从弹窗获取文本并接受或关闭这些警告。
- 确认框类似于警告框, 不同之处在于用户还可以选择取消。
- 提示框还包括文本输入,与处理表单元素类似, 可以使用WebDriver的sendKeys来输入。
# 等待警告框出现
alert = wait.until(expected_conditions.alert_is_present())
# 将警告信息存在变量中
text = alert.text
# 向弹窗内输入信息
alert.send_keys("")
# 点击按钮确认
alert.accept()
# 点击按钮拒绝
alert.dismiss()
说明:
在wait.until(expected_conditions.alert_is_present())
中:
wait.until: 创建一个WebDriverWait对象wait,它将等待页面加载。
expected_conditions.alert_is_present():等待条件,检查当前页面上是否有一个JavaScript警告框(alert)存在。
第四部分:Cookies
Cookie是从网站发送并存储在您的计算机中的一小段数据,主要用于识别用户并加载存储的信息,WebDriver API提供了一种内置的方法来控制Cookie:
# 引入webdriver
from selenium import webdriver
#初始化浏览器
driver = webdriver.Edge()
#初始化页面
driver.get("http://www.example.com")
# 为页面添加cookie
driver.add_cookie({"name": "key", "value": "value", 'sameSite': 'Strict'or'Lax'})
# 获取指定name的cookie
print(driver.get_cookie("name"))
# 获取全部cookie
print(driver.get_cookies())
# 删除指定name的cookie
driver.delete_cookie("name")
# 删除全部cookie
driver.delete_all_cookies()
cookie语句参数说明:driver.add_cookie({})
参数 | 描述 |
---|---|
name | 必需。规定 cookie 的名称。 |
value | 必需。规定 cookie 的值。 |
expire | 可选。规定 cookie 的有效期。 |
domain | 可选。规定 cookie 的域名, |
path | 可选。规定 cookie的有效范围,这个参数domain参数基础上的有效范围,如果path设置为”/”,那就是在整个domain都有效。 |
secure | 可选。规定cookie是否仅通过安全的https,值为0或1。如果值为1,则cookie只能在https连接上有效,默认值为0,表示cookei在http和https连接上都有效。(0或1,也可表示Flase或True) |
httpOnly | 可选。通过js脚本将无法读取到cookie信息,这样能有效的防止XSS攻击(跨站脚本攻击),这样就增加了cookie的安全性,即便是这样,也不要将重要信息存入cookie。 |
第五部分:frames框架处理
在WebDriver中,frames和iframe处理方式相同。如果我们定位的元素在iframe里,那么可能会得到一个no such element 无此元素
的错误,要想与iframe内的元素交互,我们首先需要切换到iframe里。WebDriver 提供了三种切换到iframe的方法。
# 使用页面元素进行切换是最灵活的选择,可以使用元素选择器找到框架并切入。
# 存储网页元素
iframe = driver.find_element(By.CSS_SELECTOR, "#modal > iframe")
# 切换到选择的 iframe
driver.switch_to.frame(iframe)
# 如果您的frame或iframe具有id或name属性,则可以使用该属性进行切入。
# 如果name或id 在页面上不是唯一的,那么将切入到第一个匹配的框架里。
driver.switch_to.frame('ID')
# 还可以使用frame的索引进行切换。
# 基于索引切换到第 2 个 iframe
iframe = driver.find_elements(By.TAG_NAME,'iframe')[1]
# 切换到选择的 iframe
driver.switch_to.frame(iframe)
# 离开iframe或frameset,切出。
driver.switch_to.default_content()
第六部分:窗口事件
焦点窗口
# WebDriver 没有区分窗口和标签页。
# 如果你的程序打开了一个新标签页或窗口,Selenium会赋予他一个唯一的标识符—句柄
# 句柄在窗口未关闭时不会丢失。
# 获取当前窗口的句柄:
driver.current_window_handle
# 获取浏览器所有窗口的句柄,返回一个列表,里面记录了当前浏览器所有的窗口句柄
handles=driver.window_handles
# 按照句柄切换窗口
driver.switch_to.window(handles[number])
# 打开新标签页并切换焦点到新标签页
driver.switch_to.new_window('tab')
# 打开一个新窗口并切换焦点到新窗口
driver.switch_to.new_window('window')
# 切回到上一个标签页或窗口
driver.switch_to.window(original_window)
#关闭当前标签页或窗口
driver.close()
# 退出浏览器
driver.quit()
注意:退出将会:
关闭所有与 WebDriver 会话相关的窗口和标签页。
结束浏览器进程。
结束后台驱动进程。
窗口管理
窗口尺寸管理
获取浏览器窗口的大小(以像素为单位)。
# 分别获取每个尺寸
width = driver.get_window_size().get("width")
height = driver.get_window_size().get("height")
# 或者存储尺寸并可以随时查询
size = driver.get_window_size()
width = size.get("width")
height = size.get("height")
# 设置窗口大小
driver.set_window_size(width, height)
# 最大化窗口
driver.maximize_window()
# 最小化窗口
driver.minimize_window()
# 全屏窗口,类似于在大多数浏览器中按下 F11
driver.fullscreen_window()
窗口位置管理
# 获取浏览器窗口的坐标,基于窗口和屏幕左上角
# 分别获取每个坐标
x = driver.get_window_position().get('x')
y = driver.get_window_position().get('y')
# 或者存储坐标并可以随时查询
position = driver.get_window_position()
x1 = position.get('x')
y1 = position.get('y')
# 将窗口移动到指定的位置
driver.set_window_position(x, y)
其他窗口操作
屏幕截图:用于捕获当前浏览窗口位置的上下文的屏幕截图。
driver.save_screenshot('./image.png')
元素屏幕截图:用于捕获当前浏览窗口指定元素位置的上下文的屏幕截图。
# 元素选择器
ele = driver.find_element(By.CSS_SELECTOR, 'h1')
# 截图
ele.screenshot('./image.png')
执行脚本:在当前frame或者窗口的上下文中,执行JavaScript代码片段。
# 元素选择器
header = driver.find_element(By.CSS_SELECTOR, "h1")
# 在指定元素中执行JS代码片段
driver.execute_script('return arguments[0].innerText', header)
这个我之前搞的时候还必须指定的浏览器版本才能驱动起来。主要是网页端测试了,一般是累计性更新才用,要不压力测试。主要是接口测试了,这种界面的要测试的点不多。
这个其实适合低定制的平台,比如我前公司做高校教务,各高校的报考审核系统功能区别不大,就可以沿用基础平台的自动化用例。而教务系统定制程度比较高,就不能沿用,只能把所有用例放进用例库里,测试的时候再从库里找,甚至新功能要重新写用例。
回想起被要求写自动化测试脚本的恐惧
成熟的系统应该会自己生成测试脚本
不明觉厉
羡慕
啊,羡慕什么
羡慕
大佬