如何使用 Selenium 连接到 Chromium Headless
How to connect to Chromium Headless using Selenium
我想使用 chromium headless 来使用 selenium 进行自动化测试。 (https://chromium.googlesource.com/chromium/src/+/lkgr/headless/README.md)
我在 9222 上已经 运行 有了无头版本。所以如果我打开 http://10.252.100.33:9222/json/I 就会得到
[ {
"description": "",
"devtoolsFrontendUrl": "/devtools/inspector.html?ws=127.0.0.1:9223/devtools/page/0261be06-1271-485b-bdff-48e443de7a91",
"id": "0261be06-1271-485b-bdff-48e443de7a91",
"title": "The Chromium Projects",
"type": "page",
"url": "https://www.chromium.org/",
"webSocketDebuggerUrl": "ws://127.0.0.1:9223/devtools/page/0261be06-1271-485b-bdff-48e443de7a91"
} ]
作为下一步,我想将硒连接到无头铬。但是当我尝试
final DesiredCapabilities caps = DesiredCapabilities.chrome();
final WebDriver driver = new RemoteWebDriver(new URL("http://localhost:9222/json"), caps);
driver.get("http://www.google.com");
我确实收到以下注销
Jän 24, 2017 7:14:45 PM org.openqa.selenium.remote.ProtocolHandshake createSession
INFORMATION: Attempting bi-dialect session, assuming Postel's Law holds true on the remote end
Jän 24, 2017 7:14:45 PM org.openqa.selenium.remote.ProtocolHandshake createSession
INFORMATION: Falling back to original OSS JSON Wire Protocol.
Jän 24, 2017 7:14:45 PM org.openqa.selenium.remote.ProtocolHandshake createSession
INFORMATION: Falling back to straight W3C remote end connection
org.openqa.selenium.SessionNotCreatedException: Unable to create new remote session. desired capabilities = Capabilities [{browserName=chrome, version=, platform=ANY}], required capabilities = Capabilities [{}]
Build info: version: '3.0.1', revision: '1969d75', time: '2016-10-18 09:49:13 -0700'
System info: host: 'Geralds-MacBook-Pro.local', ip: '192.168.0.249', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.12.2', java.version: '1.8.0_111'
Driver info: driver.version: RemoteWebDriver
问题是:
- RemoteWebDriver 是连接无头设备的正确驱动程序吗
铬?
- 我了解了 DevTool 协议 (https://docs.google.com/presentation/d/1gqK9F4lGAY3TZudAtdcxzMQNEE7PcuQrGu83No3l0lw/),但我不确定如何使用 selenium 创建这样的客户端。
- 使用 Chrome DevTools 连接 Chromium Headless 工作 (https://developers.google.com/web/tools/chrome-devtools/remote-debugging/) 除了一些分段库 ;-)
我认为自述文件有点误导。您不必启动 Chromium 本身,您可以使用 RemoteWebDriver
。确保已安装 chromedriver (https://sites.google.com/a/chromium.org/chromedriver/home)。
- 启动 chromedriver(例如
./chromedriver
或 ./chromedriver --port=9515
)
- 然后你告诉 chromedriver 使用 Chromium 而不是 Chrome
- 添加
--headless
作为附加参数
代码应如下所示:
final ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.setBinary("/usr/bin/chromium-browser");
chromeOptions.addArguments("--headless");
desiredCapabilities.setCapability(ChromeOptions.CAPABILITY, chromeOptions);
WebDriver driver = new RemoteWebDriver(url, desiredCapabilities);
在 Ubuntu Linux 为我工作。
Chrome 59 有能力将实例创建为 headless 。我已经尝试使用新的 chrome 驱动程序 2.30 Windows,它对我有用
https://www.automation99.com/2017/07/how-to-use-chrome-headless-using.html?m=1
或者,如果您的 运行 在本地,您也可以这样做。在 Scala 中。
val chromeOptions = new ChromeOptions
chromeOptions.addArguments("--headless")
new ChromeDriver(chromeOptions)
如果您使用的是 selenium 3+ chrome 驱动程序,您可以简单地使用 chrome 选项并启动驱动程序。查看项目中的详细信息
Example Project on Chrome Headless running with different options
options.setHeadless(true)
使用以下代码:
ChromeOptions options = new ChromeOptions();
options.setHeadless(true); //Set Chrome option
driver = new ChromeDriver(options);
你会得到“无头”Chrome!
完整代码
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions; //import ChromeOptions
public class web_crawl {
private static WebDriver driver = null;
public static void main(String[] args) {
ChromeOptions options = new ChromeOptions();
options.setHeadless(true);
driver = new ChromeDriver(options);
driver.get("http://www.google.com"); //The website you want to connect to
}
System.setProperty("webdriver.chrome.driver", "Path of the chrome driver");
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.addArguments("--headless");
chromeOptions.addArguments("--window-size=1920,1200");
webDriver = new ChromeDriver(chromeOptions);
隐形浏览器 window 的大小只有 800x600。因此,您需要使用附加参数
设置所需的屏幕尺寸
对我来说,上面的解决方案有效:
chromeOptions.setBinary("/usr/bin/chromium-browser");
但我不得不添加(因为 devtools):
chromeOptions.addArguments("--remote-debugging-port=9222");
并禁用防火墙
我想使用 chromium headless 来使用 selenium 进行自动化测试。 (https://chromium.googlesource.com/chromium/src/+/lkgr/headless/README.md)
我在 9222 上已经 运行 有了无头版本。所以如果我打开 http://10.252.100.33:9222/json/I 就会得到
[ {
"description": "",
"devtoolsFrontendUrl": "/devtools/inspector.html?ws=127.0.0.1:9223/devtools/page/0261be06-1271-485b-bdff-48e443de7a91",
"id": "0261be06-1271-485b-bdff-48e443de7a91",
"title": "The Chromium Projects",
"type": "page",
"url": "https://www.chromium.org/",
"webSocketDebuggerUrl": "ws://127.0.0.1:9223/devtools/page/0261be06-1271-485b-bdff-48e443de7a91"
} ]
作为下一步,我想将硒连接到无头铬。但是当我尝试
final DesiredCapabilities caps = DesiredCapabilities.chrome();
final WebDriver driver = new RemoteWebDriver(new URL("http://localhost:9222/json"), caps);
driver.get("http://www.google.com");
我确实收到以下注销
Jän 24, 2017 7:14:45 PM org.openqa.selenium.remote.ProtocolHandshake createSession
INFORMATION: Attempting bi-dialect session, assuming Postel's Law holds true on the remote end
Jän 24, 2017 7:14:45 PM org.openqa.selenium.remote.ProtocolHandshake createSession
INFORMATION: Falling back to original OSS JSON Wire Protocol.
Jän 24, 2017 7:14:45 PM org.openqa.selenium.remote.ProtocolHandshake createSession
INFORMATION: Falling back to straight W3C remote end connection
org.openqa.selenium.SessionNotCreatedException: Unable to create new remote session. desired capabilities = Capabilities [{browserName=chrome, version=, platform=ANY}], required capabilities = Capabilities [{}]
Build info: version: '3.0.1', revision: '1969d75', time: '2016-10-18 09:49:13 -0700'
System info: host: 'Geralds-MacBook-Pro.local', ip: '192.168.0.249', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.12.2', java.version: '1.8.0_111'
Driver info: driver.version: RemoteWebDriver
问题是:
- RemoteWebDriver 是连接无头设备的正确驱动程序吗 铬?
- 我了解了 DevTool 协议 (https://docs.google.com/presentation/d/1gqK9F4lGAY3TZudAtdcxzMQNEE7PcuQrGu83No3l0lw/),但我不确定如何使用 selenium 创建这样的客户端。
- 使用 Chrome DevTools 连接 Chromium Headless 工作 (https://developers.google.com/web/tools/chrome-devtools/remote-debugging/) 除了一些分段库 ;-)
我认为自述文件有点误导。您不必启动 Chromium 本身,您可以使用 RemoteWebDriver
。确保已安装 chromedriver (https://sites.google.com/a/chromium.org/chromedriver/home)。
- 启动 chromedriver(例如
./chromedriver
或./chromedriver --port=9515
) - 然后你告诉 chromedriver 使用 Chromium 而不是 Chrome
- 添加
--headless
作为附加参数
代码应如下所示:
final ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.setBinary("/usr/bin/chromium-browser");
chromeOptions.addArguments("--headless");
desiredCapabilities.setCapability(ChromeOptions.CAPABILITY, chromeOptions);
WebDriver driver = new RemoteWebDriver(url, desiredCapabilities);
在 Ubuntu Linux 为我工作。
Chrome 59 有能力将实例创建为 headless 。我已经尝试使用新的 chrome 驱动程序 2.30 Windows,它对我有用 https://www.automation99.com/2017/07/how-to-use-chrome-headless-using.html?m=1
或者,如果您的 运行 在本地,您也可以这样做。在 Scala 中。
val chromeOptions = new ChromeOptions
chromeOptions.addArguments("--headless")
new ChromeDriver(chromeOptions)
如果您使用的是 selenium 3+ chrome 驱动程序,您可以简单地使用 chrome 选项并启动驱动程序。查看项目中的详细信息
Example Project on Chrome Headless running with different options
options.setHeadless(true)
使用以下代码:
ChromeOptions options = new ChromeOptions();
options.setHeadless(true); //Set Chrome option
driver = new ChromeDriver(options);
你会得到“无头”Chrome!
完整代码
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions; //import ChromeOptions
public class web_crawl {
private static WebDriver driver = null;
public static void main(String[] args) {
ChromeOptions options = new ChromeOptions();
options.setHeadless(true);
driver = new ChromeDriver(options);
driver.get("http://www.google.com"); //The website you want to connect to
}
System.setProperty("webdriver.chrome.driver", "Path of the chrome driver");
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.addArguments("--headless");
chromeOptions.addArguments("--window-size=1920,1200");
webDriver = new ChromeDriver(chromeOptions);
隐形浏览器 window 的大小只有 800x600。因此,您需要使用附加参数
设置所需的屏幕尺寸对我来说,上面的解决方案有效:
chromeOptions.setBinary("/usr/bin/chromium-browser");
但我不得不添加(因为 devtools):
chromeOptions.addArguments("--remote-debugging-port=9222");
并禁用防火墙