【学习笔记】Selenium 与浏览器交互

学习目的

了解浏览器交互的作用和用法。

第一部分:获取浏览器信息

获取标题

从浏览器中读取当前页面的标题:

title = driver.title

获取当前URL

从浏览器的地址栏读取当前的 URL:

url = driver.current_url

第二部分:浏览器导航

打开网站

启动浏览器后你要做的第一件事就是打开你的网站:

driver.get(url)

后退

按下浏览器的后退按钮:

driver.back()

前进

按下浏览器的前进按钮:

driver.forward()

刷新

刷新当前页面:

driver.refresh()

第三部分:弹窗处理

  1. WebDriver提供了一个API, 用于处理JavaScript提供的警告框,提示框和确认框这三种类型的原生弹窗。
  2. 警告框显示一条自定义消息和一个用于关闭该警告的按钮,WebDriver可以从弹窗获取文本并接受或关闭这些警告。
  3. 确认框类似于警告框, 不同之处在于用户还可以选择取消。
  4. 提示框还包括文本输入,与处理表单元素类似, 可以使用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)