Monday, May 20, 2024
 Popular · Latest · Hot · Upcoming
111
rated 0 times [  117] [ 6]  / answers: 1 / hits: 23718  / 10 Years ago, thu, october 23, 2014, 12:00:00

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



enter



and then save the PDF...



enter



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(//*[@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:



enter


More From » java

 Answers
46

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:



enter



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:



enter



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 click

  • autoit



Also see:




[#69037] Tuesday, October 21, 2014, 10 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
ryanulyssesb

Total Points: 91
Total Questions: 105
Total Answers: 102

Location: England
Member since Tue, Sep 8, 2020
4 Years ago
ryanulyssesb questions
Sat, Mar 20, 21, 00:00, 3 Years ago
Mon, Sep 14, 20, 00:00, 4 Years ago
Mon, Mar 9, 20, 00:00, 4 Years ago
Sun, Jul 7, 19, 00:00, 5 Years ago
;