Lors de la récupération d'une image par grattage, j'ai eu du mal à enregistrer l'image du boîtier dessinée dans le canevas au lieu du format général de balise img.
Je souhaite enregistrer l'image affichée de cette manière.
L'image est dessinée sur toile comme le titre l'indique.
Après avoir recherché la page, j'ai trouvé que je pouvais enregistrer l'image en cliquant avec le bouton droit de la souris.
Donc, j'ai essayé différentes choses pour réaliser le flux de "clic droit sur l'image → enregistrer" par programmation.
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
#Paramètres du pilote Chrome
options = Options()
options.add_argument('--disable-gpu')
options.add_argument('--disable-extensions')
options.add_argument('--proxy-server="direct://"')
options.add_argument('--proxy-bypass-list=*')
options.add_argument('--start-maximized')
driver = webdriver.Chrome(options=options)
#Temps d'attente pour le dessin d'écran
wait = WebDriverWait(driver, 10)
driver.implicitly_wait(10)
#Accéder à la page
url = 'URL de la page cible'
driver.get(url)
#Attendez que la page se charge
wait.until(EC.presence_of_all_elements_located)
#Emplacement de l'image
xpath = 'XPATH de l'image que vous souhaitez enregistrer'
img = driver.find_element_by_xpath(xpath)
#Déplacez la souris vers l'emplacement de l'image, puis cliquez avec le bouton droit de la souris
actions = ActionChains(driver)
actions.move_to_element(img).context_click(img).perform()
#Entrez la touche «↓» 5 fois
actions.send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).perform()
#Entrez la touche Entrée
actions.send_keys(Keys.ENTER).perform()
Accédez à la page cible avec Selenium ↓ Utilisez ActionChains pour déplacer la souris vers l'emplacement de l'image + clic droit pour afficher le menu contextuel ↓ Utilisez le menu contextuel par saisie au clavier (touche «↓» x 5 fois + appuyez sur la touche Entrée)
J'ai essayé de sauvegarder l'image, mais ... non.
Cela fonctionne bien jusqu'au clic droit, mais je ne peux pas utiliser le menu contextuel.
Lorsque j'ai vérifié le mouvement de traitement, l'écran du navigateur s'est déplacé un peu vers le bas après un clic droit.
Apparemment, je tape dans le navigateur au lieu du menu contextuel ...
J'ai donc essayé une autre méthode.
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
import pyautogui
#Paramètres du pilote Chrome
options = Options()
options.add_argument('--disable-gpu')
options.add_argument('--disable-extensions')
options.add_argument('--proxy-server="direct://"')
options.add_argument('--proxy-bypass-list=*')
options.add_argument('--start-maximized')
driver = webdriver.Chrome(options=options)
#Temps d'attente pour le dessin d'écran
wait = WebDriverWait(driver, 10)
driver.implicitly_wait(10)
#Accéder à la page
url = 'URL de la page cible'
driver.get(url)
#Attendez que la page se charge
wait.until(EC.presence_of_all_elements_located)
#Emplacement de l'image
xpath = 'XPATH de l'image que vous souhaitez enregistrer'
img = driver.find_element_by_xpath(xpath)
#Déplacez la souris vers l'emplacement de l'image, puis cliquez avec le bouton droit de la souris
actions = ActionChains(driver)
actions.move_to_element(img).context_click(img).perform()
#Enregistrer l'image
pyautogui.typewrite('v')
Accédez à la page cible avec Selenium ↓ Utilisez ActionChains pour déplacer la souris vers l'emplacement de l'image + clic droit pour afficher le menu contextuel ↓ Entrée au clavier avec PyAutoGUI (entrez "v")
Quand je l'ai changé pour le flux, cela a bien fonctionné!
Le résultat de l'enregistrement d'image que vous connaissez de cette manière.
C'est tout pour rendre le pilote Chrome sans tête et écrire le processus de changement de nom de fichier!
J'ai pensé ... je ne pouvais pas le sauver quand je l'ai fait sans tête lol
Apparemment, PyAutoGUI envoie des instructions pour opérer sur la fenêtre active. (C'est écrit comme GUI, donc c'est vrai lol)
Par conséquent, même si vous le déplacez dans un état sans tête, si vous le déplacez pendant une autre opération, l'enregistrement échouera naturellement.
C'est très gênant, donc je veux le garder sans tête.
À la suite de diverses enquêtes, j'ai pu devenir sans tête.
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import base64
#Paramètres du pilote Chrome
options = Options()
options.add_argument('--disable-gpu')
options.add_argument('--disable-extensions')
options.add_argument('--proxy-server="direct://"')
options.add_argument('--proxy-bypass-list=*')
options.add_argument('--start-maximized')
options.add_argument('--headless')
driver = webdriver.Chrome(options=options)
#Temps d'attente pour le dessin d'écran
wait = WebDriverWait(driver, 10)
driver.implicitly_wait(10)
#Accéder à la page
url = 'URL de la page cible'
driver.get(url)
#Attendez que la page se charge
wait.until(EC.presence_of_all_elements_located)
#Emplacement de l'image
xpath = 'XPATH de l'image que vous souhaitez enregistrer'
img = driver.find_element_by_xpath(xpath)
#Obtenir le canevas en tant que chaîne Base64
canvas_base64 = driver.execute_script("return arguments[0].toDataURL('image/png').substring(21);", img)
#Décoder
canvas_png = base64.b64decode(canvas_base64)
#nom de fichier
file_name = 'Nom de fichier arbitraire.png'
#Sortie de fichier
with open(file_name, 'wb') as f:
f.write(canvas_png)
J'ai pu enregistrer le canevas en tant que chaîne de caractères avec Base64 dans le flux de → décodage → sortie de fichier!
Grâce à ma dépendance (?), J'ai découvert ActionChains, PyAutoGUI et base64. L'automatisation est amusante.
How to perform right click using Selenium ChromeDriver? Laisser Python faire un travail itératif avec PyAutoGui How to save a canvas as PNG in Selenium?
Recommended Posts