1
votes

Comment envoyer CTRL-P à un navigateur Web en Python

Le but de ceci est d'ouvrir une fenêtre de navigateur et d'enregistrer le site au format PDF.

J'écris du code Python que:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
import time
DRIVER = 'chromedriver'
driver = webdriver.Chrome(DRIVER)

URL = "http://www.google.com"
driver.get(URL)
actions = ActionChains(driver)
time.sleep(5) #Give the page time to load

actions.key_down(Keys.CONTROL)
actions.send_keys('p')
actions.key_up(Keys.CONTROL)
actions.perform()
time.sleep(5) #Sleep to see if the print dialog came up
driver.quit()

J'ai un problème dès le début avec control-p. À titre de test, je suis capable d'envoyer du texte factice à la recherche de Google, mais je ne parviens pas à envoyer un contrôle-p (pas de message d'erreur). J'utilise Google comme exemple simple, mais mon code final utilisera divers autres sites.

De toute évidence, il me manque quelque chose, mais je n'arrive tout simplement pas à comprendre quoi.

I a essayé une autre méthode d'utilisation de javascript au lieu d'ActionChains:

driver.execute_script('window.print();')

Cela a fonctionné pour obtenir la boîte de dialogue d'impression, mais je n'ai pas pu ajouter quoi que ce soit d'autre dans cette boîte de dialogue (comme, nom de fichier et emplacement du pdf).

J'ai essayé PDFkit, pour convertir la page Web en pdf. Cela fonctionnait sur certains sites, mais il plantait souvent (en fonction de ce que le site retournait), la page était parfois mal formatée et certains sites (pinterest) ne s'affichaient tout simplement pas. Pour cette raison, j'ai changé de méthode et j'ai décidé d'utiliser le sélénium et Chrome pour que le pdf soit rendu comme il le montre dans le navigateur.

J'ai pensé à utiliser "element.send_keys (" some text ") "au lieu d'ActionChains, mais comme je vais sur plusieurs sites Web différents, je ne sais pas nécessairement quel élément rechercher.

1) Opens a web page
2) Does a control-p to bring up the print dialog box
NOTE: I will have pre-configured the browser to save as PDF instead of defaulting as printing to a printer)
3) Does "return"
4) Enters the file name
5) Does "return" again
NOTE: In my full code, I'll be doing these steps hundreds of times


2 commentaires

Avez-vous essayé key_down pour Control et pour P eighter? ... comme je le sais, send_keys est utilisé pour gérer les formulaires (je ne l'ai pas utilisé jet donc c'est juste une supposition)


Merci StyleZ pour la suggestion. Malheureusement, cela n'a pas fonctionné.


3 Réponses :


0
votes

essayez ceci:

webdriver.ActionChains(driver).key_down(Keys.CONTROL).send_keys('P').key_up    
(Keys.CONTROL).perform()


1 commentaires

Merci anish, mais malheureusement, même résultat. Aucune boîte de dialogue d'impression.



3
votes

Vous pouvez utiliser autoit pour répondre à vos besoins. Commencez par pip install -U pyautoit

from selenium import webdriver
import autoit
import time
DRIVER = 'chromedriver'
driver = webdriver.Chrome(DRIVER)
driver.get('http://google.com')
driver.maximize_window()
time.sleep(10)
autoit.send("^p")
time.sleep(10) # Pause to allow you to inspect the browser.
driver.quit()

Veuillez me faire savoir si cela fonctionne.


5 commentaires

Une idée sur où trouver la documentation pour autoit? Tout ce que je trouve, ce sont des informations sur la façon de l'installer et un bref exemple en tapant bonjour le monde dans le bloc-notes. J'ai juste besoin de savoir comment faire un retour.


J'ai créé un petit blog qui pourrait vous être utile. lien Dans une installation supplémentaire autoit vous pouvez vous référer au fichier d'aide disponible dans SciTE Script editor


Encore une fois, merci beaucoup Jitendra. La documentation ici m'a montré la séquence de caractères: documentation.help/AutoItX/Send.htm


@Luc Pourriez-vous accepter cette réponse si elle vous a aidé. Merci


Fait. Merci encore pour votre aide. J'apprécie vraiment cela.



0
votes

Vérifiez ceci:

robot.keyPress(KeyEvent.VK_CONTROL)
robot.keyPress(KeyEvent.VK_P)
// CTRL+P is now pressed
robot.keyRelease(KeyEvent.VK_P)
robot.keyRelease(KeyEvent.VK_CONTROL)


0 commentaires