Селен, работающий с Chrome, но не безголовый Chrome

Я разработал пару сценариев Python с использованием Selenium и, во-первых, PhantomJS. Направляясь к автоматическим загрузкам, я переключился на (возглавляемый) Firefox (который работал), а затем на Chrome с опцией безголовых, чтобы браузер не открывался передо мной.

Мой первый скрипт, который обращается к странице и нескольким элементам HTML, прекрасно работает с Chrome без головы.

Второй, однако, работает только с Chrome. Если я добавлю "безголовый" вариант, он больше не работает. Когда я пытаюсь напечатать HTML-код в автономном режиме, чтобы понять, почему он не может найти нужный HTML-элемент, все, что у меня есть, это:

<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body></body></html>

С заголовком Chrome у меня напечатан полный HTML-код. Вот как я запускаю свой Chrome без головы:

options = webdriver.ChromeOptions()
options.add_argument("--ignore-certificate-errors") 
options.add_argument("headless") 
driver = webdriver.Chrome(chrome_options=options)

Опять же, обратите внимание, что это работает в другом моем сценарии. Единственная разница здесь в том, что мне нужно войти в систему, чтобы получить доступ к странице, но даже тогда, почему это будет работать с головой? Мой скрипт предназначен для автоматического входа в любом случае, заполнив форму.

Python: 3.6.1, Chrome: 60.0.3112.78 (64 бита), Selenium: 3.4.3

Любая идея? Спасибо.

** ОБНОВЛЕНИЕ: Вот начало кода **

url = 'https://10.11.227.21/tmui/'
driver.get(url + "login.jsp")

html_source = driver.page_source
print(html_source)

blocStatus = WebDriverWait(driver, TIMEOUT).until(EC.presence_of_element_located((By.ID, "username")))
inputElement = driver.find_element_by_id("username")
inputElement.send_keys('actualLogin')
inputElement = driver.find_element_by_id("passwd")
inputElement.send_keys('actualPassword')
inputElement.submit()

Ответ 1

У меня был такой же опыт, как у вас, и я решил его с помощью xvfb и pyvirtualdisplay.

Я использую chromedrive = v2.3.1, chrome-browser = v60 и Selenium = 3.4.3

В Headless Chrome некоторые сценарии работают не так, как ожидалось.

Пожалуйста, обратитесь к комментарию vpassapera в https://gist.github.com/addyosmani/5336747.

Как насчет того, чтобы попробовать это, как показано ниже,

from pyvirtualdisplay import Display

display = Display(visible=0, size=(800, 600))
display.start()

# Do Not use headless chrome option
# options.add_argument('headless')

url = 'https://10.11.227.21/tmui/'
driver.get(url + "login.jsp")

html_source = driver.page_source
print(html_source)

blocStatus = WebDriverWait(driver,    TIMEOUT).until(EC.presence_of_element_located((By.ID, "username")))
inputElement = driver.find_element_by_id("username")
inputElement.send_keys('actualLogin')
inputElement = driver.find_element_by_id("passwd")
inputElement.send_keys('actualPassword')
inputElement.submit()

display.stop()

xvfb требуется для использования "pyvortualdisplay"

$ sudo apt-get install -y xvfb 

Ответ 2

Headless Chrome не поддерживает небезопасные сертификаты и, следовательно, веб-сайты с небезопасными сертификатами не открываются, оставаясь пустыми. Вам необходимо добавить следующие возможности:

from selenium import webdriver
from selenium.webdriver import DesiredCapabilities
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument("--headless")

capabilities = DesiredCapabilities.CHROME.copy()
capabilities['acceptSslCerts'] = True 
capabilities['acceptInsecureCerts'] = True

driver = webdriver.Chrome(chrome_options = chrome_options,executable_path='your path',desired_capabilities=capabilities)
driver.get("yourWebsite")

Это сделает работу.

Ответ 3

Безголовочный хром может быть быстрее на одной машине, чем во главе, попробуйте добавить некоторое ожидание перед поиском элемента пароля.