Selenium4.0详细介绍
安装
pip安装
pip install selenium
下载安装
官网下载selenium-x.x.x.tar.gz包,解压后使用setup.py安装
python setup.py install
驱动
创建驱动
driver = webdriver.Chrome(options=options)
退出会话
driver.quit()
浏览器选项
创建驱动时,options参数可以设置浏览器选项。
浏览器版本
设置浏览器版本,在最新的Selenium中,如果在系统上找不到该版本,则Selenium Manager会自动下载。
options = webdriver.ChromeOptions()
options.browser_version = 'stable'
页面加载策略
normal
默认情况下使用,等待所有资源加载完成
options.page_load_strategy = 'normal'
driver = webdriver.Chrome(options=options)
eager
DOMf访问已准备就绪,但图像等其他资源可能仍在加载中
options.page_load_strategy = 'eager'
driver = webdriver.Chrome(options=options)
none
只等待加载初始页面
options.page_load_strategy = 'none'
driver = webdriver.Chrome(options=options)
平台名称
标识远程操作系统
options.platform_name = 'any'
接受不安全证书
检查是否在会话期间使用留过期或无效的TLS证书,如果设置成false,当遇到任何域证书问题时,将返回不安全的证书错误,如果设置为true,浏览器将信任无效的证书。
options.accept_insecure_certs = True
driver = webdriver.Chrome(options=options)
超时
设置会话超时间隔。
脚本超时
在当前浏览器上下文中任何时中断正在执行的脚本。默认为30000毫秒。
options.timeouts = { 'script': 5000 }
driver = webdriver.Chrome(options=options)
页面加载超时
在当前浏览器上下文中需要加载页面的超时时间。默认为30000毫秒。如果超出设置范围,则脚本因TImeoutException停止。
options.timeouts = { 'pageLoad': 5000 }
driver = webdriver.Chrome(options=options)
隐式等待超时
定位元素时等待隐式元素位置策略的超时时间。默认为0
options.timeouts = { 'implicit': 5000 }
driver = webdriver.Chrome(options=options)
浏览器
谷歌特定功能
Arguments
常用的参数包括–start maximized、–headless=new和–user-data-dir=…
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(options=options)
options.add_argument("--start-maximized")
指定位置启动浏览器
options.binary_location = chrome_bin
添加扩展
为浏览器添加扩展程序,参数是crx文件。
options.add_extension(extension_file_path)
保持浏览器打开
只有不想驱动发送退出命令,将detach参数设置为true,浏览器在进程结束后保持打开状态。
options.add_experimental_option("detach", True)
Edge特定功能
Arguments
常用的参数包括–start maximized、–headless=new和–user-data-dir=…
options = webdriver.EdgeOptions()
driver = webdriver.Edge(options=options)
options.add_argument("--start-maximized")
指定位置启动浏览器
options.binary_location = edge_bin
添加扩展
为浏览器添加扩展程序,参数是crx文件。
options.add_extension(extension_file_path)
保持浏览器打开
只有不想驱动发送退出命令,将detach参数设置为true,浏览器在进程结束后保持打开状态。
options.add_experimental_option("detach", True)
FireFox特定功能
Arguments
常用参数报告 -headless和"-profile", “/path/to/profile”
options.add_argument("-headless")
指定位置启动浏览器
options.binary_location = firefox_bin
Profile
使用Firefox配置文件
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.firefox.firefox_profile import FirefoxProfile
options=Options()
firefox_profile = FirefoxProfile()
firefox_profile.set_preference("javascript.enabled", False)
options.profile = firefox_profile
IE特定功能
文件上次对话框超时
在某些情况下,打开IE的文件上传对话框会超时,默认时间为1000毫秒,可以使用fileUploadDialogTimeou修改。
from selenium import webdriver
options = webdriver.IeOptions()
options.file_upload_dialog_timeout = 2000
driver = webdriver.Ie(options=options)
driver.get("http://www.google.com")
driver.quit()
清除缓存
当设置为true时,此功能会清除所有正在运行的IE实例的缓存、浏览器历史记录和Cookie,包括手动启动的实例。默认为false。
from selenium import webdriver
options = webdriver.IeOptions()
options.ensure_clean_session = True
driver = webdriver.Ie(options=options)
driver.get("http://www.google.com")
driver.quit()
ignoreZoomSetting
IE驱动默认浏览器缩放级别为100%,如果不是驱动将抛出异常。通过将ignoreZoomSetting设置为true,可以禁用。
from selenium import webdriver
options = webdriver.IeOptions()
options.ignore_zoom_level = True
driver = webdriver.Ie(options=options)
driver.get("http://www.google.com")
driver.quit()
ignoreProtectedModeSettings
启动IE会话时是否跳过保护模式检查。
如果未设置,并且所有区域的保护模式设置都不相同,驱动会抛出异常。
from selenium import webdriver
options = webdriver.IeOptions()
options.ignore_protected_mode_settings = True
driver = webdriver.Ie(options=options)
driver.get("http://www.google.com")
driver.quit()
silent
当设置为true时,此功能会抑制IEDriverServer的诊断输出。
from selenium import webdriver
options = webdriver.IeOptions()
options.set_capability("silent", True)
driver = webdriver.Ie(options=options)
driver.get("http://www.google.com")
driver.quit()
命令行选项
IE包含几个命令行选项,可以对浏览器进行故障排查和配置。
-private: 用于在私密浏览模式下启动IE,适用于IE8及以上的版本。
-k:在信息亭模型下启动IE。浏览器爱最大化窗口中打开,该窗口不显示地址栏、导航按钮或状态栏。
-extoff:在无插件下启动IE,适用于IE7及以上的版本。
from selenium import webdriver
options = webdriver.IeOptions()
options.add_argument('-private')
options.force_create_process_api = True
driver = webdriver.Ie(options=options)
driver.get("http://www.google.com")
driver.quit()
forceCreateProcessApi
强制使用CreateProcess API启动Internet Explorer。默认值为false。
from selenium import webdriver
options = webdriver.IeOptions()
options.force_create_process_api = True
driver = webdriver.Ie(options=options)
driver.get("http://www.google.com")
driver.quit()
等待策略
隐式等待
Selenium有一种内置的自动等待元素的方法,称为隐式等待。隐式等待值可以通过浏览器选项中的超时功能或驱动程序方法设置。
这是一个全局设置,适用于整个会话的每个元素位置调用。默认值为0,这意味着如果找不到元素,它将立即返回错误。如果设置了隐式等待,驱动程序将在返回错误之前等待提供值的持续时间。请注意,一旦找到元素,驱动程序将返回元素引用,代码将继续执行,因此较大的隐式等待值不一定会增加会话的持续时间。
警告:不要混合隐式和显式等待。这样做可能会导致不可预测的等待时间。例如,设置10秒的隐式等待和15秒的显式等待可能会导致20秒后发生超时。
driver.implicitly_wait(2)
显式等待
显式等待是添加到代码中的循环,它在应用程序退出循环并继续执行代码中的下一个命令之前,轮询应用程序以确定特定条件是否为真。如果在指定的超时值之前未满足条件,则代码将给出超时错误。由于应用程序不处于所需状态的方式有很多,因此显式等待是一个很好的选择,可以指定在每个需要等待的地方等待的确切条件。另一个很好的特性是,默认情况下,Selenium Wait类会自动等待指定元素的存在。
wait = WebDriverWait(driver, timeout=2)
wait.until(lambda d : revealed.is_displayed())
定制化
定制化
Wait类可以用各种参数实例化,这些参数将改变条件的评估方式。
例如,如果默认情况下重试了元素不可交互错误,那么我们可以在正在执行的代码中的方法上添加一个操作(我们只需要确保代码成功时返回true):
errors = [NoSuchElementException, ElementNotInteractableException]
wait = WebDriverWait(driver, timeout=2, poll_frequency=.2, ignored_exceptions=errors)
wait.until(lambda d : revealed.send_keys("Displayed") or True)
Web元素
文件上传
因为Selenium不能与文件上传对话框交互,所以它提供了一种在不打开对话框的情况下上传文件的方法。如果元素是类型为file的输入元素,则可以使用send-keys方法发送要上传的文件的完整路径。
file_input = driver.find_element(By.CSS_SELECTOR, "input[type='file']")
file_input.send_keys(upload_file)
driver.find_element(By.ID, "file-submit").click()
定位器
Selenium为WebDriver中的这8种传统位置策略提供支持:
定位器 | 描述 |
---|---|
class name | classname查找名称包含搜索值的元素 |
css selector | 查找与css选择器匹配的元素 |
id | 查找id属性与搜索值匹配的元素 |
name | 查找name与搜索值匹配的元素 |
link text | 链接文本与搜索值匹配的元素 |
partial link text | 部分链接文本包含搜索值的锚点元素 |
tag name | 查找标记名与搜索值匹配的元素 |
xpath | 查找与xapth表达式匹配的元素 |
class name
driver = webdriver.Chrome()
driver.find_element(By.CLASS_NAME, "information")
css selector
driver = webdriver.Chrome()
driver.find_element(By.CSS_SELECTOR, "#fname")
id
driver = webdriver.Chrome()
driver.find_element(By.ID, "lname")
name
driver = webdriver.Chrome()
driver.find_element(By.NAME, "newsletter")
link text
driver = webdriver.Chrome()
driver.find_element(By.LINK_TEXT, "Selenium Official Page")
partial link text
driver = webdriver.Chrome()
driver.find_element(By.PARTIAL_LINK_TEXT, "Official Page")
tag name
driver = webdriver.Chrome()
driver.find_element(By.TAG_NAME, "a")
xpath
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.find_element(By.CLASS_NAME, "information")
相对定位器
Above
元素上方的元素
email_locator = locate_with(By.TAG_NAME, "input").above({By.ID: "password"})
Below
元素下方的元素
password_locator = locate_with(By.TAG_NAME, "input").below({By.ID: "email"})
Left of
元素左侧的元素
cancel_locator = locate_with(By.TAG_NAME, "button").to_left_of({By.ID: "submit"})
Right of
元素右侧的元素
submit_locator = locate_with(By.TAG_NAME, "button").to_right_of({By.ID: "cancel"})
Near
元素附近的元素
email_locator = locate_with(By.TAG_NAME, "input").near({By.ID: "lbl-email"})
链接定位器
submit_locator = locate_with(By.TAG_NAME, "button").below({By.ID: "email"}).to_right_of({By.ID: "cancel"})
查找元素
第一个匹配元素
许多定位器将匹配页面上的多个元素。奇异查找元素方法将返回对给定上下文中找到的第一个元素的引用。
vegetable = driver.find_element(By.CLASS_NAME, "tomatoes")
评估DOM子集
像上面的情况,如果想返回第二个元素,可以先定位到具有唯一属性的元素上,然后在该元素上再次查找元素。
fruits = driver.find_element(By.ID, "fruits")
fruit = fruits.find_element(By.CLASS_NAME,"tomatoes")
查找所有元素
有几个用例需要获取与定位器匹配的所有元素的引用,而不仅仅是第一个元素。多个find元素方法返回一组元素引用。如果没有匹配项,则返回空列表。在这种情况下,所有元素都将以集合的形式返回。
plants = driver.find_elements(By.TAG_NAME, "li")
获取元素
通常,你会得到一个元素集合,但想使用一个特定的元素,这意味着你需要迭代集合并确定你想要的元素。
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Firefox()
# Navigate to Url
driver.get("https://www.example.com")
# Get all the elements available with tag name 'p'
elements = driver.find_elements(By.TAG_NAME, 'p')
for e in elements:
print(e.text)
交互操作
点击
元素单击命令在元素的中心执行。如果元素的中心因某种原因被遮挡,Selenium将返回一个元素点击拦截错误。
# Navigate to url
driver.get("https://www.selenium.dev/selenium/web/inputs.html")
# Click on the element
driver.find_element(By.NAME, "color_input").click()
输入
元素send-keys命令将提供的键键入可编辑元素。通常,这意味着元素是具有文本类型的表单的输入元素或具有内容可编辑属性的元素。如果不可编辑,则返回无效元素状态错误。
# Navigate to url
driver.get("https://www.selenium.dev/selenium/web/inputs.html")
# Clear field to empty it from any previous data
driver.find_element(By.NAME, "email_input").clear()
# Enter Text
driver.find_element(By.NAME, "email_input").send_keys("admin@localhost.dev" )
清除
元素清除命令重置元素的内容。这要求元素是可编辑和可重置的。通常,这意味着元素是具有文本类型的表单的输入元素或具有内容可编辑属性的元素。如果不满足这些条件,则返回无效元素状态错误。
# Navigate to url
driver.get("https://www.selenium.dev/selenium/web/inputs.html")
# Clear field to empty it from any previous data
driver.find_element(By.NAME, "email_input").clear()
导航
跳转到
启动浏览器后,您要做的第一件事就是打开您的网站。这可以在一行中实现:
driver.get("https://www.selenium.dev/selenium/web/index.html")
返回
按下浏览器的后退按钮:
driver.back()
前进
按下浏览器的前进按钮:
driver.forward()
刷新
刷新当前页面:
driver.refresh()
弹窗
Alerts
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()
Confirm
确认框类似于警报,除了用户还可以选择取消消息。查看样品确认。
此示例还显示了存储警报的不同方法:
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()
Prompt
提示类似于确认框,除了它们还包括文本输入。与处理表单元素类似,您可以使用WebDriver的send键来填写响应。这将完全替换占位符文本。按下取消按钮不会提交任何文本。请查看示例提示。
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()
Cookie
添加Cookie
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"})
按名称获取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"))
获取所有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 cookies
print(driver.get_cookies())
删除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")
删除所有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"})
# Deletes all cookies
driver.delete_all_cookies()
Frames
Frames是一种现在已弃用的从同一域上的多个文档构建站点布局的方法。除非你使用的是HTML5之前的网络应用程序,否则你不太可能使用它们。Iframes允许插入来自完全不同域的文档,并且仍然被广泛使用。
切换到Frames
# 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()
使用名称或id切换
# Switch frame by id
driver.switch_to.frame('buttonframe')
# Now, Click on the button
driver.find_element(By.TAG_NAME, 'button').click()
使用下标切换
# 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)
离开frame
# switch back to default content
driver.switch_to.default_content()
窗口
获取窗口句柄
driver.current_window_handle
切换窗口或选项卡
单击在新窗口中打开的链接将使新窗口或选项卡聚焦在屏幕上,但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 already
assert len(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 handle
for 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"))
关闭窗口或选项卡
当您完成一个窗口或选项卡,并且它不是浏览器中最后一个打开的窗口或选项卡时,您应该关闭它并切换回之前使用的窗口。假设您遵循了上一节中的代码示例,您将把上一个窗口句柄存储在一个变量中。
#Close the tab or window
driver.close()
#Switch back to the old tab or window
driver.switch_to.window(original_window)
创建新窗口(或)新选项卡并切换
创建一个新窗口(或)选项卡,并将新窗口或选项卡聚焦在屏幕上。您不需要切换到使用新窗口(或)选项卡。如果除新窗口外打开了两个以上的窗口(或”选项卡),则可以循环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')
退出浏览器
当你完成浏览器会话后,你应该调用quit,而不是close:
driver.quit()
获取窗口大小
获取浏览器窗口的大小(像素)。
# 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')
设置窗口位置
将窗口移动到所选位置。
# 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()
元素截图
用于捕获当前浏览上下文中元素的屏幕截图。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)
Actions API
用于向web浏览器提供虚拟化设备输入动作的接口。
键盘
按键按下
ActionChains(driver)\
.key_down(Keys.SHIFT)\
.send_keys("abc")\
.perform()
按键松开
ActionChains(driver)\
.key_down(Keys.SHIFT)\
.send_keys("a")\
.key_up(Keys.SHIFT)\
.send_keys("b")\
.perform()
Send keys
这是Actions API中的一种方便方法,它将keyDown和keyUp命令组合在一个操作中。执行此命令与使用元素方法略有不同,但主要是在需要在其他操作中间键入多个字符时使用。
ActionChains(driver)\
.send_keys("abc")\
.perform()
指定元素
text_input = driver.find_element(By.ID, "textInput")
ActionChains(driver)\
.send_keys_to_element(text_input, "abc")\
.perform()
复制粘贴
cmd_ctrl = Keys.COMMAND if sys.platform == 'darwin' else Keys.CONTROL
ActionChains(driver)\
.send_keys("Selenium!")\
.send_keys(Keys.ARROW_LEFT)\
.key_down(Keys.SHIFT)\
.send_keys(Keys.ARROW_UP)\
.key_up(Keys.SHIFT)\
.key_down(cmd_ctrl)\
.send_keys("xvv")\
.key_up(cmd_ctrl)\
.perform()
鼠标
单击并按住
此方法将鼠标移动到元素的中心与按下鼠标左键相结合。这对于聚焦特定元素很有用:
clickable = driver.find_element(By.ID, "clickable")
ActionChains(driver)\
.click_and_hold(clickable)\
.perform()
点击并释放
此方法将移动到元素的中心与按下和释放鼠标左键相结合。这也被称为“点击”:
clickable = driver.find_element(By.ID, "click")
ActionChains(driver)\
.click(clickable)\
.perform()
交替按钮点击
鼠标共有5个定义的按钮:
0–左键(默认)
1–中间按钮(目前不支持)
2–右键
3-X1(后退)按钮
4–X2(前进)按钮
上下文单击
此方法将移动到元素的中心与按下和释放鼠标右键(按钮2)相结合。这也被称为“右键单击”:
clickable = driver.find_element(By.ID, "clickable")
ActionChains(driver)\
.context_click(clickable)\
.perform()
返回单击
只需按下并松开鼠标按钮3
action = ActionBuilder(driver)
action.pointer_action.pointer_down(MouseButton.BACK)
action.pointer_action.pointer_up(MouseButton.BACK)
action.perform()
向前点击
只需按下并松开鼠标按钮4
action = ActionBuilder(driver)
action.pointer_action.pointer_down(MouseButton.FORWARD)
action.pointer_action.pointer_up(MouseButton.FORWARD)
action.perform()
双击
此方法将移动到元素的中心与按下和释放鼠标左键两次相结合。
clickable = driver.find_element(By.ID, "clickable")
ActionChains(driver)\
.double_click(clickable)\
.perform()
按偏移量移动
这些方法首先将鼠标移动到指定的原点,然后按提供的偏移量中的像素数移动。请注意,鼠标的位置必须在视口中,否则命令将出错。
与元素的偏移
此方法将鼠标移动到图元的视图中心点,然后按提供的偏移量移动。
mouse_tracker = driver.find_element(By.ID, "mouse-tracker")
ActionChains(driver)\
.move_to_element_with_offset(mouse_tracker, 8, 0)\
.perform()
与视口的偏移
此方法按提供的偏移量将鼠标从当前视口的左上角移动。
action = ActionBuilder(driver)
action.pointer_action.move_to_location(8, 0)
action.perform()
与当前指针位置的偏移
此方法通过用户提供的偏移量将鼠标从其当前位置移动。如果鼠标之前没有移动过,则位置将在视口的左上角。请注意,当页面滚动时,指针位置不会改变。
请注意,第一个参数X指定在为正时向右移动,而第二个参数Y指定在为负时向下移动。因此,moveByOffset(30,-10)从当前鼠标位置向右移动30,向上移动10。
ActionChains(driver)\
.move_by_offset( 13, 15)\
.perform()
在元素上拖放
此方法首先在源元素上单击并按住,移动到目标元素的位置,然后释放鼠标。
draggable = driver.find_element(By.ID, "draggable")
droppable = driver.find_element(By.ID, "droppable")
ActionChains(driver)\
.drag_and_drop(draggable, droppable)\
.perform()
按偏移量拖放
此方法首先在源元素上单击并按住,移动到给定的偏移量,然后释放鼠标。
draggable = driver.find_element(By.ID, "draggable")
start = draggable.location
finish = driver.find_element(By.ID, "droppable").location
ActionChains(driver)\
.drag_and_drop_by_offset(draggable, finish['x'] - start['x'], finish['y'] - start['y'])\
.perform()
手写笔
使用
pointer_area = driver.find_element(By.ID, "pointerArea")
pen_input = PointerInput(POINTER_PEN, "default pen")
action = ActionBuilder(driver, mouse=pen_input)
action.pointer_action\
.move_to(pointer_area)\
.pointer_down()\
.move_by(2, 2)\
.pointer_up()
action.perform()
添加指针事件属性
pointer_area = driver.find_element(By.ID, "pointerArea")
pen_input = PointerInput(POINTER_PEN, "default pen")
action = ActionBuilder(driver, mouse=pen_input)
action.pointer_action\
.move_to(pointer_area)\
.pointer_down()\
.move_by(2, 2, tilt_x=-72, tilt_y=9, twist=86)\
.pointer_up(0)
action.perform()
滚轮
滚动到元素
这是最常见的情况。与传统的点击和发送键方法不同,actions类不会自动将目标元素滚动到视图中,因此如果元素尚未在视口中,则需要使用此方法。
此方法将web元素作为唯一参数。
无论元素是在当前视图屏幕的上方还是下方,视口都会滚动,使元素的底部位于屏幕的底部。
iframe = driver.find_element(By.TAG_NAME, "iframe")
ActionChains(driver)\
.scroll_to_element(iframe)\
.perform()
按给定距离滚动
这是滚动的第二常见场景。输入增量x和增量y值,以确定向右和向下滚动的幅度。负值分别表示左和上。
footer = driver.find_element(By.TAG_NAME, "footer")
delta_y = footer.rect['y']
ActionChains(driver)\
.scroll_by_amount(0, delta_y)\
.perform()
从一个元素开始滚动给定量
这个场景实际上是上述两种方法的结合。
要执行此操作,请使用“Scroll From”方法,该方法接受3个参数。第一个代表原点,我们将其指定为元素,第二个代表delta x和delta y值。
如果元素不在视口中,它将滚动到屏幕底部,然后页面将按提供的delta x和delta y值滚动。
iframe = driver.find_element(By.TAG_NAME, "iframe")
scroll_origin = ScrollOrigin.from_element(iframe)
ActionChains(driver)\
.scroll_from_origin(scroll_origin, 0, 200)\
.perform()
从具有偏移的元素开始滚动
当您只需要滚动屏幕的一部分,并且它在视口之外时,会使用此场景。或者位于视口内,必须滚动的屏幕部分与特定元素有已知的偏移。
这再次使用“Scroll From”方法,除了指定元素外,还指定了一个偏移量来指示滚动的原点。偏移量是从所提供元素的中心开始计算的。
如果元素不在视口中,它将首先滚动到屏幕底部,然后通过将偏移量添加到元素中心的坐标来确定滚动的原点,最后页面将根据提供的delta x和delta y值滚动。
请注意,如果元素中心的偏移量落在视口之外,则会导致异常。
footer = driver.find_element(By.TAG_NAME, "footer")
scroll_origin = ScrollOrigin.from_element(footer, 0, -50)
ActionChains(driver)\
.scroll_from_origin(scroll_origin, 0, 200)\
.perform()
从原点(元素)的偏移量开始滚动给定的量
当您只需要滚动屏幕的一部分,并且它已经在视口内时,使用最后一种场景。
这再次使用了“Scroll From”方法,但指定的是视口而不是元素。从当前视口的左上角指定偏移量。确定原点后,页面将根据提供的delta x和delta y值滚动。
请注意,如果视口左上角的偏移量落在屏幕之外,则会导致异常。
scroll_origin = ScrollOrigin.from_viewport(10, 10)
ActionChains(driver)\
.scroll_from_origin(scroll_origin, 0, 200)\
.perform()