PDA

View Full Version : استفاده از Selenium و JNA و Robot برای کنترل کردن پنجره Print



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 کار کردید و راهی بلدید لطفا راهنمایی کنید، ممنون!

محمد فدوی
یک شنبه 11 آبان 1393, 16:18 عصر
من اطالاعاتی در مورد Selenium ندارم ولی شاید راه ساده تری هم برای اینکار وجود داشته باشه.
مثلا اینکه محتویات صفحه HTML رو دریافت کنی و بعد با روش‌های مختلفی که میشه HTML رو به PDF تبدیل کرد اینکار رو بکنی. مثلا اینو (http://stackoverflow.com/questions/633780/converting-html-files-to-pdf) ببین.

برنامه‌ای که شما نوشتید احتمالا صرفا به ویندوز و Google Chrome / Chromium محدود میشه.

ahmad.mo74
یک شنبه 11 آبان 1393, 17:01 عصر
نه نه من اصلا هدفم پرینت گرفتن از اون صفحه نیست، منظورم print از مسیریابی ایه که گوگل انجام داده

برنامه هم صرفا برای ویندوز نیست، فعلا دارم روی ویندوز تست میکنم