Селен, работающий с 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
Безголовочный хром может быть быстрее на одной машине, чем во главе, попробуйте добавить некоторое ожидание перед поиском элемента пароля.