問題描述
我想點擊這個頁面的打印按鈕:
,還是有希望的,你會看到有相關的:
<塊引用>--disable-print-preview - 禁用打印預覽(用于測試和不喜歡我們的用戶.:[)
好的,我們試試看:
ChromeOptions 選項 = new ChromeOptions();options.addArguments("--disable-print-preview");WebDriver driver = new ChromeDriver(options);driver.get(url);
現在,顯示了一個系統打印對話框:
Selenium 也無法控制它.所以,不,沒有希望.哦,等等!
<小時>好的,如果我們超出了 selenium 的范圍,讓我們使用可以幫助我們單擊對話框中的 Print
按鈕的工具 - Robot
類:
該類用于為測試自動化、自運行演示和其他目的需要控制鼠標和鍵盤的應用程序.
我們將初始化 Robot
并在打印對話框出現時發送 Enter
鍵:
包com.company;導入 org.openqa.selenium.By;導入 org.openqa.selenium.WebDriver;導入 org.openqa.selenium.WebElement;導入 org.openqa.selenium.chrome.ChromeDriver;導入 org.openqa.selenium.support.ui.ExpectedConditions;導入 org.openqa.selenium.support.ui.WebDriverWait;導入 java.awt.*;導入 java.awt.event.KeyEvent;公共類主要{public static void main(String[] args) 拋出 AWTException,InterruptedException {字符串 url = "https://www.google.com/maps/dir/40.4515849,-3.6903752/41.380896,2.1228198/@40.4515849,-3.6903752/am=t/?hl=en";機器人 r = new Robot();r.延遲(1000);WebDriver driver = new ChromeDriver();driver.get(url);//打開打印下拉菜單WebDriverWait 等待 = new WebDriverWait(驅動程序, 10);wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("button.print-button"))).click();//點擊打印按鈕WebElement printButton = driver.findElement(By.cssSelector("button.print-popup-button"));printButton.click();線程.sleep(2000);r.keyPress(KeyEvent.VK_ENTER);r.keyRelease(KeyEvent.VK_ENTER);}}
使用其他選項:
sikuli
- 您需要打印按鈕的圖像才能sikuli 找到它并點擊autoit
另見:
- 如何在 Selenium 中處理打印對話框?
I want to click on the print button in this page :
https://www.google.com/maps/dir/40.4515849,-3.6903752/41.380896,2.1228198/@40.4515849,-3.6903752/am=t/?hl=en
and then save the PDF...
this is the code for click the button:
String url = "https://www.google.com/maps/dir/40.4515849,-3.6903752/41.380896,2.1228198/@40.4515849,-3.6903752/am=t/?hl=en";
WebDriver driver = new HtmlUnitDriver();
driver.get(url);
System.out.println(driver.getTitle());
System.out.println(driver.getCurrentUrl());
WebElement element = driver.findElement(By.xpath("http://*[@id="text-mode-options-header"]/div/div/div[2]/div[2]/div/button[1]"));
element.click();
System.out.println("Page title is: " + driver.getTitle());
driver.quit();
but I get the following error:
Exception in thread "main" org.openqa.selenium.NoSuchElementException: Unable to locate a node using //*[@id="text-mode-options-header"]/div/div/div[2]/div[2]/div/button[1]
For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html
Build info: version: '2.43.1', revision: '5163bce', time: '2014-09-10 16:27:58'
Driver info: driver.version: HtmlUnitDriver
at org.openqa.selenium.htmlunit.HtmlUnitDriver.findElementByXPath(HtmlUnitDriver.java:1057)
at org.openqa.selenium.By$ByXPath.findElement(By.java:357)
at org.openqa.selenium.htmlunit.HtmlUnitDriver$5.call(HtmlUnitDriver.java:1575)
at org.openqa.selenium.htmlunit.HtmlUnitDriver$5.call(HtmlUnitDriver.java:1)
at org.openqa.selenium.htmlunit.HtmlUnitDriver.implicitlyWaitFor(HtmlUnitDriver.java:1251)
at org.openqa.selenium.htmlunit.HtmlUnitDriver.findElement(HtmlUnitDriver.java:1572)
at org.openqa.selenium.htmlunit.HtmlUnitDriver.findElement(HtmlUnitDriver.java:532)
at com.controlstation.start.Main.main(Main.java:24)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
how can I do this using Selenium? is there another way? thanks.
EDIT:
Here's my insight.
First of all, you need to wait for the page to load in order to interact with the Print
button. The best way to go is to use built-in mechanism: selenium waits - wait for the Print
button to be clickable:
// open print dropdown
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("button.print-button"))).click();
// click print button
WebElement printButton = driver.findElement(By.cssSelector("button.print-popup-button"));
printButton.click();
Okay, if you run it using ChromeDriver
:
package com.company;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
public class Main {
public static void main(String[] args) {
String url = "https://www.google.com/maps/dir/40.4515849,-3.6903752/41.380896,2.1228198/@40.4515849,-3.6903752/am=t/?hl=en";
WebDriver driver = new ChromeDriver();
driver.get(url);
// open print dropdown
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("button.print-button"))).click();
// click print button
WebElement printButton = driver.findElement(By.cssSelector("button.print-popup-button"));
printButton.click();
// now what?
}
}
You'll see the Chrome Print Preview dialog, which is, unfortunately, out of scope for selenium:
But, there is a hope, if you examine available Chrome arguments, you would see that there is the relevant one:
--disable-print-preview - Disables print preview (For testing, and for users who don't like us. :[ )
Okay, let's try it out:
ChromeOptions options = new ChromeOptions();
options.addArguments("--disable-print-preview");
WebDriver driver = new ChromeDriver(options);
driver.get(url);
Now, there is a system print dialog being shown:
Selenium cannot control it too. So, nope, there is no hope. Oh, wait!
Okay, if we are out of scope of selenium, let's use tools that can help us to click that Print
button in the dialog - Robot
class:
This class is used to generate native system input events for the purposes of test automation, self-running demos, and other applications where control of the mouse and keyboard is needed.
We'll initialize the Robot
and will send Enter
key when the print dialog would show up:
package com.company;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import java.awt.*;
import java.awt.event.KeyEvent;
public class Main {
public static void main(String[] args) throws AWTException, InterruptedException {
String url = "https://www.google.com/maps/dir/40.4515849,-3.6903752/41.380896,2.1228198/@40.4515849,-3.6903752/am=t/?hl=en";
Robot r = new Robot();
r.delay(1000);
WebDriver driver = new ChromeDriver();
driver.get(url);
// open print dropdown
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("button.print-button"))).click();
// click print button
WebElement printButton = driver.findElement(By.cssSelector("button.print-popup-button"));
printButton.click();
Thread.sleep(2000);
r.keyPress(KeyEvent.VK_ENTER);
r.keyRelease(KeyEvent.VK_ENTER);
}
}
Other options are to use:
sikuli
- you would need an image of the print button in order for sikuli to locate it and clickautoit
Also see:
- How to handle print dialog in Selenium?
這篇關于如何使用 Selenium 在網頁上單擊打印按鈕的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!