1
votes

Comment puis-je cliquer sur le bouton Annuler sur la page d'aperçu avant impression dans Chrome?

Je dois cliquer sur le bouton Annuler après avoir ouvert la fenêtre d'impression dans Chrome.

J'ai essayé le code ci-dessous mais cela ne fonctionne pas.

driver.switchTo().window(driver.getWindowHandles().toArray()[1].toString());
JavascriptExecutor executor = (JavascriptExecutor) driver.getWebDriver();
executor.executeScript("document.querySelector(\"print-preview-app\").shadowRoot.querySelector(\"print-preview-header\").shadowRoot.querySelector(\"paper-button.cancel-button\").click();");


0 commentaires

3 Réponses :


0
votes

L'interaction avec la fenêtre d'impression est, je crois, actuellement impossible avec le sélénium. Voir ceci question pour une description détaillée et une solution de contournement possible avec un autre outil de test, Robot.


0 commentaires

0
votes

C'est au-delà de ce que Selenium peut faire au moins maintenant. Vous devez utiliser un autre moyen à la place.

Voici une implémentation simplifiée de Python appelant AutoHotkey . Vous devez d'abord installer AutoHotkey .

Placez les 2 fichiers suivants dans un dossier et exécutez Chrome_Print.py, puis Selenium ouvrira StackOverflow, attendra 500 ms et ouvrira la fenêtre Chrome Print, puis attendez 2 secondes et quittez-la.

Vous pouvez créer une implémentation Java similaire.

Comme vous pouvez le voir, cette approche peut être utilisée de manière automatisée, mais le temps de repos est codé en dur et dépend d'une machine spécifique. En outre, il faut toujours avoir la fenêtre focalisée lors du traitement.

Chrome_Print.py

#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.


Chrome_HWND = %1%

WinActivate, ahk_id %Chrome_HWND%

Sleep, 500
SendInput ^p
Sleep, 2000
SendInput {Esc}
Sleep, 800

ChromePage_Print.ahk

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.chrome.options import Options
import sys, os, psutil, win32process, win32gui, win32api, time

def get_hwnds_from_pid(pid):
    def EnumWindowsProc(hwnd, hwnds):
        if win32gui.IsWindowVisible(hwnd) and win32gui.IsWindowEnabled(hwnd):
            returned_tid, returned_pid = win32process.GetWindowThreadProcessId(hwnd)
            if returned_pid == pid:
                hwnds.append(hwnd)
        return True
    hwnds = []
    win32gui.EnumWindows(EnumWindowsProc, hwnds)
    return hwnds

driveroptions = Options()
driveroptions.add_argument('--incognito')
driveroptions.add_argument('--disable-infobars')
driveroptions.add_argument('--start-maximized')
driver = webdriver.Chrome(options=driveroptions)
driver.set_page_load_timeout(40)
wait = WebDriverWait(driver, 40)

driver.get("https://www.stackoverflow.com")
wait.until(EC.presence_of_element_located((By.XPATH, '/html/body/div[@class="container"]/div[@id="content"]')), "Waiting For Content Timeout")

current_python_pid = os.getpid()
current_python_process = psutil.Process(current_python_pid)

chromedriver_process_list = current_python_process.children(recursive=False)
chromedriver_process = chromedriver_process_list[0]

chrome_process_list = chromedriver_process.children(recursive=False)
chrome_process = chrome_process_list[0]

chrome_hwnd_list = get_hwnds_from_pid(chrome_process.pid)


win32api.ShellExecute(chrome_hwnd_list[0], 'open', "ChromePage_Print.ahk", str(chrome_hwnd_list[0]), os.getcwd(), 1)
time.sleep(4)
driver.quit()


0 commentaires

0
votes

Nous faisons cela actuellement dans nos tests, et le seul gros avertissement ici est que le code HTML de ce panneau semble changer assez fréquemment, alors soyez conscient de cela. Le code dont vous avez besoin pour la Version 75.0.3770.100 (version officielle) (64 bits) est ici:

executor.executeScript(
  "document" 
  + ".querySelector('print-preview-app')
  + ".shadowRoot"
  + ".querySelector('print-preview-sidebar')
  + ".shadowRoot"
  + ".querySelector('print-preview-header')
  + ".shadowRoot"
  + ".querySelector('.cancel-button')
  + ".click();"
);


0 commentaires