本文翻译整理自:https://www.selenium.dev/documentation/webdriver/interactions/
文章目录
一、获取浏览器信息
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.text
alert.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 webdriver
driver = 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 webdriver
driver = 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 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"})# Get all available cookiesprint(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 webdriver
driver = 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中的一个按钮。
如果我们使用浏览器开发工具检查元素,我们可能会看到以下内容:
<divid="modal"><iframeid="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 EC
with webdriver.Firefox()as driver:# Open URL
driver.get("https://seleniumhq.github.io")# Setup wait for later
wait = WebDriverWait(driver,10)# Store the ID of the original window
original_window = driver.current_window_handle
# Check we don't have other windows open alreadyassertlen(driver.window_handles)==1# Click the link which opens in a new window
driver.find_element(By.LINK_TEXT,"new window").click()# Wait for the new window or tab
wait.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 content
wait.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.tearDowndeftearDown(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 webdriver
driver = 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 By
driver = 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 PrintOptions
print_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(一)
版权归原作者 AI工程化 所有, 如有侵权,请联系我们删除。