Почему в режиме браузера 'headless' Selenium не нажимает на кнопку?

Всем привет.
Может кто сталкивался, почему в режиме ‘headless’ Selenium не нажимает на кнопку, либо нажимает как-то “виртуально” (на деле нажатия не происходит).

То есть, если я пишу такой код:

browser.find_element_by_class_name('posting_submit.button-pro').click()

то в режиме обычного браузера кнопка нажимается. В режиме ‘haedless’ я получаю ошибку selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted

Если я пишу такой код:

share = browser.find_element_by_class_name('posting_submit.button-pro')
browser.execute_script("arguments[0].click();", share)

либо такой:

share = browser.find_element_by_class_name('posting_submit.button-pro')
webdriver.ActionChains(browser).move_to_element(share).click(share).perform()

то кнопка нажимается в обоих режимах, но, в режиме ‘headless’ она якобы нажимается - нажатия на самом деле не происходит (остальная часть кода падает).

Может кто сталкивался с подобным? Как это можно победить?

скорее всего в headless у вас разрешение маленькое и эту кнопку действительно не видно

Да нет же.

browser.maximize_window()

В оконном режиме и режиме ‘headless’ размер окна одинаковый.

Я бы не стал столь категоричным, что эта команда даёт вам ожидаемое разрешение экрана. Надо ещё точно сетить нужное разрешение экрана, ибо будет использоваться по-умолчанию. Проверьте точно разрешение окна, вывев хотя бы в консоль.

2 лайка

Попробуйте сделать скриншот в режиме хеадлесс и посмотреть что кнопка реально видна и находится там же где и в non headless режиме. Возможно вам всего лишь нужно задать размер окна т.к maximize может не срабатывать в хеадлесс

3 лайка

Скриншоты реально помогли.
Во-первых. Размер окна действительно не максимален. Но того, что запускается оказывается вполне достаточно. И кнопку видно и все что нужно.
Во-вторых. Ошибка оказалась не в том, что кнопка не нажимается из-за того что Selenium ее не видит. Она есть. Только она неактивна. А неактивна она из-за того, что - выше по коду подгружается файл с локальной машины. И вот пока это файл не загрузится - кнопка не активна.

То есть проблема оказалась в том, что в режиме headless не подгружается файл.

file_path = os.path.join(os.path.abspath(os.path.dirname(path + target)), target)
browser.find_element_by_css_selector('.mainContent_w .html5-upload-link').send_keys(file_path)

Используйте метод

driver.set_window_size(1920, 1080)

Как то еще давно я заметил что метод maximize_window не отрабатывает даже без headless, в обычном режиме. И лечилось это сменой версии вебдрайвера.

2 лайка