Как подключиться к 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/), но я не уверен, как создать такого клиента с использованием селена.
- Подключение Chromium Headless с помощью Chrome DevTools работает ( https://developers.google.com/web/tools/chrome-devtools/remote-debugging/) помимо некоторых хранилищ сегментации;-)
7 ответов
Я думаю, что readme немного вводит в заблуждение. Вам не нужно запускать сам Chromium, и вы можете использовать RemoteWebDriver. Убедитесь, что chromedriver установлен ( https://sites.google.com/a/chromium.org/chromedriver/home).
- Запустить хромедрайвер (например,
./chromedriver
или же./chromedriver --port=9515
) - Тогда вы должны сказать chromedriver использовать хром вместо хрома
- Добавьте "--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.
В качестве альтернативы, если вы используете его локально, вы можете просто сделать это следующим образом. В скале.
val chromeOptions = new ChromeOptions
chromeOptions.addArguments("--headless")
new ChromeDriver(chromeOptions)
* Используйте следующий код:
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
}
Если вы используете драйвер селен 3+, вы можете просто использовать параметры Chrome и запустить драйвер. Проверьте детали в проекте
Пример проекта на Chrome Headless работает с различными параметрами
options.setHeadless(true)
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);
Размер невидимого окна браузера составляет всего 800x600 пикселей. Поэтому нужно указать желаемый размер экрана с дополнительным аргументом
для меня работает над решением:
chromeOptions.setBinary("/usr/bin/chromium-browser");
но мне пришлось добавить (из-за devtools):
chromeOptions.addArguments("--remote-debugging-port=9222");
и отключить брандмауэр
Chrome 59 имеет возможность создавать экземпляры как безголовые. Я пробовал для Windows с новым драйвером Chrome 2.30, и он работал для меня https://www.automation99.com/2017/07/how-to-use-chrome-headless-using.html?m=1