使用 Selenium 和 Chrome WebDriver 进行自动化测试时,需要注意一些关键的配置和环境设置问题以确保一切顺利进行。下面列出了一些在安装和配置过程中应考虑的主要问题:
1. ChromeDriver 和 Chrome 浏览器版本兼容性
- 确保你安装的 ChromeDriver 版本与你的 Chrome 浏览器版本兼容。ChromeDriver 和 Chrome 浏览器的版本更新频繁,而且新版本的 ChromeDriver 可能不支持较旧的 Chrome 浏览器版本。
- 可以在 ChromeDriver 官网查看兼容性信息并下载对应版本的 ChromeDriver。
- Chrome for Testing availability
- 需要下载两个东西,一个是浏览器,我们下载无头版本的,下载地址:https://storage.googleapis.com/chrome-for-testing-public/123.0.6312.122/linux64/chrome-headless-shell-linux64.zip,一个是驱动,下载地址:https://storage.googleapis.com/chrome-for-testing-public/123.0.6312.122/linux64/chromedriver-linux64.zip
2. 正确配置 ChromeDriver 和Chrome路径
- 在使用 Selenium 时,需要确保系统能够找到 ChromeDriver 的路径。可以将 ChromeDriver 的路径添加到系统的环境变量中,或者在代码中直接指定路径。我安装在/usr/bin/chromedriver,注意需要上执行权限。
- 另外Chrome的路径也需要安装配置好,因为我们下载的是无头版本的,因此解压以后,移动到/usr/local/bin/目录下。我的安装位置是/usr/local/bin/chrome-headless
3. 使用适当的 Chrome 选项
- 使用
ChromeOptions
类来配置 Chrome 的启动选项。常用的选项包括:--headless
:无头模式运行,不显示浏览器界面。--no-sandbox
:禁用沙盒模式,特别是在 Linux 系统或 Docker 容器中运行时可能需要。--disable-dev-shm-usage
:避免使用/dev/shm
,因为在某些环境中,它的空间可能不足。--disable-gpu
:禁用 GPU 硬件加速,有时在无头模式下运行时需要。
- 配置示例:
from selenium.webdriver.chrome.options import Options options = Options() options.add_argument('--headless') options.add_argument('--no-sandbox')
4. 处理权限和环境问题
- 确保在需要的环境中(如服务器或开发环境)有适当的权限来运行 ChromeDriver。
- 如果在容器化环境(如 Docker)中运行,可能需要额外的配置来确保 Selenium 和 ChromeDriver 正常工作。
5. 监控和处理异常
- 在使用 Selenium 进行自动化测试时,应该准备处理各种可能的异常,如
NoSuchElementException
和TimeoutException
。 - 使用显式等待(Explicit Waits)而不是隐式等待(Implicit Waits)来更精确地控制条件,从而提高测试的稳定性和可靠性。
6. 更新和维护
- 定期检查并更新 ChromeDriver 和 Selenium 库,以利用最新的功能和安全修复。
- 测试脚本应随着应用界面的变化而更新,保持测试的有效性和准确性。
7. 安全考虑
- 避免在生产环境中使用测试脚本,特别是包含敏感数据的情况下。
- 注意不要在公共或不安全的网络上暴露测试系统。
通过考虑这些关键点,可以有效地使用 Selenium 和 Chrome WebDriver 进行自动化测试,确保测试环境的稳定性和测试结果的可靠性。
8、例子说明
接下来我们再验证一下上篇博文中那个例子。我们需要使用位于 /usr/local/bin/chrome-headless
的 Chrome 浏览器二进制文件来运行 Selenium WebDriver,需要确保在 Selenium 设置中正确地指定该二进制文件的路径。下面提供一个完整的示例,展示如何配置 Selenium 以使用这个自定义的 headless Chrome 浏览器来访问百度并搜索“CSDN”。
完整的 Python 脚本
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
# 设置 Chrome 的启动选项
chrome_options = Options()
chrome_options.binary_location = "/usr/local/bin/chrome-headless" # 指定 Chrome 的二进制文件位置
chrome_options.add_argument('--headless') # 无头模式
chrome_options.add_argument('--no-sandbox') # 运行在无沙盒模式
chrome_options.add_argument('--disable-dev-shm-usage') # 禁用开发者shm使用
# 指定 ChromeDriver 的路径
service = Service(executable_path="/usr/bin/chromedriver")
# 创建 WebDriver 对象
driver = webdriver.Chrome(service=service, options=chrome_options)
# 打开百度
driver.get("https://www.baidu.com")
# 找到搜索框,输入 'CSDN' 后回车搜索
search_box = driver.find_element("name", "wd")
search_box.send_keys("CSDN")
search_box.send_keys(Keys.RETURN)
# 等待页面加载完毕(示例中使用固定等待时间)
import time
time.sleep(5) # 适当调整等待时间
# 打印当前页面的标题
print("Page title:", driver.title)
# 关闭浏览器
driver.quit()
注意事项
- 确保
/usr/local/bin/chrome-headless
是一个有效的 Chrome 浏览器二进制文件,并且具有执行权限。如果不确定,可以使用ls -l /usr/local/bin/chrome-headless
来检查文件权限,并使用chmod +x /usr/local/bin/chrome-headless
来增加执行权限。 - 此脚本使用了
--headless
选项来启动 Chrome 的无头模式,这意味着浏览器不会显示 GUI。这对于服务器环境或自动化测试环境非常有用。 - 使用
time.sleep
是为了简化示例。在实际应用中,推荐使用 Selenium 的WebDriverWait
方法来智能等待某些条件的满足,从而确保页面元素已加载完毕。
运行脚本
将上述代码保存为 .py
文件,例如命名为 search_baidu.py
,然后在命令行中运行这个文件:
python3 search_baidu.py
这样,脚本将使用指定的 headless Chrome 浏览器访问百度,搜索“CSDN”,并输出搜索结果页面的标题。这是一种在自动化测试和网络爬虫中常见的技术。