How can I tell Selenium to press cancel on a print popup?

前端 未结 5 1809
猫巷女王i
猫巷女王i 2020-12-06 08:17

I am checking whether or not a page appears using Selenium. When I click the page, however, a printer print prompt appears (like the window that says select printer and such

相关标签:
5条回答
  • 2020-12-06 08:18

    Actually you can't handle windows (OS) dialogs inside Selenium WebDriver. This what the selenium team answers here

    The current team position is that the print dialog is out of scope for the project. WebDriver/Selenium is focused on emulating a user's interaction with the rendered content of a web page. Other aspects of the browser including, but not limited to print dialogs, save dialogs, and browser chrome, are all out of scope.

    You can try different approach like AutoIt

    0 讨论(0)
  • 2020-12-06 08:21

    I would simply disable the print dialog by overriding the print method :

    ((JavascriptExecutor)driver).executeScript("window.print=function(){};");
    

    But if you goal is to test that the printing is called then :

    // get the print button
    WebElement print_button = driver.findElement(By.cssSelector("..."));
    
    // click on the print button and wait for print to be called
    driver.manage().timeouts().setScriptTimeout(20, TimeUnit.SECONDS);
    ((JavascriptExecutor)driver).executeAsyncScript(
        "var callback = arguments[1];" +
        "window.print = function(){callback();};" +
        "arguments[0].click();"
        , print_button);
    
    0 讨论(0)
  • 2020-12-06 08:27

    If you are going for testing only Chrome browser here is mine solution. Because of 'Robot' class or disabling print didn't work for my case.

    // Choosing the second window which is the print dialog.
    // Switching to opened window of print dialog.
    driver.switchTo().window(driver.getWindowHandles().toArray()[1].toString());
    
    // Runs javascript code for cancelling print operation.
    // This code only executes for Chrome browsers.
    JavascriptExecutor executor = (JavascriptExecutor) driver.getWebDriver();
    executor.executeScript("document.getElementsByClassName('cancel')[0].click();");
    
    // Switches to main window after print dialog operation.
    driver.switchTo().window(driver.getWindowHandles().toArray()[0].toString());
    

    Edit: In Chrome 71 this doesn't seem to work anymore since the script can't find the Cancel button. I could make it work by changing the line to:

    executor.executeScript("document.querySelector(\"print-preview-app\").shadowRoot.querySelector(\"print-preview-header\").shadowRoot.querySelector(\"paper-button.cancel-button\").click();");
    
    0 讨论(0)
  • 2020-12-06 08:42

    we can also use key for handling the print or press the cancel button operation. and it works for me.

    driver.switchTo().window(driver.getWindowHandles().toArray()[1].toString());
    WebElement webElement = driver.findElement(By.tagName("body"));
    webElement.sendKeys(Keys.TAB);
    webElement.sendKeys(Keys.ENTER);
    driver.switchTo().window(driver.getWindowHandles().toArray()[0].toString());
    
    0 讨论(0)
  • 2020-12-06 08:43

    Native window based dialog can be handled by AutoItX as described in the following code

    File file = new File("lib", jacobDllVersionToUse);
    System.setProperty(LibraryLoader.JACOB_DLL_PATH, file.getAbsolutePath());
    WebDriver driver = new FirefoxDriver();
    driver.get("http://www.joecolantonio.com/SeleniumTestPage.html");
    WebElement printButton = driver.findElement(By.id("printButton"));
    printButton.click();
    AutoItX x = new AutoItX();
    x.winActivate("Print");
    x.winWaitActive("Print");
    x.controlClick("Print", "", "1058");
    x.ControlSetText("Print", "", "1153", "50");
    Thread.sleep(3000); //This was added just so you could see that the values did change.
    x.controlClick("Print", "", "2");
    

    Reference : http://www.joecolantonio.com/2014/07/21/selenium-how-to-handle-windows-based-dialogs-and-pop-ups/

    0 讨论(0)
提交回复
热议问题