当前位置: 首页 > news >正文

Selenium WebDriver - 浏览器交互

本文翻译整理自:https://www.selenium.dev/documentation/webdriver/interactions/


文章目录

    • 一、获取浏览器信息
      • 1、获取头衔
      • 2、获取当前URL
    • 二、浏览器导航
      • 1、导航到
      • 2、后退
      • 3、往前
      • 4、刷新
    • 三、JavaScript警报、提示和确认
      • 1、警报
      • 2、确认
      • 3、提示
    • 四、使用cookie
      • 1、添加Cookie
      • 2、命名Cookie
      • 3、获取所有Cookie
      • 4、删除Cookie
      • 5、删除所有Cookie
      • 6、同站Cookie属性
      • 7、Strict
      • 8、Lax
    • 五、使用IFrames和框架
      • 1、使用WebElement
      • 2、使用姓名或ID
      • 3、使用索引
      • 5、留下一个框架
    • 六、使用窗口和选项卡
      • 1、窗口和选项卡
      • 2、获取窗口手柄
      • 3、切换窗口或选项卡
      • 4、关闭窗口或选项卡
      • 5、创建新窗口(或)新选项卡并切换
      • 6、在会话结束时退出浏览器
      • 7、窗口管理
        • 获取窗口大小
        • 设置窗口大小
        • 获取窗口位置
      • 8、Set window position
        • 最大化窗口
        • 最小化窗口
        • 全屏窗口
        • 截屏
        • TakeElementScreenshot
        • 执行脚本
        • 打印页面
    • 七、虚拟认证器
      • 1、虚拟身份验证器选项
      • 2、添加虚拟身份验证器
      • 3、删除虚拟身份验证器
      • 4、创建居民凭证
      • 5、创建非居民凭证
      • 6、添加凭据
      • 7、获取凭据
      • 8、删除凭据
      • 9、删除所有凭据
      • 10、设置用户验证


一、获取浏览器信息


1、获取头衔

您可以从浏览器读取当前页面标题:

title = driver.title

在GitHub上查看完整示例


2、获取当前URL

您可以使用以下命令从浏览器的地址栏中读取当前URL:

url = driver.current_url

在GitHub上查看完整示例


二、浏览器导航


1、导航到

启动浏览器后,您要做的第一件事就是打开您的网站。
这可以在一行中实现:

driver.get("https://www.selenium.dev/selenium/web/index.html")

在GitHub上查看完整示例


2、后退

按下浏览器的后退按钮:

driver.back()

在GitHub上查看完整示例


3、往前

按下浏览器的转发按钮:

driver.forward()

在GitHub上查看完整示例


4、刷新

刷新当前页面:

driver.refresh()

在GitHub上查看完整示例


三、JavaScript警报、提示和确认

WebDriver提供了一个API,用于处理JavaScript提供的三种类型的本机弹出消息。
这些弹出窗口由浏览器设置样式并提供有限的自定义功能。


1、警报

其中最简单的称为警报,它显示 自定义消息和一个关闭警报的按钮,标记为 在大多数浏览器中为OK。
它也可以在大多数浏览器中通过 按下关闭按钮,但这总是会做同样的事情 OK按钮。
请参阅示例警报。

WebDriver可以从弹出窗口中获取文本并接受或关闭这些警报。

element = driver.find_element(By.LINK_TEXT, "See an example alert")
element.click()wait = WebDriverWait(driver, timeout=2)
alert = wait.until(lambda d : d.switch_to.alert)
text = alert.text
alert.accept()

在GitHub上查看完整示例


2、确认

确认框类似于警报,除了用户也可以选择 取消消息。
请参阅示例确认。

此示例还显示了存储警报的不同方法:

  element = driver.find_element(By.LINK_TEXT, "See a sample confirm")driver.execute_script("arguments[0].click();", element)wait = WebDriverWait(driver, timeout=2)alert = wait.until(lambda d : d.switch_to.alert)text = alert.textalert.dismiss()

在GitHub上查看完整示例


3、提示

提示类似于确认框,除了它们还包含文本 输入。
与处理表单元素类似,您可以使用WebDriver的 发送密钥以填写响应。
这将完全取代占位符 文本。
按下取消按钮不会提交任何文本。
请参见示例提示符。

element = driver.find_element(By.LINK_TEXT, "See a sample prompt")
driver.execute_script("arguments[0].click();", element)wait = WebDriverWait(driver, timeout=2)
alert = wait.until(lambda d : d.switch_to.alert)
alert.send_keys("Selenium")
text = alert.text
alert.accept()

在GitHub上查看完整示例


四、使用cookie

cookie是从网站发送并存储在您的计算机中的一小块数据。
Cookie主要用于识别用户并加载存储的信息。

WebDriver API提供了一种使用内置方法与cookie交互的方法:


1、添加Cookie

它用于将cookie添加到当前浏览上下文。
添加Cookie只接受一组定义的可序列化JSON对象。
这里是可接受JSON键值列表的链接

首先,您需要在cookie所在的域中 有效。
如果您之前尝试预设cookie 您开始与网站交互,并且您的主页很大/需要一段时间才能加载 另一种选择是在网站上找到一个较小的页面(通常404页面很小, 例如http://example.com/some404page)

from selenium import webdriverdriver = webdriver.Chrome()driver.get("http://www.example.com")# Adds the cookie into current browser context
driver.add_cookie({"name": "key", "value": "value"})

2、命名Cookie

它返回与所有关联cookie中的cookie名称匹配的序列化cookie数据。

from selenium import webdriverdriver = webdriver.Chrome()# Navigate to url
driver.get("http://www.example.com")# Adds the cookie into current browser context
driver.add_cookie({"name": "foo", "value": "bar"})# Get cookie details with named cookie 'foo'
print(driver.get_cookie("foo"))

3、获取所有Cookie

它为当前浏览上下文返回“成功序列化的cookie数据”。
如果浏览器不再可用,它会返回错误。

from selenium import webdriverdriver = webdriver.Chrome()# Navigate to url
driver.get("http://www.example.com")driver.add_cookie({"name": "test1", "value": "cookie1"})
driver.add_cookie({"name": "test2", "value": "cookie2"})# Get all available cookies
print(driver.get_cookies())

4、删除Cookie

它会删除与提供的cookie名称匹配的cookie数据。

from selenium import webdriver
driver = webdriver.Chrome()# Navigate to url
driver.get("http://www.example.com")
driver.add_cookie({"name": "test1", "value": "cookie1"})
driver.add_cookie({"name": "test2", "value": "cookie2"})# Delete a cookie with name 'test1'
driver.delete_cookie("test1")

5、删除所有Cookie

It deletes all the cookies of the current browsing context.

from selenium import webdriver
driver = webdriver.Chrome()# Navigate to url
driver.get("http://www.example.com")
driver.add_cookie({"name": "test1", "value": "cookie1"})
driver.add_cookie({"name": "test2", "value": "cookie2"})#  Deletes all cookies
driver.delete_all_cookies()

6、同站Cookie属性

它允许用户指示浏览器控制cookie是否与第三方站点发起的请求一起发送。
它的引入是为了防止CSRF(跨站点请求伪造)攻击。

同站cookie属性接受两个参数作为指令


7、Strict

当sameSite属性设置为Strict时,cookie不会与第三方网站发起的请求一起发送。


8、Lax

当您将cookie sameSite属性设置为Lax时,cookie将与第三方网站发起的GET请求一起发送。

注意:截至目前,此功能已登陆chrome(80+版本)、Firefox(79+版本)并适用于Selenium 4及更高版本。

from selenium import webdriverdriver = webdriver.Chrome()driver.get("http://www.example.com")
# Adds the cookie into current browser context with sameSite 'Strict' (or) 'Lax'
driver.add_cookie({"name": "foo", "value": "value", 'sameSite': 'Strict'})
driver.add_cookie({"name": "foo1", "value": "value", 'sameSite': 'Lax'})
cookie1 = driver.get_cookie('foo')
cookie2 = driver.get_cookie('foo1')
print(cookie1)
print(cookie2)

五、使用IFrames和框架

框架是一种现在已弃用的从同一域上的多个文档构建站点布局的方法。
除非您使用HTML5之前的webapp,否则您不太可能使用它们。
iframe允许从完全不同的域插入文档,并且仍然常用。

如果您需要使用框架或iframe,WebDriver允许您以相同的方式使用它们。
考虑iframe中的一个按钮。
如果我们使用浏览器开发工具检查元素,我们可能会看到以下内容:

<div id="modal"><iframe id="buttonframe" name="myframe"  src="https://seleniumhq.github.io"><button>Click here</button></iframe>
</div>

如果不是iframe,我们希望使用以下内容单击按钮:

# This Wont work
driver.find_element(By.TAG_NAME, 'button').click()

但是,如果iframe之外没有按钮,您可能会收到no this元素错误。
发生这种情况是因为Selenium只知道顶级文档中的元素。
要与按钮交互,我们需要首先切换到框架,就像我们如何切换窗口一样。
WebDriver提供了三种切换到框架的方法。


1、使用WebElement

使用WebElement进行切换是最灵活的选择。
您可以使用首选选择器找到框架并切换到它。

# Store iframe web element
iframe = driver.find_element(By.CSS_SELECTOR, "#modal > iframe")# switch to selected iframe
driver.switch_to.frame(iframe)# Now click on button
driver.find_element(By.TAG_NAME, 'button').click()

2、使用姓名或ID

如果您的帧或iframe具有id或name属性,则可以使用此属性。
如果名称或ID在页面上不是唯一的,则会切换到找到的第一个。

# Switch frame by id
driver.switch_to.frame('buttonframe')# Now, Click on the button
driver.find_element(By.TAG_NAME, 'button').click()

3、使用索引

也可以使用帧的索引,例如可以在JavaScript中使用windows. frame进行查询。

# switching to second iframe based on index
iframe = driver.find_elements(By.TAG_NAME,'iframe')[1]# switch to selected iframe
driver.switch_to.frame(iframe)

5、留下一个框架

要离开iframe或框架集,请切换回默认内容,如下所示:

# switch back to default content
driver.switch_to.default_content()

六、使用窗口和选项卡


1、窗口和选项卡


2、获取窗口手柄

WebDriver不区分窗口和选项卡。
如果您的站点打开了一个新选项卡或窗口,Selenium将允许您使用窗口句柄来使用它。
每个窗口都有一个唯一标识符,该标识符在单个会话中保持不变。
您可以使用以下命令获取当前窗口的窗口句柄:

driver.current_window_handle

3、切换窗口或选项卡

单击在 新窗口 将新窗口或选项卡聚焦在屏幕上,但WebDriver不会知道是哪个 操作系统认为处于活动状态的窗口。
使用新窗口 您需要切换到它。
为此,我们获取所有窗口手柄, 并将它们存储在一个数组中。
数组位置按顺序填写 窗口启动。
所以第一个位置将是默认浏览器,依此类推。

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECwith webdriver.Firefox() as driver:# Open URLdriver.get("https://seleniumhq.github.io")# Setup wait for laterwait = WebDriverWait(driver, 10)# Store the ID of the original windoworiginal_window = driver.current_window_handle# Check we don't have other windows open alreadyassert len(driver.window_handles) == 1# Click the link which opens in a new windowdriver.find_element(By.LINK_TEXT, "new window").click()# Wait for the new window or tabwait.until(EC.number_of_windows_to_be(2))# Loop through until we find a new window handlefor window_handle in driver.window_handles:if window_handle != original_window:driver.switch_to.window(window_handle)break# Wait for the new tab to finish loading contentwait.until(EC.title_is("SeleniumHQ Browser Automation"))

4、关闭窗口或选项卡

当您完成一个窗口或选项卡并且它不是浏览器中打开的最后一个窗口或选项卡时,您应该关闭它并切换回您之前使用的窗口。
假设您遵循上一节中的代码示例,您将把之前的窗口句柄存储在一个变量中。
把这些放在一起,你会得到:

#Close the tab or window
driver.close()#Switch back to the old tab or window
driver.switch_to.window(original_window)

关闭窗口后忘记切换回另一个窗口句柄将使WebDriver在现已关闭的页面上执行,并将触发无此类窗口异常。
您必须切换回有效的窗口句柄才能继续执行。


5、创建新窗口(或)新选项卡并切换

创建一个新窗口(或)选项卡,并将新窗口或选项卡聚焦在屏幕上。
您无需切换以使用新窗口(或)选项卡。
如果您打开了两个以上的窗口(或)选项卡,而不是新窗口,您可以循环覆盖WebDriver可以看到的两个窗口或选项卡,并切换到不是原始窗口或选项卡的窗口或选项卡。

注意:此功能适用于Selenium 4及更高版本。

# Opens a new tab and switches to new tab
driver.switch_to.new_window('tab')# Opens a new window and switches to new window
driver.switch_to.new_window('window')

6、在会话结束时退出浏览器

完成浏览器会话后,您应该调用退出,而不是关闭:

driver.quit()
  • 退出将:
    • 关闭与该WebDriver会话关联的所有窗口和选项卡
    • 关闭浏览器进程
    • 关闭后台驱动进程
    • 通知Selenium Grid浏览器不再使用,以便其他会话可以使用它(如果您使用的是Selenium Grid)

未能调用退出将在您的机器上留下额外的后台进程和端口,这可能会在以后给您带来问题。

一些测试框架提供了方法和注释,您可以将其挂钩以在测试结束时拆除。

# unittest teardown
# https://docs.python.org/3/library/unittest.html?highlight=teardown#unittest.TestCase.tearDown
def tearDown(self):self.driver.quit()

如果不在测试上下文中运行WebDriver,您可以考虑使用 try / finally,这是由大多数语言提供,以便一个例外 仍将清理WebDriver会话。

try:
#WebDriver code here...
finally:driver.quit()

Python的WebDriver现在支持python上下文管理器, 当使用with关键字时,可以自动退出驱动程序 执行结束。

with webdriver.Firefox() as driver:# WebDriver code here...# WebDriver will automatically quit after indentation

7、窗口管理

屏幕分辨率会影响您的Web应用程序的呈现方式,因此WebDriver提供了移动和调整浏览器窗口大小的机制。


获取窗口大小

获取浏览器窗口的大小(以像素为单位)。

# Access each dimension individually
width = driver.get_window_size().get("width")
height = driver.get_window_size().get("height")# Or store the dimensions and query them later
size = driver.get_window_size()
width1 = size.get("width")
height1 = size.get("height")

设置窗口大小

恢复窗口并设置窗口大小。

driver.set_window_size(1024, 768)

获取窗口位置

获取浏览器窗口左上角的坐标。

# Access each dimension individually
x = driver.get_window_position().get('x')
y = driver.get_window_position().get('y')# Or store the dimensions and query them later
position = driver.get_window_position()
x1 = position.get('x')
y1 = position.get('y')

8、Set window position

将窗口移动到所选位置。

# Move the window to the top left of the primary monitor
driver.set_window_position(0, 0)

最大化窗口

放大窗口。
对于大多数操作系统,窗口将填满屏幕,而不会阻塞操作系统自己的菜单和工具栏。

driver.maximize_window()

最小化窗口

最小化当前浏览上下文的窗口。
此命令的确切行为特定于各个窗口管理器。

最小化窗口通常将窗口隐藏在系统托盘中。

注意:此功能适用于Selenium 4及更高版本。

driver.minimize_window()

全屏窗口

填满整个屏幕,类似于在大多数浏览器中按F11。

driver.fullscreen_window()

截屏

用于捕获当前浏览上下文的屏幕截图。
WebDriver端点屏幕截图 返回以Base64格式编码的屏幕截图。

from selenium import webdriverdriver = webdriver.Chrome()driver.get("http://www.example.com")# Returns and base64 encoded string into image
driver.save_screenshot('./image.png')driver.quit()

TakeElementScreenshot

用于捕获当前浏览上下文的元素的屏幕截图。
WebDriver端点屏幕截图 返回以Base64格式编码的屏幕截图。

from selenium import webdriver
from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()driver.get("http://www.example.com")ele = driver.find_element(By.CSS_SELECTOR, 'h1')# Returns and base64 encoded string into image
ele.screenshot('./image.png')driver.quit()

执行脚本

在选定框架或窗口的当前上下文中执行JavaScript代码片段。

# Stores the header element
header = driver.find_element(By.CSS_SELECTOR, "h1")# Executing JavaScript to capture innerText of header element
driver.execute_script('return arguments[0].innerText', header)

打印页面

在浏览器中打印当前页面。

注意:这要求Chromium浏览器处于无头模式

from selenium.webdriver.common.print_page_options import PrintOptionsprint_options = PrintOptions()
print_options.page_ranges = ['1-2']driver.get("printPage.html")base64code = driver.print_page(print_options)

七、虚拟认证器

Web身份验证器模型的表示。

Web应用程序可以启用称为Web身份验证的基于公钥的身份验证机制,以无密码方式对用户进行身份验证。
Web身份验证定义了允许用户创建公钥凭证并向身份验证器注册的API。
身份验证器可以是存储用户公钥凭据并根据请求检索它们的硬件设备或软件实体。

顾名思义,Virtual Authenticator模拟此类身份验证器进行测试。


1、虚拟身份验证器选项

虚拟身份验证器具有一组属性。
这些属性在Selenium绑定中映射为VirtualAuthenticatorOptions。

options = VirtualAuthenticatorOptions()
options.is_user_verified = True
options.has_user_verification = True
options.is_user_consenting = True
options.transport = VirtualAuthenticatorOptions.Transport.USB
options.protocol = VirtualAuthenticatorOptions.Protocol.U2F
options.has_resident_key = False

在GitHub上查看完整示例


2、添加虚拟身份验证器

它使用提供的属性创建一个新的虚拟身份验证器。

options = VirtualAuthenticatorOptions()
options.protocol = VirtualAuthenticatorOptions.Protocol.U2F
options.has_resident_key = False# Register a virtual authenticator
driver.add_virtual_authenticator(options)

在GitHub上查看完整示例


3、删除虚拟身份验证器

删除先前添加的虚拟身份验证器。

options = VirtualAuthenticatorOptions()# Register a virtual authenticator
driver.add_virtual_authenticator(options)# Remove virtual authenticator
driver.remove_virtual_authenticator()

在GitHub上查看完整示例


4、创建居民凭证

使用给定的必需凭据参数创建常驻(有状态)凭据。

options = VirtualAuthenticatorOptions()
options.protocol = VirtualAuthenticatorOptions.Protocol.CTAP2
options.has_resident_key = True
options.has_user_verification = True
options.is_user_verified = True# Register a virtual authenticator
driver.add_virtual_authenticator(options)# parameters for Resident Credential
credential_id = bytearray({1, 2, 3, 4})
rp_id = "localhost"
user_handle = bytearray({1})
privatekey = urlsafe_b64decode(BASE64__ENCODED_PK)
sign_count = 0# create a  resident credential using above parameters
resident_credential = Credential.create_resident_credential(credential_id, rp_id, user_handle, privatekey, sign_count)

在GitHub上查看完整示例


5、创建非居民凭证

使用给定的必需凭据参数创建常驻(无状态)凭据。


6、添加凭据

向身份验证器注册凭据。


7、获取凭据

返回身份验证器拥有的凭据列表。


8、删除凭据

根据传递的凭据ID从身份验证器中删除凭据。


9、删除所有凭据

从身份验证器中删除所有凭据。


10、设置用户验证

设置身份验证器是模拟用户验证成功还是失败。


2024-06-17(一)

相关文章:

  • 大模型参数高效微调学习笔记
  • 从0开发一个Chrome插件:用户反馈与更新 Chrome 插件
  • C++面向对象三大特性--多态
  • Java程序之简单“记事本”
  • 【感悟】世界著名五大学习法
  • C# OpenCvSharp 图像处理函数-颜色通道-cvtColor
  • ViT:5 Knowledge Distillation
  • ADB获取当前正在显示的Activity和Fragment
  • 使用 select 进行 UART 通信的注意事项
  • godot所有2D节点介绍
  • 【C语言】--- 常见调试信息预处理器宏
  • 全面解析:C# 委托的实质性应用与优势
  • windows11子系统Ubuntu 22.04.4子安装图形化界面
  • 在Linux中如何解决程序崩溃的问题
  • linux高级编程(1)
  • 【笔记】你不知道的JS读书笔记——Promise
  • 08.Android之View事件问题
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • Invalidate和postInvalidate的区别
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • Material Design
  • Node项目之评分系统(二)- 数据库设计
  • Vue.js-Day01
  • vue-cli3搭建项目
  • 使用 Docker 部署 Spring Boot项目
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 一份游戏开发学习路线
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • # 数据结构
  • #13 yum、编译安装与sed命令的使用
  • (23)Linux的软硬连接
  • (arch)linux 转换文件编码格式
  • (C++17) std算法之执行策略 execution
  • (补充)IDEA项目结构
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (原)Matlab的svmtrain和svmclassify
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转)重识new
  • .Net 6.0 处理跨域的方式
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .Net Remoting常用部署结构
  • .NET 依赖注入和配置系统
  • .NET4.0并行计算技术基础(1)
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • .NET面试题(二)
  • .NET中GET与SET的用法
  • .php结尾的域名,【php】php正则截取url中域名后的内容
  • @Autowired 与@Resource的区别
  • @Autowired和@Resource的区别
  • [.net]官方水晶报表的使用以演示下载
  • [AIGC] 如何建立和优化你的工作流?
  • [C/C++]关于C++11中的std::move和std::forward
  • [Deepin] 简单使用 RustDesk 实现远程访问Deepin