ahmad.mo74
یک شنبه 11 آبان 1393, 15:30 عصر
سلام،
لطفا اول این لینک (https://www.google.com/maps/dir/40.4515849,-3.6903752/41.380896,2.1228198/@40.4515849,-3.6903752/am=t/?hl=fa) رو ببینید...
حالا فرض کنید میخوایم گزینه print رو تو اون صفحه بزنیم و فایل pdf رو سیو کنیم، تقریبا تنها راهش استفاده Selenium هست
با استفاده از ChromeDriver و id مربوط به گزنیه print به پنجره print میرسیم :
public class Test {
public static void main(String[] args) throws Exception {
System.setProperty("webdriver.chrome.driver", "path/to/chromedriver.exe");
String url = "https://www.google.com/maps/dir/40.4515849,-3.6903752/41.380896,2.1228198/@40.4515849,-3.6903752/am=t/?hl=fa";
WebDriver driver = new ChromeDriver();
driver.get(url);
WebDriverWait wait = new WebDriverWait(driver, 20);
wait.until(ExpectedConditions.elementToBeClickable (By.cssSelector("button.print-button"))).click();
WebElement printButton = driver.findElement(By.cssSelector("button.print-popup-button"));
printButton.click();
}
}
خب تا اینجا درست کار میکنه اما از این به بعد دیگه خارج از محدوده Selenium میشه و برای اینکه روی print کلیک کنیم مجبوریم از Robot و JNA برای دسترسی به پنجره print استفاده کنیم :
import com.sun.jna.Native;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.win32.W32APIOptions;
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;
import java.awt.event.MouseEvent;
/**
* @author avb
*/
public class Test {
public static void main(String[] args) throws Exception {
System.setProperty("webdriver.chrome.driver", "path/to/chromedriver.exe");
String url = "https://www.google.com/maps/dir/40.4515849,-3.6903752/41.380896,2.1228198/@40.4515849,-3.6903752/am=t/?hl=fa";
WebDriver driver = new ChromeDriver();
driver.get(url);
WebDriverWait wait = new WebDriverWait(driver, 20);
wait.until(ExpectedConditions.elementToBeClickable (By.cssSelector("button.print-button"))).click();
WebElement printButton = driver.findElement(By.cssSelector("button.print-popup-button"));
printButton.click();
Robot r = new Robot();
r.delay(10000);
org.openqa.selenium.Point position = driver.manage().window().getPosition();
r.mouseMove(position.x, position.y);
r.mousePress(MouseEvent.BUTTON1_MASK);
r.mouseRelease(MouseEvent.BUTTON1_MASK);
r.delay(1000);
r.keyPress(KeyEvent.VK_ENTER);
r.keyRelease(KeyEvent.VK_ENTER);
r.delay(1000);
activeWindow("Save PDF File As");
r.delay(1000);
r.keyPress(KeyEvent.VK_ENTER);
r.keyRelease(KeyEvent.VK_ENTER);
r.delay(5000);
driver.quit();
}
public interface User32 extends W32APIOptions {
User32 instance = (User32) Native.loadLibrary("user32", User32.class, DEFAULT_OPTIONS);
int SW_SHOW = 1;
boolean ShowWindow(WinDef.HWND hWnd, int nCmdShow);
boolean SetForegroundWindow(WinDef.HWND hWnd);
WinDef.HWND FindWindow(String winClass, String title);
}
private static void activeWindow(String title) {
User32 user32 = User32.instance;
WinDef.HWND window = user32.FindWindow(null, title);
user32.ShowWindow(window, User32.SW_SHOW);
user32.SetForegroundWindow(window);
}
}
مراحل به اینصورت هست :
125238
125239
125240
خب همه چیز درست انجام شد...ولی چنتا مشکل هست :
1 - من اصلا نمیخوام کاربر این چیزارو ببینه و همه چیز اون زیر انجام بشه و در نهایت pdf رو بهش بدم.
2 - امکان اینکه کاربر عمدا یا اینکه حواسش نباشه جایی کلیک کنه یا پنجره ها رو ببنده و... هست و من نمیدونم چجوری باید جلوی اینکارو بگیرم. اگر مورد 1 حل بشه این مورد هم حل شده هست.
3 - روی محلی که pdf سیو میشه من هیچ کنترلی ندارم در حالی که میخوام pdf رو در محلی که خودم میخوام سیو کنم تا بعدا خودمم بتونم بهش دسترسی داشته باشم از توی برنامه. یعنی زمانی که Save کلیک میشه یا یه جوری بافر دست خودم باشه تا سیوش کنم یا اینکه...با JNA نمیشه اینکارو کرد؟
4 - مراحل اجرا به خاطر اینکه بعضی جاها باید صبر کنیم خیلی کنده...
دوستان اگر Selenium و JNA کار کردید و راهی بلدید لطفا راهنمایی کنید، ممنون!
لطفا اول این لینک (https://www.google.com/maps/dir/40.4515849,-3.6903752/41.380896,2.1228198/@40.4515849,-3.6903752/am=t/?hl=fa) رو ببینید...
حالا فرض کنید میخوایم گزینه print رو تو اون صفحه بزنیم و فایل pdf رو سیو کنیم، تقریبا تنها راهش استفاده Selenium هست
با استفاده از ChromeDriver و id مربوط به گزنیه print به پنجره print میرسیم :
public class Test {
public static void main(String[] args) throws Exception {
System.setProperty("webdriver.chrome.driver", "path/to/chromedriver.exe");
String url = "https://www.google.com/maps/dir/40.4515849,-3.6903752/41.380896,2.1228198/@40.4515849,-3.6903752/am=t/?hl=fa";
WebDriver driver = new ChromeDriver();
driver.get(url);
WebDriverWait wait = new WebDriverWait(driver, 20);
wait.until(ExpectedConditions.elementToBeClickable (By.cssSelector("button.print-button"))).click();
WebElement printButton = driver.findElement(By.cssSelector("button.print-popup-button"));
printButton.click();
}
}
خب تا اینجا درست کار میکنه اما از این به بعد دیگه خارج از محدوده Selenium میشه و برای اینکه روی print کلیک کنیم مجبوریم از Robot و JNA برای دسترسی به پنجره print استفاده کنیم :
import com.sun.jna.Native;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.win32.W32APIOptions;
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;
import java.awt.event.MouseEvent;
/**
* @author avb
*/
public class Test {
public static void main(String[] args) throws Exception {
System.setProperty("webdriver.chrome.driver", "path/to/chromedriver.exe");
String url = "https://www.google.com/maps/dir/40.4515849,-3.6903752/41.380896,2.1228198/@40.4515849,-3.6903752/am=t/?hl=fa";
WebDriver driver = new ChromeDriver();
driver.get(url);
WebDriverWait wait = new WebDriverWait(driver, 20);
wait.until(ExpectedConditions.elementToBeClickable (By.cssSelector("button.print-button"))).click();
WebElement printButton = driver.findElement(By.cssSelector("button.print-popup-button"));
printButton.click();
Robot r = new Robot();
r.delay(10000);
org.openqa.selenium.Point position = driver.manage().window().getPosition();
r.mouseMove(position.x, position.y);
r.mousePress(MouseEvent.BUTTON1_MASK);
r.mouseRelease(MouseEvent.BUTTON1_MASK);
r.delay(1000);
r.keyPress(KeyEvent.VK_ENTER);
r.keyRelease(KeyEvent.VK_ENTER);
r.delay(1000);
activeWindow("Save PDF File As");
r.delay(1000);
r.keyPress(KeyEvent.VK_ENTER);
r.keyRelease(KeyEvent.VK_ENTER);
r.delay(5000);
driver.quit();
}
public interface User32 extends W32APIOptions {
User32 instance = (User32) Native.loadLibrary("user32", User32.class, DEFAULT_OPTIONS);
int SW_SHOW = 1;
boolean ShowWindow(WinDef.HWND hWnd, int nCmdShow);
boolean SetForegroundWindow(WinDef.HWND hWnd);
WinDef.HWND FindWindow(String winClass, String title);
}
private static void activeWindow(String title) {
User32 user32 = User32.instance;
WinDef.HWND window = user32.FindWindow(null, title);
user32.ShowWindow(window, User32.SW_SHOW);
user32.SetForegroundWindow(window);
}
}
مراحل به اینصورت هست :
125238
125239
125240
خب همه چیز درست انجام شد...ولی چنتا مشکل هست :
1 - من اصلا نمیخوام کاربر این چیزارو ببینه و همه چیز اون زیر انجام بشه و در نهایت pdf رو بهش بدم.
2 - امکان اینکه کاربر عمدا یا اینکه حواسش نباشه جایی کلیک کنه یا پنجره ها رو ببنده و... هست و من نمیدونم چجوری باید جلوی اینکارو بگیرم. اگر مورد 1 حل بشه این مورد هم حل شده هست.
3 - روی محلی که pdf سیو میشه من هیچ کنترلی ندارم در حالی که میخوام pdf رو در محلی که خودم میخوام سیو کنم تا بعدا خودمم بتونم بهش دسترسی داشته باشم از توی برنامه. یعنی زمانی که Save کلیک میشه یا یه جوری بافر دست خودم باشه تا سیوش کنم یا اینکه...با JNA نمیشه اینکارو کرد؟
4 - مراحل اجرا به خاطر اینکه بعضی جاها باید صبر کنیم خیلی کنده...
دوستان اگر Selenium و JNA کار کردید و راهی بلدید لطفا راهنمایی کنید، ممنون!