ElementNotVisibleException при использовании браузера Chrome без браузера

Когда я запускаю тестовый скрипт в браузере Chrome без заголовка, ссылка на элемент не видна, не может делать linkElement.click(). в головном режиме все ок. Вся остальная информация находится в stacktrace. Кто-нибудь знает, что делать, пожалуйста?

Трассировки стека:

ОШИБКА: Сообщение: элемент не отображается
(Информация о сеансе: headless chrome = 60.0.3112.90)
(Информация о драйвере: chromedriver = 2.31.488763 (092de99f48a300323ecf8c2a4e2e7cab51de5ba8), платформа = Windows NT 6.1.7601 SP1 x86_64)
Отслеживание (последний вызов последним):
Файл «C: \ nik-x.py», строка 148, в основном
func (nik)
Файл «C: \ lib \ support.py» , строка 121, в оболочке
поднять ret
Файл "C: \ lib \ support.py", строка 108, в newFunc
res [0] = func (* args, ** kwargs)
Файл "C: \ testcases \ nik-1003.py", строка 37, в тестовом примере
i.click ()
Файл "C: \ Python36 \ lib \ site-packages \ selenium \ webdriver \ remote \ webelement.py ", строка 7
7, при нажатии
self._execute (Command.CLICK_ELEMENT)
Файл" C: \ Python36 \ lib \ site-packages \ selenium \ webdriver \ remote \ webelement.py ", строка 4
93, в _execute
return self._parent.execute (команда, параметры)
Файл" C: \ Python36 \ lib \ site-packages \ selenium \ webdriver \ remote \ webdriver.py ", строка 25
6, при выполнении
self.error_handler.check_response (ответ)
Файл "C: \ Python36 \ lib \ site-packages \ selenium \ webdriver \ remote \ errorhandler.py", строка
194, в check_response
поднять класс исключения (сообщение, экран, трассировка стека)
selenium.common.exceptions.ElementNotVisibleException: Сообщение: элемент не виден
(Информация о сеансе: headless chrome = 60.0.3112.90)
(Информация о драйвере: chromedriver = 2.31.488763 (092de99f48a300323ecf8c2a4e2e7cab51de5ba8), платформа = Windows NT 6.1.7601 SP1 x86_64)

Вот мой фрагмент кода:
icons = nik.elementLeftmenuSportIcons() for i in icons[:-1]: try: i.click()

HTML со страницы тестирования: <a href="#" class="default b_futbal gaPageEventElement" data-ga-cat="Sporty" data-ga-action="futbal"> <span class="left-menu-only-large-res">Futbal</span> </a>


person Ghost    schedule 08.08.2017    source источник
comment
Трассировка стека ошибок говорит об этом ElementNotVisibleException: Message: element not visible, либо вам нужно подождать, пока элемент станет видимым, либо вы должны сделать элемент в области просмотра доступным для щелчка.   -  person DebanjanB    schedule 08.08.2017
comment
Это также может быть реальная разница в JS. Потому что JS может изменять атрибуты. Вместо того, чтобы щелкать элемент, получите элемент и распечатайте все его свойства, особенно координаты и все такое. Тогда посмотрите, какие есть различия   -  person Tarun Lalwani    schedule 08.08.2017
comment
@ DebanjanB Спасибо, я пытался добавить wait (10), switch_to_frame, window и т. Д., Но у меня все еще та же проблема.   -  person Ghost    schedule 09.08.2017


Ответы (4)


Я думаю, проблема в том, что элемент действительно не отображается в окне просмотра по умолчанию (600x800) Headless Chrome.

Размер окна Headless Browser должен быть установлен в качестве аргумента при запуске Chrome. Я использую javascript (я думаю, что API похож на python):

var Options = require('selenium-webdriver/chrome').Options;
var options = new Options();
options.addArguments('headless');
options.addArguments('disable-gpu');
options.addArguments('window-size=1200,1100');

browser = builder.forBrowser('chrome').setChromeOptions(options).build();

Дополнительная информация

Я также настраиваю размер окна с помощью webdriver с browser.manage().window().setSize(1200,1100);. Но этой команды недостаточно в безголовом Chrome. В варианте без головы это работает.

person powerpete    schedule 19.09.2017

Вы можете сделать это двумя способами, как показано ниже.

1. Передача размера окна в параметрах Chrome, как указано ниже (до создания экземпляра драйвера):

ChromeOptions options = new ChromeOptions()
options.addArguments("headless");
options.addArguments("window-size=1200,1100");
WebDriver driver = new ChromeDriver(options);

2. Установите размер окна после создания драйвера Chrome:

WebDriver webDriver= new ChromeDriver();
webDriver.manage().window().setSize(new Dimension(1200,1100));
person LoRe    schedule 21.02.2019

options.addArguments ('размер окна = 1200,1100');

Работал у меня в режиме безголового хрома :) Большое спасибо @powerpete

Ниже приведены полные настройки для безголового хрома в Groovy: -

        ChromeOptions options = new ChromeOptions()
        DesiredCapabilities capabilities = DesiredCapabilities.chrome()
        options.addArguments('headless','disable-gpu','--test-type','--ignore-certificate-errors')
        options.addArguments('window-size=1200,1100');
        capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);
        capabilities.setCapability(ChromeOptions.CAPABILITY, options)
        driver = {new ChromeDriver(capabilities)}
person Bhupender Kumawat    schedule 29.09.2017

Если изменение размера окна не работает для кого-то вроде меня, возможно, HTML действительно переключается между режимом без заголовка и режимом с заголовком.

У меня была аналогичная проблема, но безголовый работал в FireFox, а не в Chrome. Xpath для элемента Chrome работал только в режиме заголовка. Я обнаружил, что HTML немного изменился в безголовом режиме Chrome.

Я исправил это, заменив Xpath из элемента в Chrome на Xpath из элемента в FireFox при использовании безголового режима в Chrome.

person Jacob Ouellet    schedule 30.08.2019