web-dev-qa-db-fra.com

Sélénium fonctionnant avec Chrome, mais pas sans tête Chrome

J'ai développé quelques scripts Python utilisant Selenium et, dans un premier temps, PhantomJS. En me dirigeant vers les téléchargements automatisés, j'ai changé pour (dirigé) Firefox (qui fonctionnait), puis Chrome avec l'option sans tête, donc je n'aurai pas le navigateur ouvert devant moi.

Mon premier script, qui accède à une page et à quelques éléments HTML, fonctionne parfaitement avec Chrome sans tête.

Le second, cependant, ne fonctionne qu'avec Chrome. Si j'ajoute l'option "sans tête", cela ne fonctionne plus. Lorsque j'essaie d'imprimer le code HTML en mode sans tête pour voir pourquoi il ne trouve pas l'élément HTML que je recherche, tout ce que j'ai est:

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

Avec le titre Chrome, j'ai un HTML complet imprimé. Voici comment je démarre mon sans tête Chrome:

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

Encore une fois, notez que cela fonctionne dans un autre de mon script. La seule différence ici est que je dois me connecter pour accéder à la page, mais même alors, pourquoi cela fonctionnerait-il avec la tête? Mon script est fait pour se connecter de toute façon automatiquement en remplissant le formulaire.

Python: 3.6.1, Chrome: 60.0.3112.78 (64 bits), Sélénium: 3.4.3

Une idée? Merci.

** EDIT: Voici le début du code **

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()
12
Gnougnou

J'ai eu la même expérience que vous et je l'ai résolue en utilisant xvfb et pyvirtualdisplay.

J'utilise chromedrive = v2.3.1, chrome-browser = v60 et Selenium = 3.4.3

Dans Chrome sans tête, une partie du script ne semble pas fonctionner comme prévu.

Veuillez vous référer au commentaire de vpassapera dans https://Gist.github.com/addyosmani/5336747 .

Que diriez-vous de l'essayer comme ci-dessous,

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 est requis pour utiliser "pyvortualdisplay"

$ Sudo apt-get install -y xvfb 
5
frank

Sans tête Chrome ne prend pas en charge les certificats non sécurisés et, par conséquent, les sites Web avec des certificats non sécurisés ne s'ouvrent pas en les laissant vides. Vous devez ajouter des fonctionnalités comme suit:

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")

Cela fera le travail.

5
Suraj Regmi

Headless chrome peut être plus rapide sur la même machine que headed, essayez d'ajouter un peu d'attente avant de localiser l'élément de mot de passe.

1
mmichalik