【发布时间】:2017-06-29 11:00:29
【问题描述】:
我想在 JavaFX 应用程序中使用 Selenium WebDriver,我想获取网页的屏幕截图并将其显示在 JavaFX 应用程序的 ImageView 中。
此代码完全可以截取网页截图并保存:
package application;
import java.io.File;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.phantomjs.PhantomJSDriver;
public class Main{
public static void main(String[] args) throws Exception {
File file = new File("E:\\Eclipse_Projects\\phantomjs-2.1.1-windows\\phantomjs-2.1.1-windows\\bin\\phantomjs.exe");
System.setProperty("webdriver.gecko.driver","C:\\geckodriver-v0.14.0-win64\\geckodriver.exe");
System.setProperty("phantomjs.binary.path", file.getAbsolutePath());
WebDriver driver = new PhantomJSDriver();
driver.get("http://google.com");
// taking screenshot
File screenshot = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(screenshot, new File("screenshot.png"));
driver.close();
System.out.println("Done!");
}
}
为了在 JavaFX 应用程序中使用保存的屏幕截图,我尝试对此类进行一些简单的修改以使其成为 JavaFX 应用程序。
这里是修改后的代码:
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.phantomjs.PhantomJSDriver;
import javafx.application.Application;
import javafx.stage.Stage;
public class Main extends Application{
public static void main(String[] args) throws Exception {
File file = new File("E:\\Eclipse_Projects\\phantomjs-2.1.1-windows\\phantomjs-2.1.1-windows\\bin\\phantomjs.exe");
System.setProperty("webdriver.gecko.driver","C:\\geckodriver-v0.14.0-win64\\geckodriver.exe");
System.setProperty("phantomjs.binary.path", file.getAbsolutePath());
WebDriver driver = new PhantomJSDriver();
driver.get("http://google.com");
// taking screenshot
File screenshot = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(screenshot, new File("screenshot.png"));
driver.close();
System.out.println("Done!");
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
primaryStage.show();
}
}
这是最简单的 JavaFX 应用程序之一,在 main 方法中有一些代码,当我运行它时,它应该保存屏幕截图并打开一个空白的 JavaFX 应用程序。但是当我运行它时,它什么也不做,甚至不执行 main 方法。它会在 1-2 秒后终止,不做任何事情。
然后我意识到当 Selenium Webdriver 库位于构建路径中时,JavaFX 应用程序不会运行。即使我从类中删除所有 Selenium 内容,最终也会出现同样的问题。
package application;
import javafx.application.Application;
import javafx.stage.Stage;
public class Main extends Application{
public static void main(String[] args) throws Exception {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
primaryStage.show();
}
}
仅当我从项目的构建路径中删除 Selenium WebDriver 库时,上面的代码才会运行。
我已经在两个 IDE 中尝试过这些: 在 Eclipse 中,程序在 1-2 秒后终止,没有做任何事情,也没有任何错误。 在 NetBeans 中,程序在 1-2 秒后终止,没有做任何事情,但它给了我一个错误:
C:\Users\User\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: -1073740791
BUILD FAILED (total time: 2 seconds)
我用 Java 写代码快 2 年了,但这是我第一次遇到这样的问题。我google了很多,没有找到类似的东西。
有没有人知道这里发生了什么以及有什么问题?任何想法将不胜感激。
编辑:当我在 IDE 之外运行生成的 jar 文件时,它可以正常工作。
感谢您的考虑。
【问题讨论】:
-
只是一个小提示,因为我在同一个主题上:github.com/anthavio/phanbedder 使用该依赖项让 phantomjs 成为您的应用程序的一部分...您是否尝试在您的外部执行生成的 jar 文件IDE?
-
@FibreFoX,感谢您的评论。我只是尝试执行生成的 jar 文件,它工作正常。我认为问题出在 IDE 上。
-
@yalchin.av - 我很快尝试使用您的示例,但无法重现您的问题。 JavaFx 应用程序可以工作(我对 JavaFx 不太了解,但我对 Selenium 了解很多)。也许您可能想分享您的依赖项(我使用 Maven)...我的类路径中有 selenium 3.0.1。 FWIW,我使用 IntelliJ
-
@KrishnanMahadevan - 我使用一个普通的 java 项目(不是 maven),我的类路径中有 selenium 3.0.1。我打算试试 IntelliJ,可能是 IDE 相关的问题
标签: java selenium javafx automation phantomjs