我想点击此页面中的打印按钮:
然后保存PDF ...
这是点击按钮的代码:
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("//*[@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();
但是我收到以下错误:
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)
我怎么能用Selenium做到这一点?有另一种方式吗?感谢。
修改
答案 0 :(得分:6)
这是我的见解。
首先,您需要等待加载页面才能与Print
按钮进行交互。最好的方法是使用内置机制:selenium 等待 - 等待Print
按钮可点击:
// 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();
好的,如果你使用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?
}
}
您会看到 Chrome打印预览对话框,不幸的是,该对话框超出了硒的范围:
但是,如果你检查可用的Chrome arguments,你会发现存在相关的一个希望:
- 禁用 - 打印 - 预览 - 禁用打印预览(用于测试,以及不喜欢我们的用户。:[]
好的,让我们试一试:
ChromeOptions options = new ChromeOptions();
options.addArguments("--disable-print-preview");
WebDriver driver = new ChromeDriver(options);
driver.get(url);
现在,显示了一个系统打印对话框:
硒也无法控制它。所以,不,没有希望。哦,等等!
好的,如果我们超出了selenium的范围,那么让我们使用可以帮助我们点击对话框中的Print
按钮的工具 - Robot
类:
此类用于为其生成本机系统输入事件 测试自动化,自运行演示等的目的 需要控制鼠标和键盘的应用程序。
我们将初始化Robot
,并在打印对话框显示时发送Enter
键:
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);
}
}
使用其他选项:
另见:
答案 1 :(得分:1)
这样你可以点击Print including maps
- 选项(对不起,但它在C#中):
Actions builder = new Actions(Driver);
builder.MoveToElement(Driver.FindElement(By.ClassName("print-button"))).Click()
.MoveToElement(Driver.FindElements(By.ClassName("print-popup-button"))[0]).Click().Build().Perform();
但是!在您的问题中,您有一张Chrome打印预览窗口的图片,我认为您的代码正在使用HtmlUnitDriver。您可以随时使用chromedriver运行测试,但看起来打印预览超出了selenium的范围,即。你无法用webdriver控制它。据我所知,系统打印对话框也是如此,它出现在firefox中。如果HtmlUnitDriver在这种情况下表现不同,那么你会没事的,但我担心你会在这里遇到问题。
答案 2 :(得分:0)
只是为了添加@JoriO发布的内容,您可以在使用Selenium点击之前测试网页元素是否存在吗?如果它不存在,请在driver.get(url)之后添加一个线程sleep语句...原因是Selenium可能会在驱动程序完成加载页面之前尝试单击。这解决了我使用Selenium错误“没有这样的元素异常”时遇到的大多数问题