Как подключиться к 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

Вопросы следующие:


person geri-m    schedule 24.01.2017    source источник
comment
Вы заставили это работать? На одном этапе я сделал то же самое, что и вы (я также использовал RemoteWebDriver), но через месяц я вернулся к своей настройке, и она не подключается ..   -  person Clint    schedule 08.04.2017
comment
Чтобы все заработало, мы перешли на phantomJS. Используя Selenium PhantomJSDriver и протокол WebWire, мы смогли использовать эту настройку. (Не) к счастью, мы должны провести расследование снова, поскольку разработчик phantomJS уходит в отставку / Chrome 59 поддерживает Headless. (groups.google.com/forum/#!topic/phantomjs/9aI5d -LDuNE)   -  person geri-m    schedule 13.04.2017


Ответы (5)


Я думаю, что ридми немного вводит в заблуждение. Вам не нужно запускать сам Chromium, вы можете использовать RemoteWebDriver. Убедитесь, что установлен хромированный драйвер (https://sites.google.com/a/chromium.org/chromedriver/home).

  • Запустить chromedriver (например, ./chromedriver или ./chromedriver --port=9515)
  • Затем вы должны указать хромированному драйверу использовать 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.

person hkq    schedule 13.04.2017
comment
У меня это тоже сработало, спасибо! Теперь исправим исключение an X display is required for keycode conversions, consider using Xvfb! - person Clint; 14.04.2017
comment
Для других: $sudo apt-get install xvfb $xvfb-run /home/nikki/chromedriver --whitelisted-ips - person Clint; 14.04.2017
comment
@hkq Нужно ли пристально смотреть? Потому что я запускал свои тесты без запуска Chrome-драйвера, и тесты выполнялись без головы - person Rameshwar; 09.11.2017
comment
@Rameshwar: Нет, в этом нет необходимости, но рекомендуется. В противном случае вы начнете и завершите один процесс для каждого теста. Взято с веб-сайта chomedriver: класс ChromeDriver запускает процесс сервера ChromeDriver при создании и завершает его при вызове quit. Это может привести к потере значительного количества времени для больших наборов тестов, в которых для каждого теста создается экземпляр ChromeDriver. - person hkq; 07.12.2017
comment
chromeOptions.setBinary(System.getProperty("chromeBinaryPath")); помогает мне найти путь - person TomTomSamSam; 31.05.2019

В качестве альтернативы, если вы запускаете его локально, вы можете просто сделать это так. В scala.

val chromeOptions = new ChromeOptions
chromeOptions.addArguments("--headless")
new ChromeDriver(chromeOptions)
person Stephen    schedule 01.09.2017

* Используйте следующий код:

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 


    }
person kuo chang    schedule 21.01.2019
comment
Я использую селен версии 3, но я не видел эту опцию .setHeadless - person ArrchanaMohan; 19.02.2019
comment
Для этого нужно использовать версию 3+ selileum - person Yeshwin Verma The Programmer; 15.03.2021

Если вы используете драйвер хрома selenium 3+, вы можете просто использовать параметры Chrome и запустить драйвер. Проверить детали в проекте

Пример проекта в Chrome Headless с различными параметрами

 options.setHeadless(true)
person Shantonu    schedule 19.02.2018

В Chrome 59 есть возможность создавать экземпляры как безголовые. Я пробовал для Windows с новым драйвером Chrome 2.30, и он сработал для меня https://www.automation99.com/2017/07/how-to-use-chrome-headless-using.html?m=1

person Anjan Mondal    schedule 03.07.2017