Selenium 包介绍
诸神缄默不语-个人CSDN博文目录
Selenium 是一个强大的工具,主要用于自动化 Web 浏览器的操作。它支持多种编程语言(如 Python、Java、C# 等)和主流浏览器(如 Chrome、Firefox、Safari、Edge 等),广泛应用于自动化测试、爬虫开发和浏览器行为模拟。
文章目录
- Selenium 的主要功能
- 安装 Selenium
- Selenium 的核心组件
- webdriver
- `webdriver.Chrome()` 对象
- `get(url)`
- `selenium.webdriver.common.by`
- `find_element(by, value)`
- `find_elements(by, value)`
- `execute_script(script, *args)`
- `save_screenshot(filename)`
- `quit()`
- `get_cookies()` 方法
- `webdriver.get_cookie(name)`
- `add_cookie()`
- `webdriver.delete_cookie(name)`
- `webdriver.delete_all_cookies()`
- `webdriver.refresh()`
- `driver.implicitly_wait()`
- `WebDriverWait`
- `webdriver.back()`
- `webdriver.forward()`
- `driver.maximize_window()`:最大化浏览器窗口
- `driver.minimize_window()`
- `driver.set_window_size(width, height)`
- `driver.get_window_size()`
- `driver.get_screenshot_as_file`
- `driver.save_screenshot(filename)`
- `driver.get_screenshot_as_base64()`
- `driver.get_screenshot_as_png()`
Selenium 的主要功能
- 浏览器自动化: 打开网页、点击按钮、输入文本、提交表单等。
- 跨浏览器支持:支持多种浏览器(需要相应的浏览器驱动程序)。
- 动态网页抓取:可以处理 JavaScript 动态加载内容。
- 模拟用户操作:模拟键盘输入、鼠标点击、窗口切换等操作。
- 扩展测试功能:支持复杂的 UI 测试和页面行为验证。
安装 Selenium
在 Python 环境中,可以使用 pip 进行安装:
pip install selenium
Selenium 的核心组件
- WebDriver:
- 提供与浏览器交互的 API。
- 需要对应的浏览器驱动程序(如 ChromeDriver、GeckoDriver)。
- WebElement:
- 表示 HTML 页面中的元素,可以进行点击、输入、获取属性等操作。
- ActionChains:
- 支持复杂的用户交互操作(如拖拽、鼠标悬停)。
- Waits:
- 提供显式和隐式等待功能,以处理动态加载的页面。
webdriver
from selenium import webdriver
webdriver.Chrome()
对象
在 Selenium 中,webdriver.Chrome()
是用于启动 Chrome 浏览器的 WebDriver。它提供了一个与 Chrome 浏览器交互的接口,可以自动执行浏览器操作,如打开网页、输入数据、点击按钮等。
新版Chrome浏览器下载时自动集成了chromedriver,如果没有下载过需要先下载chromedriver。
参数和高级用法:
webdriver.Chrome()
支持多种参数来配置浏览器行为,如无头模式、设置窗口大小等。
- 使用选项配置
可以通过webdriver.ChromeOptions
类设置浏览器选项。
示例:启用无头模式(Headless)from selenium import webdriver# 创建 ChromeOptions 实例 options = webdriver.ChromeOptions() options.add_argument('--headless') # 无头模式 options.add_argument('--disable-gpu') # 禁用 GPU(Linux 系统可能需要)# 创建 WebDriver driver = webdriver.Chrome(options=options)# 打开网页 driver.get("https://www.example.com")# 获取页面标题 print("页面标题:", driver.title)# 关闭浏览器 driver.quit()
- 指定 ChromeDriver 路径
如果 ChromeDriver 不在环境变量中,需要手动指定路径。from selenium import webdriver# 指定 ChromeDriver 的路径 driver = webdriver.Chrome(executable_path='/path/to/chromedriver')# 打开网页 driver.get("https://www.example.com") driver.quit()
- 设置用户代理
可以通过添加参数更改用户代理。from selenium import webdriver# 配置用户代理 options = webdriver.ChromeOptions() options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36')# 启动浏览器 driver = webdriver.Chrome(options=options)# 打开网页 driver.get("https://www.example.com") driver.quit()
- 设置窗口大小
通过参数设置浏览器窗口大小:from selenium import webdriveroptions = webdriver.ChromeOptions() options.add_argument('window-size=1200x600') # 设置窗口大小driver = webdriver.Chrome(options=options) driver.get("https://www.example.com") driver.quit()
- 加载扩展
可以加载 Chrome 扩展程序:from selenium import webdriveroptions = webdriver.ChromeOptions() options.add_extension('/path/to/extension.crx') # 添加扩展driver = webdriver.Chrome(options=options) driver.get("https://www.example.com") driver.quit()
- 关闭自动化控制提示
默认情况下,Selenium 会在浏览器中显示“正在由自动化测试软件控制”的提示,可以通过以下代码关闭:from selenium import webdriveroptions = webdriver.ChromeOptions() options.add_experimental_option("excludeSwitches", ["enable-automation"]) # 去掉自动化提示 options.add_experimental_option('useAutomationExtension', False)driver = webdriver.Chrome(options=options) driver.get("https://www.example.com") driver.quit()
get(url)
打开指定的 URL。
driver.get("https://www.example.com")
selenium.webdriver.common.by
selenium.webdriver.common.by
是 Selenium 提供的一个模块,定义了定位网页元素的方法(By
类)。通过 By
类,你可以用多种方式查找网页中的元素,例如通过 ID、名称、标签、类名、XPath 等。
By
类是 Selenium 元素查找功能的核心,用于指定查找方式,与 WebDriver 的 find_element
和 find_elements
方法结合使用。
By
类常见的查找方式:
以下是 By
类支持的定位方式:
查找方式 | 属性 | 说明 |
---|---|---|
ID | By.ID | 根据元素的 id 属性值查找。 |
Name | By.NAME | 根据元素的 name 属性值查找。 |
Class Name | By.CLASS_NAME | 根据元素的 class 属性值查找。 |
Tag Name | By.TAG_NAME | 根据 HTML 标签名查找(例如 <input> 、<button> )。 |
CSS Selector | By.CSS_SELECTOR | 根据 CSS 选择器查找元素(支持复杂选择器)。 |
Link Text | By.LINK_TEXT | 根据超链接的文本内容查找(用于 <a> 标签)。 |
Partial Link Text | By.PARTIAL_LINK_TEXT | 根据超链接的部分文本查找。 |
XPath | By.XPATH | 使用 XPath 表达式查找元素(支持复杂的层级结构和条件)。 |
示例 1:基本用法
from selenium import webdriver
from selenium.webdriver.common.by import By# 启动浏览器
driver = webdriver.Chrome()# 打开网页
driver.get("https://www.example.com")# 根据 ID 查找元素
element_by_id = driver.find_element(By.ID, "element-id")
print("找到的元素:", element_by_id)# 关闭浏览器
driver.quit()
示例 2:组合使用多个定位方式
from selenium import webdriver
from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()
driver.get("https://www.example.com")# 根据不同方式查找元素
element_by_name = driver.find_element(By.NAME, "username")
element_by_css = driver.find_element(By.CSS_SELECTOR, "input[type='password']")
element_by_xpath = driver.find_element(By.XPATH, "//button[@id='login']")# 打印找到的元素
print("找到的元素(name):", element_by_name)
print("找到的元素(css):", element_by_css)
print("找到的元素(xpath):", element_by_xpath)driver.quit()
示例 3:使用 find_elements
查找多个元素
from selenium import webdriver
from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()
driver.get("https://www.example.com")# 根据类名查找多个元素
elements = driver.find_elements(By.CLASS_NAME, "item-class")
for element in elements:print("找到的元素:", element.text)driver.quit()
常用定位方式的场景:
By.ID
适合定位具有唯一 ID 的元素,这是最常用和最快的定位方式。
driver.find_element(By.ID, "username")
By.NAME
用于查找具有name
属性的表单元素,例如输入框、按钮。
driver.find_element(By.NAME, "search")
By.CLASS_NAME
用于查找具有特定class
的元素。适用于简单类名,不支持复合类选择器。
driver.find_element(By.CLASS_NAME, "button-class")
By.TAG_NAME
根据 HTML 标签名查找元素,例如<input>
、<button>
。
driver.find_element(By.TAG_NAME, "input")
By.CSS_SELECTOR
使用 CSS 选择器查找元素,适用于复杂的选择器。
driver.find_element(By.CSS_SELECTOR, "div.container > ul > li:first-child")
By.LINK_TEXT
用于查找超链接,依据链接文本的内容。
driver.find_element(By.LINK_TEXT, "点击这里")
By.PARTIAL_LINK_TEXT
类似于By.LINK_TEXT
,但只需要部分匹配链接文本。
driver.find_element(By.PARTIAL_LINK_TEXT, "点击")
By.XPATH
使用 XPath 表达式查找元素,适合复杂的 DOM 结构。
driver.find_element(By.XPATH, "//div[@class='example']//a[text()='链接']")
注意事项:
-
性能差异:
- 使用
By.ID
是最快的定位方式,因为浏览器会直接查找对应的元素。 - 使用
By.XPATH
或By.CSS_SELECTOR
可能稍慢,但更灵活,适合复杂的结构。
- 使用
-
定位唯一性:
- 确保你使用的定位方法能够唯一确定目标元素,否则可能抛出
NoSuchElementException
或选择错误的元素。
- 确保你使用的定位方法能够唯一确定目标元素,否则可能抛出
-
动态内容:
- 如果元素动态加载,可以配合显式等待,确保元素存在后再查找。
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as ECelement = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "dynamic-element")) )
总结:
selenium.webdriver.common.by.By
是 Selenium 提供的一个方便的类,用于指定网页元素的定位方式。- 常用的定位方式包括 ID、名称、类名、标签名、CSS 选择器、XPath 等。
- 不同的定位方式适用于不同的场景,选择合适的方法可以提高查找效率和代码的可读性。
find_element(by, value)
查找页面中的元素(如按钮、输入框等)。
from selenium.webdriver.common.by import Byelement = driver.find_element(By.ID, "element-id")
find_elements(by, value)
查找多个元素。
elements = driver.find_elements(By.CLASS_NAME, "element-class")
execute_script(script, *args)
执行 JavaScript 脚本。
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
save_screenshot(filename)
截取当前页面截图。
driver.save_screenshot("screenshot.png")
quit()
关闭浏览器并结束 WebDriver 会话。
driver.quit()
get_cookies()
方法
在 Selenium 中,get_cookies
是 WebDriver 提供的一个方法,用于获取当前浏览器会话的所有 Cookie 信息。
webdriver.get_cookies()
返回值:
- 返回一个包含所有 Cookie 信息的 列表。
- 每个 Cookie 是一个字典,字典中包含如下键:
- name: Cookie 的名称。
- value: Cookie 的值。
- domain: Cookie 所属的域。
- path: Cookie 的有效路径。
- expiry: Cookie 的过期时间(以时间戳形式返回)。
- secure: 布尔值,指示是否仅通过 HTTPS 传输。
使用场景:
- 查看当前网页的 Cookie。
- 在会话间共享 Cookie。
- 调试网站登录状态。
- 模拟登录后爬取需要权限的页面。
示例 1:获取所有 Cookies
from selenium import webdriver# 启动 WebDriver
driver = webdriver.Chrome()# 打开一个网页
driver.get("https://www.baidu.com")# 获取所有 Cookies
cookies = driver.get_cookies()# 打印 Cookies
for cookie in cookies:print(cookie)# 关闭浏览器
driver.quit()
示例 2:结合 add_cookie
使用
使用一个 Cookie 模拟登录后访问页面:
from selenium import webdriver# 启动 WebDriver
driver = webdriver.Chrome()# 打开登录页面
driver.get("https://www.baidu.com")# 手动登录后,获取登录后的 Cookies
login_cookies = driver.get_cookies()
print("登录后的 Cookies:", login_cookies)# 关闭并重新启动浏览器
driver.quit()# 新会话下加载 Cookies
driver = webdriver.Chrome()
driver.get("https://www.baidu.com") # 必须先加载网站一次
for cookie in login_cookies:driver.add_cookie(cookie)# 刷新页面,验证是否已登录
driver.refresh()# 打印当前页面标题
print("当前页面标题:", driver.title)# 关闭浏览器
driver.quit()
示例 3:获取特定 Cookie
可以通过遍历 Cookies 的列表来获取特定的 Cookie:
from selenium import webdriver# 启动 WebDriver
driver = webdriver.Chrome()# 打开网页
driver.get("https://www.baidu.com")# 获取所有 Cookies
cookies = driver.get_cookies()# 查找特定 Cookie(假设名称为 "session_id")
session_cookie = next((cookie for cookie in cookies if cookie["name"] == "session_id"), None)
if session_cookie:print("找到特定 Cookie:", session_cookie)
else:print("特定 Cookie 不存在")# 关闭浏览器
driver.quit()
注意事项:
- 必须加载过页面才能获取 Cookies:
get_cookies
方法只能获取当前浏览器会话的 Cookies,调用前需加载相关页面。 - HTTPS 限制:如果 Cookie 的
secure
属性为True
,只能通过 HTTPS 请求获取。 - 跨域问题:只能获取当前域名下的 Cookies,不能跨域获取。
- 模拟登录:使用 Cookie 模拟登录时,需要确保所有必要的 Cookie 都已正确设置。
总结:
- Selenium 是用于自动化浏览器操作的强大工具,支持复杂的 Web 操作。
get_cookies
方法 提供了一种便捷方式来查看和操作浏览器的 Cookies,可用于模拟登录、会话管理和调试等场景。
webdriver.get_cookie(name)
根据名称获取特定的 Cookie。
cookie = driver.get_cookie("session_id")
print(cookie)
add_cookie()
在 Selenium 中,webdriver.add_cookie
是用于向当前会话中添加一个新的 Cookie 的方法。通过此方法,可以模拟用户登录状态、管理会话信息等操作。
webdriver.add_cookie(cookie_dict)
参数说明:
- cookie_dict:
- 一个字典,表示需要添加的 Cookie。
- 常用键:
- name (必须): Cookie 的名称。
- value (必须): Cookie 的值。
- path (可选): Cookie 的路径,默认是
/
。 - domain (可选): Cookie 的作用域,如果不指定,默认为当前页面的域。
- secure (可选): 布尔值,指示是否只能通过 HTTPS 传输,默认为
False
。 - expiry (可选): Cookie 的过期时间(Unix 时间戳,秒为单位)。
使用场景:
- 模拟登录状态:
使用已知的 Cookie 信息登录某个网页,而无需通过前端登录流程。 - 跨会话共享状态:
在不同的浏览器会话中共享相同的登录信息。 - 测试 Cookie 的设置和有效性:
手动设置测试环境中的 Cookie。
示例代码:
示例 1:添加一个简单的 Cookie
from selenium import webdriver# 启动浏览器
driver = webdriver.Chrome()# 打开一个网页
driver.get("https://www.example.com")# 添加一个 Cookie
cookie = {"name": "test_cookie", "value": "test_value"}
driver.add_cookie(cookie)# 验证 Cookie 是否添加成功
cookies = driver.get_cookies()
print("所有 Cookies:", cookies)# 关闭浏览器
driver.quit()
示例 2:添加多个 Cookie
from selenium import webdriver# 启动浏览器
driver = webdriver.Chrome()# 打开一个网页
driver.get("https://www.example.com")# 添加多个 Cookies
cookies = [{"name": "user_id", "value": "12345"},{"name": "session_token", "value": "abcdef", "path": "/", "secure": True}
]
for cookie in cookies:driver.add_cookie(cookie)# 查看当前的 Cookies
print(driver.get_cookies())# 关闭浏览器
driver.quit()
示例 3:使用 Cookie 模拟登录
from selenium import webdriver# 启动浏览器
driver = webdriver.Chrome()# 打开目标网站(必须先加载一次页面)
driver.get("https://www.example.com")# 添加登录所需的 Cookie
login_cookie = {"name": "session_id","value": "example_session_token","domain": "www.example.com","path": "/","secure": True
}
driver.add_cookie(login_cookie)# 刷新页面验证登录状态
driver.refresh()# 打印当前页面标题
print("当前页面标题:", driver.title)# 关闭浏览器
driver.quit()
注意事项:
-
必须先加载页面:
add_cookie
方法只能在加载过页面后调用。如果未加载页面,会抛出InvalidCookieDomainException
异常。
-
路径和域名匹配:
- 如果指定了
path
或domain
,它们必须与当前页面匹配,否则 Cookie 可能无法正确设置。
- 如果指定了
-
过期时间的格式:
expiry
的值是一个 Unix 时间戳(从 1970 年 1 月 1 日起的秒数),如果不指定,则默认 Cookie 是会话 Cookie。
-
HTTPS 限制:
- 如果
secure
设置为True
,则只能通过 HTTPS 访问 Cookie。
- 如果
-
跨域问题:
- Selenium 不允许直接跨域设置 Cookie。例如,你无法在
example.com
的会话中添加属于otherdomain.com
的 Cookie。
- Selenium 不允许直接跨域设置 Cookie。例如,你无法在
常见问题及解决方法:
-
问题:
InvalidCookieDomainException
- 原因:试图为未加载的域或与当前页面域名不匹配的域添加 Cookie。
- 解决方法:确保在调用
add_cookie
方法之前已经访问了目标页面。
-
问题:添加的 Cookie 无效
- 原因:Cookie 的
path
、domain
或secure
设置与实际需求不符。 - 解决方法:仔细检查 Cookie 的参数设置,确保与实际的页面匹配。
- 原因:Cookie 的
总结:
webdriver.add_cookie
是 Selenium 提供的一个重要方法,用于向浏览器会话中添加 Cookie。- 它在模拟登录、共享会话状态和测试环境中 Cookie 的有效性等场景中非常有用。
- 使用时需要注意当前页面是否加载以及域名和路径的匹配性。
webdriver.delete_cookie(name)
删除指定名称的 Cookie。
driver.delete_cookie("session_id")
webdriver.delete_all_cookies()
删除当前会话中的所有 Cookies。
driver.delete_all_cookies()
webdriver.refresh()
在 Selenium 中,webdriver.refresh()
是用于刷新当前页面的方法。它模拟了浏览器的刷新按钮或键盘快捷键 (如 F5) 的操作。
功能:
- 重新加载当前页面:
- 刷新页面会让浏览器重新发起对当前 URL 的请求。
- 更新页面内容:
- 对于动态网页或可能发生更改的内容,刷新可以更新页面显示。
- 重试加载失败的页面:
- 如果当前页面加载失败,刷新可能会重新加载成功。
基本用法
from selenium import webdriver# 启动浏览器
driver = webdriver.Chrome()# 打开一个网页
driver.get("https://www.example.com")# 刷新页面
driver.refresh()# 打印当前页面标题
print("当前页面标题:", driver.title)# 关闭浏览器
driver.quit()
常见场景:
- 页面内容刷新
对于实时更新的数据页面,通过refresh
刷新页面获取最新数据。
from selenium import webdriver
import timedriver = webdriver.Chrome()# 打开一个动态网页
driver.get("https://www.example.com")# 等待 5 秒后刷新页面
time.sleep(5)
driver.refresh()driver.quit()
- 配合显式等待
刷新页面后,等待某个动态加载的元素出现。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECdriver = webdriver.Chrome()# 打开网页
driver.get("https://www.example.com")# 刷新页面
driver.refresh()# 等待某个元素加载完成
try:element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "dynamic-element-id")))print("动态内容已加载")
finally:driver.quit()
注意事项:
-
页面状态丢失:
- 刷新页面后,未提交的表单数据、未保存的操作可能会丢失。
-
重载触发操作:
- 如果页面中存在自动触发的脚本或请求,刷新可能会导致重复提交或操作。
-
动态内容加载:
- 刷新不会保证动态加载的内容出现在页面中,可能需要配合等待机制(如
WebDriverWait
)。
- 刷新不会保证动态加载的内容出现在页面中,可能需要配合等待机制(如
-
效率问题:
- 刷新会重新加载整个页面,可能耗费较多时间。
常见问题与解决方法:
- 页面刷新后找不到元素
问题:刷新页面后,之前定位的元素可能会变得无效,因为页面 DOM 可能发生变化。
解决方法:在刷新页面后重新定位元素。
from selenium import webdriver
from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()driver.get("https://www.example.com")
driver.refresh()# 刷新后重新定位元素
element = driver.find_element(By.ID, "element-id")
print("找到元素:", element)driver.quit()
- 页面卡住或刷新超时
问题:页面刷新过程中卡住或加载时间过长。
解决方法:设置页面加载超时时间。
from selenium import webdriver
from selenium.common.exceptions import TimeoutExceptiondriver = webdriver.Chrome()# 设置页面加载超时时间
driver.set_page_load_timeout(10)try:driver.get("https://www.example.com")driver.refresh()
except TimeoutException:print("页面刷新超时!")driver.quit()
总结:
webdriver.refresh()
是 Selenium 中用于刷新当前页面的简单有效方法。- 它适合更新动态内容、解决加载失败问题,但需要注意刷新可能会导致页面状态丢失。
- 在需要刷新后操作 DOM 时,建议重新定位元素并结合等待机制以确保操作的稳定性。
driver.implicitly_wait()
driver.implicitly_wait()
是 Selenium 提供的一种隐式等待方法,用于在查找元素时设置全局等待时间。如果指定的元素在 DOM 中未立即加载完成,WebDriver 会在给定的时间内反复尝试查找,直到超时为止。
driver.implicitly_wait(time_to_wait)
参数说明:
- time_to_wait:
- 类型:整数或浮点数。
- 单位:秒。
- 描述:设置的等待时间,表示 WebDriver 查找元素时的超时时间。
功能:
- 隐式等待是全局性的,对所有查找元素的操作(如
find_element
和find_elements
)生效。 - WebDriver 在查找元素时会轮询 DOM,如果元素在超时时间内出现,操作将继续;如果超时仍未找到目标元素,将抛出
NoSuchElementException
异常。
使用场景:
- 动态加载的页面:
- 处理网页上动态生成或延迟加载的内容。
- 网络波动:
- 避免网络响应较慢导致查找元素失败。
- 减少显式等待的使用频率:
- 为大多数需要等待的场景提供默认解决方案。
示例 1:设置隐式等待
from selenium import webdriver# 启动浏览器
driver = webdriver.Chrome()# 设置隐式等待时间为 10 秒
driver.implicitly_wait(10)# 打开网页
driver.get("https://www.example.com")# 查找元素(如果元素需要一定时间加载,隐式等待会生效)
element = driver.find_element("id", "dynamic-element")
print("找到元素:", element)# 关闭浏览器
driver.quit()
示例 2:动态加载内容的处理
from selenium import webdriverdriver = webdriver.Chrome()# 设置隐式等待为 5 秒
driver.implicitly_wait(5)driver.get("https://www.example.com")# 查找动态生成的元素
try:element = driver.find_element("id", "dynamic-content")print("元素已加载:", element.text)
except:print("元素未加载")driver.quit()
注意事项:
-
隐式等待 vs 显式等待:
- 隐式等待是全局生效的,适用于所有元素查找。
- 显式等待(
WebDriverWait
)是针对特定元素的等待,更加灵活,适合处理复杂的等待逻辑。
-
性能影响:
- 设置隐式等待时间过长可能影响性能,因为所有元素查找操作都会受到隐式等待的影响。
- 通常建议将隐式等待时间设置为合理范围(如 5~10 秒)。
-
超时后的行为:
- 如果等待超时,WebDriver 将抛出
NoSuchElementException
。
- 如果等待超时,WebDriver 将抛出
-
与显式等待的冲突:
- 不建议在同一脚本中同时使用隐式等待和显式等待,可能导致不可预测的行为。
常见问题及解决方法:
- 查找元素仍然失败
- 原因:等待时间不足,或者目标元素在超时时间内未加载。
- 解决方法:检查是否需要延长隐式等待时间,或者结合显式等待解决问题。
- 隐式等待影响性能
- 原因:隐式等待时间过长会影响每次查找操作的响应速度。
- 解决方法:只在必要时设置隐式等待时间,并根据场景调整等待时长。
与显式等待的比较:
隐式等待(implicitly_wait
)
- 范围:全局生效,适用于所有查找元素操作。
- 灵活性:无法针对特定元素设置等待条件。
- 使用场景:适合大多数简单的等待需求。
显式等待(WebDriverWait
)
- 范围:局部生效,只针对特定的查找操作。
- 灵活性:支持条件判断(如元素是否可见、是否可点击等)。
- 使用场景:适合复杂的等待逻辑,如动态加载内容。
WebDriverWait
如果需要等待特定条件,可以使用显式等待:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECdriver = webdriver.Chrome()# 打开网页
driver.get("https://www.example.com")# 使用显式等待
wait = WebDriverWait(driver, 10)
element = wait.until(EC.presence_of_element_located((By.ID, "dynamic-element")))print("元素已加载:", element.text)driver.quit()
webdriver.back()
导航到浏览器的上一页。
webdriver.forward()
导航到浏览器的下一页。
driver.maximize_window()
:最大化浏览器窗口
在 Selenium 中,driver.maximize_window()
是用于将浏览器窗口最大化的方法。这个方法通常在自动化脚本的初始阶段使用,以确保浏览器以全屏模式运行,从而避免因窗口大小限制导致的定位问题或页面布局变化。
功能:
- 将当前浏览器窗口调整为操作系统支持的最大尺寸。
- 在脚本运行时保证页面的布局和显示状态接近用户实际操作时的效果,避免因窗口过小导致元素无法显示或无法被定位的问题。
- 提高自动化脚本的稳定性。
示例 1:基本用法
from selenium import webdriver# 启动浏览器
driver = webdriver.Chrome()# 最大化窗口
driver.maximize_window()# 打开网页
driver.get("https://www.example.com")# 打印当前窗口大小
print("当前窗口大小:", driver.get_window_size())# 关闭浏览器
driver.quit()
示例 2:与其他窗口操作方法结合使用
from selenium import webdriver# 启动浏览器
driver = webdriver.Chrome()# 打开网页
driver.get("https://www.example.com")# 获取当前窗口大小
original_size = driver.get_window_size()
print("原始窗口大小:", original_size)# 最大化窗口
driver.maximize_window()
print("最大化后的窗口大小:", driver.get_window_size())# 最小化窗口
driver.minimize_window()# 关闭浏览器
driver.quit()
适用场景:
- 跨分辨率测试:
最大化窗口后,可以模拟在较大屏幕上浏览页面的效果。 - 避免元素不可见问题:
对某些复杂页面,窗口较小时可能隐藏某些元素,通过最大化窗口可以确保页面完全展示。 - 截图操作:
最大化窗口后再截图,确保截图中包含完整的页面内容。
注意事项:
-
环境依赖:
maximize_window
的效果依赖于操作系统和浏览器的实现,某些无头浏览器(如 Headless 模式下的 Chrome)可能不支持此操作。
-
无头模式的特殊情况:
- 如果使用无头模式(Headless),可以通过设置窗口大小的方式模拟最大化。
options = webdriver.ChromeOptions() options.add_argument("--headless") options.add_argument("--window-size=1920,1080") driver = webdriver.Chrome(options=options)
-
多显示器环境:
- 在多显示器环境下,最大化的窗口可能仅限于主显示器的大小。
常见问题:
- 最大化后元素仍不可见
原因:页面中的元素可能仍需滚动才能完全展示。
解决方法:可以结合ActionChains
或 JavaScript 滚动页面。
from selenium.webdriver.common.action_chains import ActionChains# 滚动到某个元素
element = driver.find_element(By.ID, "target-element")
ActionChains(driver).move_to_element(element).perform()
maximize_window
方法无效
原因:某些浏览器在无头模式下不支持最大化。
解决方法:在无头模式中通过设置窗口大小模拟最大化。
options = webdriver.ChromeOptions()
options.add_argument("--headless")
options.add_argument("--window-size=1920,1080")
driver = webdriver.Chrome(options=options)
总结:
driver.maximize_window()
是 Selenium 中用于最大化浏览器窗口的简单方法。- 它适用于需要全屏显示页面的场景,可以避免因窗口大小限制导致的自动化脚本问题。
- 在无头模式下无法使用时,可以通过设置窗口大小(如
--window-size
)来模拟最大化效果。
driver.minimize_window()
将浏览器窗口最小化。
driver.minimize_window()
driver.set_window_size(width, height)
设置浏览器窗口的宽高。
driver.set_window_size(1024, 768)
driver.get_window_size()
获取当前窗口的宽高。
size = driver.get_window_size()
print("宽度:", size["width"], "高度:", size["height"])
driver.get_screenshot_as_file
driver.get_screenshot_as_file
是 Selenium 提供的方法,用于将当前浏览器窗口的截图保存为文件。它非常适合在自动化测试中捕获页面状态,比如测试失败时记录错误页面、验证界面布局等。
driver.get_screenshot_as_file(filename)
参数说明:
- filename:
- 字符串类型,指定截图保存的文件路径(包括文件名和扩展名)。
- 支持绝对路径或相对路径。
- 文件格式通常为
.png
或.jpg
。
返回值:
- 布尔值:
True
:截图保存成功。False
:截图保存失败(可能由于路径无效或文件写入权限问题)。
功能:
- 将当前浏览器窗口的可见部分保存为图片文件。
- 不支持完整页面截图,仅限于当前窗口的可见区域。
- 如果需要完整页面截图,可使用特定浏览器工具或结合 JavaScript 滚动截取。
示例 1:基本用法
from selenium import webdriver# 启动浏览器
driver = webdriver.Chrome()# 打开网页
driver.get("https://www.example.com")# 保存截图
screenshot_path = "screenshot.png"
if driver.get_screenshot_as_file(screenshot_path):print(f"截图保存成功: {screenshot_path}")
else:print("截图保存失败")# 关闭浏览器
driver.quit()
示例 2:保存到指定路径
from selenium import webdriver
import os# 启动浏览器
driver = webdriver.Chrome()# 打开网页
driver.get("https://www.example.com")# 定义保存路径
save_dir = "screenshots"
os.makedirs(save_dir, exist_ok=True)
screenshot_path = os.path.join(save_dir, "example_page.png")# 保存截图
driver.get_screenshot_as_file(screenshot_path)
print(f"截图已保存到: {screenshot_path}")# 关闭浏览器
driver.quit()
常见使用场景:
- 调试失败的测试
当自动化测试失败时,可以截图记录当前页面状态以便排查问题。
from selenium import webdriverdriver = webdriver.Chrome()try:driver.get("https://www.example.com")# 触发错误操作driver.find_element("id", "non-existent-element")
except Exception as e:driver.get_screenshot_as_file("error_page.png")print("测试失败,截图已保存")
finally:driver.quit()
- 定时截图
对某些动态更新的页面,可以定时截图以记录变化。
import time
from selenium import webdriverdriver = webdriver.Chrome()
driver.get("https://www.example.com")for i in range(5):screenshot_path = f"screenshot_{i}.png"driver.get_screenshot_as_file(screenshot_path)print(f"保存截图: {screenshot_path}")time.sleep(2)driver.quit()
注意事项:
-
仅限当前窗口的可见区域:
get_screenshot_as_file
只截取浏览器窗口当前显示的内容,无法截取超出窗口范围的部分(例如滚动条以下的内容)。
-
路径有效性:
- 确保提供的路径有效且有写入权限,否则方法会返回
False
。
- 确保提供的路径有效且有写入权限,否则方法会返回
-
文件格式:
- 建议使用
.png
格式保存截图,因为它支持无损压缩。
- 建议使用
-
完整页面截图:
- Selenium 本身不支持直接截取整个页面,但可以结合 JavaScript 滚动页面并拼接图片实现完整截图。
常见问题及解决方法:
- 截图保存失败
- 原因:路径无效或没有写入权限。
- 解决方法:检查文件路径是否正确,确保路径存在且具有写入权限。
- 截图中内容不完整
- 原因:目标内容位于页面未显示的部分。
- 解决方法:使用 JavaScript 滚动页面截取完整页面。
总结:
driver.get_screenshot_as_file
是 Selenium 提供的便捷方法,用于保存当前浏览器窗口的截图。- 它适合记录页面状态、调试测试问题以及生成自动化报告。
- 对于完整页面截图需求,可以结合滚动操作或第三方工具实现。
driver.save_screenshot(filename)
- 功能与
get_screenshot_as_file
相同,用于保存截图到文件。 - 示例:
driver.save_screenshot("screenshot.png")
driver.get_screenshot_as_base64()
- 返回截图的 Base64 编码字符串,适合用于直接传输或嵌入到 HTML 报告中。
- 示例:
base64_image = driver.get_screenshot_as_base64() print(base64_image)
driver.get_screenshot_as_png()
- 返回截图的二进制数据,适合直接处理图片文件流。
- 示例:
png_data = driver.get_screenshot_as_png() with open("screenshot.png", "wb") as f:f.write(png_data)
相关文章:
Selenium 包介绍
诸神缄默不语-个人CSDN博文目录 Selenium 是一个强大的工具,主要用于自动化 Web 浏览器的操作。它支持多种编程语言(如 Python、Java、C# 等)和主流浏览器(如 Chrome、Firefox、Safari、Edge 等),广泛应用…...
量化交易系统开发-实时行情自动化交易-4.4.做市策略
19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。 接下来继续说说做市策略原理。 做市策…...
C++设计模式(单例模式)
一、介绍 1.动机 在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。 如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例? 这应该是类设计者的…...
图的深度优先搜索算法DFS
深度优先搜索(DFS)就是一种寻找图中各个顶点的方法。想象一下,如果你在一个迷宫里探险,你会怎么做呢?你可能会选择一直走到尽头,直到找不到路为止,然后再回过头来试试其他的路,这就是…...
自动泊车“哐哐撞大墙”,小米SU7智驾功能bug缠身?
文/王俣祺 导语:小米SU7,自带热度与科技光环的“流量神车”,近日却以一种极为“狼狈”的方式闯入大众视野。多达70余辆小米SU7陷入“泊车魔咒”,瞬间在网络上炸开了锅。从“科技控”到“惹祸精”的背后,究竟藏着怎样的…...
Linux宝塔部署wordpress网站更换服务器IP后无法访问管理后台和打开网站页面显示错乱
一、背景: wordpress网站搬家,更换服务器IP后,如果没有域名时,使用服务器IP地址无法访问管理后台和打开网站页面显示错乱。 二、解决方法如下: 1.wordpress搬家后,在新服务器上,新建站点时&am…...
Http文件上传
方式一:HttpClient public static String uploadFile(String url, Map<String, FileWrapper> fileParam, Map<String,String> otherParam){long start System.currentTimeMillis();log.info("uploadFile url: {}.",url);HttpClient client …...
哈希C++
文章目录 一.哈希的概念1.直接定址法2.负载因子 二.哈希函数1.除法散列法 / 除留余数法2.乘法散列法3.全域散列法(了解) 三.处理哈希冲突哈希冲突:1.开放定址法(1)线性探测:(2)二次探…...
C++11(中)
C11(中) 1.可变参数模板1.1.使用场景 2.lambda表达式(重要)2.1.使用说明2.2.函数对象与lambda表达式 3.线程库3.1.thread3.2.atomic原子库操作3.3.mutex3.3.1.mutex的种类3.3.2.lock_guard3.3.3.unique_lock 🌟&#x…...
vim 如何高亮/取消高亮
高亮 :在ESC模式下使用 shift # 取消高亮:在ESC模式下输入英文输入 :nohl (no highlight)...
C#中面试的常见问题008
1.内存泄露 内存泄露的原因: 未释放动态分配的内存:在使用malloc、new等动态内存分配函数后,未能正确释放内存。引用计数错误:在引用计数管理内存的语言中,增加引用计数但未相应减少,导致内存无法释放。循…...
【系统架构设计师】真题论文: 论数据访问层设计技术及其应用(包括解题思路和素材)
更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 真题题目(2016年 试题3)解题思路论文素材参考(1)数据访问层设计 JDBC 技术(2)ORM 框架技术 - Hibernate(3)ORM 框架技术 - MyBatis(4)数据访问层设计模式 - DAO 模式(5)数据访问层设计模式 - Repositor…...
力扣整理版九:贪心算法(待整理)
局部最优 全局最优 局部最优可以推出全局最优 并且想不出反例 ----------------------------- (1) 455 分发饼干 (2) 1005 k次取反后最大化的数组和 (3) 860 柠檬水找零 (2) 376 摆动序列 (3) 122 买卖股票的最佳时机2 (4) 135 分发糖果 (4) 55 跳跃游戏 (5) 45 跳…...
香橙派--安装RKMPP、x264、libdrm、FFmpeg(支持rkmpp)以及opencv(支持带rkmpp的ffmpeg)(适用于RK3588平台)
1. 安装RKMPP git clone https://github.com/rockchip-linux/mppcd mpp/build/linux/aarch64./make-Makefiles.bashmake -j8sudo make installRKMPP:用于编解码测试,支持RK3588平台。 2. 安装x264 git clone https://code.videolan.org/videolan/x264…...
计算机毕业设计Python+大模型美食推荐系统 美食可视化 美食数据分析大屏 美食爬虫 美团爬虫 机器学习 大数据毕业设计 Django Vue.js
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
1138:将字符串中的小写字母转换成大写字母
【题目描述】 给定一个字符串,将其中所有的小写字母转换成大写字母。 【输入】 输入一行,包含一个字符串(长度不超过100,可能包含空格)。 【输出】 输出转换后的字符串。 【输入样例】 helloworld123Ha 【输出样例】…...
Wireshark抓取HTTPS流量技巧
一、工具准备 首先安装wireshark工具,官方链接:Wireshark Go Deep 二、环境变量配置 TLS 加密的核心是会话密钥。这些密钥由客户端和服务器协商生成,用于对通信流量进行对称加密。如果能通过 SSL/TLS 日志文件(例如包含密钥的…...
Unity UGUI原理剖析
UI最重要的两部分 UI是如何渲染出来的点击事件如何触发何时发生UI重绘 1:UI如何渲染出来的 UI渲染一定是有顶点的,没有顶点就没法确定贴图的采样,UGUI的顶点在一张Mesh上创建,经过渲染管线UI就渲染到屏幕上了,UI的渲染…...
实现Excel文件和其他文件导出为压缩包,并导入
导出 后端: PostMapping("/exportExcelData")public void exportExcelData(HttpServletRequest request, HttpServletResponse response, RequestBody ResData resData) throws IOException {List<Long> menuIds resData.getMenuIds();List<Co…...
Linux:基础开发工具
目录 软件包管理器yum 什么是软件包? 查看软件包 安装软件 卸载软件 vim vim的基本操作 gcc/g使用 预处理 编译 汇编 连接 make/Makefile .PHONY伪目标 定义使用变量 版本控制器Git 安装git git的使用 git add git commit git push git pull …...
【mac】终端左边太长处理,自定义显示名称(terminal路径显示特别长)
1、打开终端 2、步骤 (1)修改~/.zshrc文件 nano ~/.zshrc(2)添加或修改PS1,我是自定义了名字为“macminiPro” export PS1"macminiPro$ "(3)使用 nano: Ctrl o (字母…...
嵌入式硬件设计:从概念到实现的全流程
嵌入式硬件设计是现代电子技术中一个至关重要的领域,涉及从硬件架构设计到硬件调试的各个方面。它为我们日常生活中的各类智能设备、家电、工业控制系统等提供了强大的支持。本文将介绍嵌入式硬件设计的基本流程、关键技术、常用工具以及常见的挑战和解决方案&#…...
【Nginx】核心概念与安装配置解释
文章目录 1. 概述2. 核心概念2.1.Http服务器2.2.反向代理2.3. 负载均衡 3. 安装与配置3.1.安装3.2.配置文件解释3.2.1.全局配置块3.2.2.HTTP 配置块3.2.3.Server 块3.2.4.Location 块3.2.5.upstream3.2.6. mine.type文件 3.3.多虚拟主机配置 4. 总结 1. 概述 Nginx是我们常用的…...
数据库-MySQL-MybatisPlus实战
文章目录 前言一、整合mybatis-plus二、CRUD操作1、insert操作2、update操作3、delete操作 三、条件构造器(Wrapper)QueryWrapperUpdateWrapperLambdaQueryWrapperLambdaUpdateWrapper 四、分页查询五、自定义主键生成器六、总结 前言 mybatis相信都不陌生,目前互联…...
Vue2学习记录
前言 这篇笔记,是根据B站尚硅谷的Vue2网课学习整理的,用来学习的 如果有错误,还请大佬指正 Vue核心 Vue简介 Vue (发音为 /vjuː/,类似 view) 是一款用于构建用户界面的 JavaScript 框架。 它基于标准 HTML、CSS 和 JavaScr…...
thinkphp中对请求封装
请求的封装 //调用 $res Http::post($this->baseUrl . $url,$params,[CURLOPT_HTTPHEADER > [Content-Type: application/json,Content-Length: . strlen($params),],]);<?php namespace fast; /*** 字符串类*/ class Http {/*** 发送一个POST请求*/public static …...
网络安全中的数据科学如何重新定义安全实践?
组织每天处理大量数据,这些数据由各个团队和部门管理。这使得全面了解潜在威胁变得非常困难,常常导致疏忽。以前,公司依靠 FUD 方法(恐惧、不确定性和怀疑)来识别潜在攻击。然而,将数据科学集成到网络安全中…...
通过指令导入/导出vscode扩展插件
导出扩展: 打开VSCode终端: 在VSCode中,你可以通过菜单栏的“终端”选项打开终端,或者使用快捷键Ctrl (反引号,通常在键盘左上角)。运行导出命令: 在终端中,输入以下命…...
vscode添加环境变量(mujoco)
文章目录 前言一、创建.env文件二、编写setting.jason 前言 之前一直用pycharm,最近改用cursor了,在pycharm中设置环境变量修改运行配置就行了,vscode要麻烦一些,记录一下。 一、创建.env文件 以mujoco环境变量为例,…...
0-1背包问题(1):贪心算法
问题: 有 n 个物品和背包的容量,每个物品的重量为 w[i],价值为 v[i],背包的容量为 W。选若干个物品放入购物车,物品不可分割,使价值最大。 问题分析: 首先考虑贪心策略: 每次挑选…...
Qt界面篇:QMessageBox高级用法
1、演示效果 2、用法注意 2.1 设置图标 用于显示实际图标的pixmap取决于当前的GUI样式。也可以通过设置icon pixmap属性为图标设置自定义pixmap。 QMessageBox::Icon icon(...
计算机操作系统——进程控制(Linux)
进程控制 进程创建fork()函数fork() 的基本功能fork() 的基本语法fork() 的工作原理fork() 的典型使用示例fork() 的常见问题fork() 和 exec() 结合使用总结 进程终止与$进程终止的本质进程终止的情况正常退出(Exit)由于信号终止非…...
游戏引擎学习第23天
实时代码编辑功能的回顾 当前实现的实时代码编辑功能已经取得了显著的成功,表现出强大的性能和即时反馈能力。该功能允许开发者在修改代码后几乎立即看到变化在运行中的程序中体现出来,极大提升了开发效率。尽管目前的演示内容较为简单,呈现…...
0基础学java之Day25
Vector /** 知识点:Vector独有的方法 理解: * Vector在JDK1.0开始就已经存在 -- 元老级别的集合类, * 集合框架的概念是JDK1.2开始才有的, * 开发人员为了将Vector保留下来…...
android集成FFmpeg步骤以及常用命令,踩坑经历
1、入坑第一步:首先集成的库必须正确。最好是有ndk的,FFmpeg有许多个版本,我才开始接触的时候随便选了一个,一般的 方法没有问题。但是涉及到需要使用libx264等条件进行编码时,老是报错,网上搜索资料也没有人说需要ndk的支持才行。这个问题困扰了好几天,怎么试不行,最后…...
Mac——鼠标增强插件Mos
功能说明: 能够解决鼠标断续、不灵敏等鼠标问题。 下载地址: Mac——鼠标增强插件Mos...
【c++篇】:解读Set和Map的封装原理--编程中的数据结构优化秘籍
✨感谢您阅读本篇文章,文章内容是个人学习笔记的整理,如果哪里有误的话还请您指正噢✨ ✨ 个人主页:余辉zmh–CSDN博客 ✨ 文章所属专栏:c篇–CSDN博客 文章目录 前言一.set和map的初步封装1.树的节点封装修改2.Find()查找函数3.红…...
华为鸿蒙内核成为HarmonyOS NEXT流畅安全新基座
HDC2024华为重磅发布全自研操作系统内核—鸿蒙内核,鸿蒙内核替换Linux内核成为HarmonyOS NEXT稳定流畅新基座。鸿蒙内核具备更弹性、更流畅、更安全三大特征,性能超越Linux内核10.7%。 鸿蒙内核更弹性:元OS架构,性能安全双收益 万…...
ArcGIS API for Javascript学习
一、ArcGIS API for Javascript 介绍 ArcGIS API for Javascript 是由美国 Esri 公司推出,跟随ArcGIS 9.3 同时发布的,是Esri 基于dojo 框架和 REST 风格实现的一套编程接口。通过 ArcGIS API for Javascript可以对ArcGIS for Server 进行访问ÿ…...
LeetCode 3206.交替组 I:遍历
【LetMeFly】3206.交替组 I:遍历 力扣题目链接:https://leetcode.cn/problems/alternating-groups-i/ 给你一个整数数组 colors ,它表示一个由红色和蓝色瓷砖组成的环,第 i 块瓷砖的颜色为 colors[i] : colors[i] …...
环形缓冲区
什么是环形缓冲区 环形缓冲区,也称为循环缓冲区或环形队列,是一种特殊的FIFO(先进先出)数据结构。它使用一块固定大小的内存空间来缓存数据,并通过两个指针(读指针和写指针)来管理数据的读写。当任意一个指针到达缓冲区末尾时,会自动回绕到缓冲区开头,形成一个"环"。…...
Maven 仓库
Maven 仓库对于管理构建 Java 项目所需的依赖和插件至关重要。 Maven 仓库主要有三种类型:本地仓库、中央仓库和远程仓库。 本文将探讨每种仓库的用途以及如何有效使用它们。 Maven 仓库类型 本地仓库 本地仓库是位于您本地机器上的一个目录,Maven 在…...
29.UE5蓝图的网络通讯,多人自定义事件,变量同步
3-9 蓝图的网络通讯、多人自定义事件、变量同步_哔哩哔哩_bilibili 目录 1.网络通讯 1.1玩家Pawn之间的同步 1.2事件同步 1.3UI同步 1.4组播 1.5变量同步 1.网络通讯 1.1玩家Pawn之间的同步 创建一个第三人称项目 将网络模式更改为监听服务器,即将房主作为…...
计算机网络习题解答--个人笔记(未完)
本篇文章为关于《计算机网络-自顶向下方法第七版》的阅读总结和课后习题解答(未完待续) 第二章: cookie:(这里是比较老版本的HTTP,具体HTTPs是怎么实现的不是很清楚)cookie的原理其实很简单。就是在HTTP消息头上又多…...
Unity图形学之雾Fog
1.设置雾化: 2.雾化变化曲线:FogMode (1)线性: (2)一次指数: (3)二次指数: Shader "Custom/FogTest" {Properties{_Color ("Color…...
ML 系列:第 36 节 — 统计学中的抽样类型
ML 系列:第 36 天 — 统计学中的抽样类型 文章目录 一、说明二、抽样方法三、简单随机抽样四、 Stratified Sampling分层抽样五、 Cluster Sampling 整群抽样六、Systematic Sampling系统抽样七、Convenience Sampling便利抽样八、结论 一、说明 统计学中的抽样类型…...
docker-compose部署java服务
文章目录 一、下载安装docker-compose二、编写Dockerfile文件三、编写docker-compose.yml文件配置说明 四、服务启动五、测试与验证 一、下载安装docker-compose 在安装docker时,并不会同时把docker-compose安装好,需要额外安装一下 下载docker-compos…...
ubuntu22开机自动登陆和开机自动运行google浏览器自动打开网页
一、开机自动登陆 1、打开settings->点击Users 重启系统即可自动登陆桌面 二、开机自动运行google浏览器自动打开网页 1、安装google浏览器 sudo wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb sudo dpkg -i ./google-chrome-stable…...
java接口对接标准
概述 最近在跟许多外部平台对接,遇到了很多问题,在此记录一下接口的对接标准。 接口对接标准 确认环境,分别获取di和prd环境的接口信息,比如域名。确认不同环境的防火墙是否连通。接口校验,接口携带的token信息如何…...
训练的decoder模型文本长度不一致,一般设置为多大合适,需要覆盖最长的文本长度么
在训练解码器模型时,文本长度不一致是常见的情况,需要根据任务的特性和数据集的长度分布来设置合理的最大长度 (max_length)。以下是一些指导原则,帮助你设置合适的最大长度: 1. 是否需要覆盖最长文本长度 覆盖最长文本长度: 如果任务对完整性要求很高(例如生成数学公式、…...