有时我们会遇到希望 Selenium 连接并使用先前手动或由其他程序打开的现有浏览器的情况。
为什么我们希望 Selenium 连接到之前打开的浏览器?
也许您想在启动自动化执行之前执行一些需要手动干预的任务。例如,我们可能需要手动启动浏览器,导航到所需的页面,执行一些手动任务,例如手动输入验证码,然后运行自动化脚本以从那里继续。
单击桌面应用程序上的按钮可打开网页。我们还有一些其他工具用于自动化桌面应用程序,但我们希望 Selenium 在网页打开时立即进行控制。
调试——让我们假设我们正在为应用程序中的某个屏幕(产品结帐)编写测试脚本。但到达该页面(添加到购物车)的脚本尚未准备好。我们可以手动启动浏览器并导航到该页面,然后运行自动化脚本。
现在,我们回到最初的问题——如何将 Selenium 连接到现有的浏览器会话?
我们可以利用Chrome DevTools 协议。它允许客户检查和调试 Chrome 浏览器。
先决条件:将 Chrome 添加到 PATH
请确保 chrome 可执行文件的路径已添加到环境变量中PATH。您可以通过运行命令chrome.exe(在 Windows 上)或Google/ Chrome(在 Mac 上)来检查它。它应该启动 Chrome 浏览器。
如果您收到如下类似消息,则表示 Chrome 尚未添加到您的系统路径中:
'chrome' is not recognized as an internal or external command,operable program or batch file.
如果是这种情况,请随时 Google如何将 chrome 添加到 PATH?如果您使用的是 Mac,请按照以下的步骤操作:
打开终端输入
vi ~/.bash_profile
如果没有加过PATH,输入
export PATH="/Applications/Google Chrome.app/Contents/MacOS:$PATH"
把路径输进去以后按下键盘左上角的Esc 键退出编辑,然后按:,输入wq 保存即可退出。
一般我们重启一下 Terminal 即可,不过通过source ~/.bash_profile 这样直接重新加载一下更省事。
第 1 步:使用自定义标志启动浏览器
为了使 Chrome 能够打开端口进行远程调试,我们需要使用自定义标志来启动它 –
chrome.exe --remote-debugging-port=9222 --user-data-dir="C:\selenum\ChromeProfile"
对于Mac:
Google\ Chrome --remote-debugging-port=9222 --user-data-dir="~/ChromeProfile"
对于 --remote-debugging-port值,您可以指定任何打开的端口。
对于--user-data-dir标志,您需要传递一个目录,将在其中创建新的 Chrome 配置文件。它的存在只是为了确保 chrome 在单独的配置文件中启动,并且不会污染您的默认配置文件。
一旦 Chrome 以这种方式启动,它就会在给定端口上打开一个连接,任何客户端都可以连接到该端口进行调试。
您现在可以手动使用浏览器,导航到尽可能多的页面,执行操作,一旦您需要自动化代码来负责,您就可以运行自动化脚本。您只需要修改 Selenium 脚本即可使 Selenium 连接到打开的浏览器。
您可以验证 Chrome 是否以正确的方式启动:
正常启动一个新的浏览器窗口(没有任何标志),然后导航到http://127.0.0.1:9222
确认您是否在第二个浏览器窗口中看到 Google 主页参考
第 2 步:启动浏览器并提供选项
这是简单但神奇的 Java 和 Python 代码。您可以轻松地将其转换为您选择的编程语言。
// JAVA Example
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
//Change chrome driver path accordingly
System.setProperty("webdriver.chrome.driver", "C:\\selenium\\chromedriver.exe");
ChromeOptions options = new ChromeOptions();
options.setExperimentalOption("debuggerAddress", "127.0.0.1:9222");
WebDriver driver = new ChromeDriver(options);
System.out.println(driver.getTitle());
# PYTHON Example
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
#Change chrome driver path accordingly
chrome_driver = "C:\chromedriver.exe"
driver = webdriver.Chrome(chrome_driver, chrome_options=chrome_options)
print driver.title
Mac-Python:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_experimental_option("debuggerAddress", "127.0.0.1:12306")
driver = webdriver.Chrome(options=options)
debuggerAddress 下的值是多少?
URL127.0.0.1表示您的本地主机。我们提供了相同的端口,IE9222,我们用来启动 Chrome 的--remote-debugging-port标志。虽然您可以使用任何端口,但您需要确保它已打开且可供使用。
故障排除
我无法连接到浏览器窗口。
确认您是否按照教程中所述的方式启动了浏览器
www.google.com在同一浏览器窗口中手动转到
正常启动一个新的浏览器窗口(没有任何标志),然后导航到http://127.0.0.1:9222
确认您是否在第二个浏览器窗口中看到 Google 主页参考
我可以手动连接到浏览器窗口,但不能通过代码连接。
验证您已导入正确的包。请参阅上面的代码块。
根据您安装的 Chrome 版本检查您是否拥有正确的 Chrome 驱动程序。
如果您发现本教程有用,请与世界分享。