我目前正在开发一个JavaFX项目。在GUI初始化时,我想使用Selenium和FirefoxDriver从HTML文档中读取一些信息。通常我会使用爬虫来获取信息,但是这个文档充满了JavaScript,所以我只能使用Selenium来获取信息(我知道,这真的很糟糕)。JavaFX线程冻结
现在我遇到了这个过程最多需要15秒的问题,我想在JavaFX进度条上显示Selenium的进度。所以我建立了一个线程来完成所有工作,并尝试更新GUI,但线程冻结直到Selenium完成。
这是我的尝试:
public class SeleniumThread extends Thread
{
private MainViewController main;
@Override
public void run()
{
try
{
WebDriver driver = new FirefoxDriver();
driver.get("http://---.jsp");
main.getMain().getPrimaryStage().toFront();
main.getPbStart().setProgress(0.1);
WebElement query = driver.findElement(By.id("user"));
query.sendKeys(new String[] {"Username"});
query = driver.findElement(By.id("passwd"));
query.sendKeys(new String[] {"Password"});
query.submit();
driver.get("http://---.jsp");
main.getPbStart().setProgress(0.2);
sleep(1000);
main.getPbStart().setProgress(0.25);
driver.get("http://---.jsp");
main.getPbStart().setProgress(0.4);
sleep(1000);
main.getPbStart().setProgress(0.45);
driver.get("---.jsp");
main.getPbStart().setProgress(0.6);
sleep(1000);
main.getPbStart().setProgress(0.65);
query = driver.findElement(By.cssSelector("button.xyz"));
query.click();
sleep(1000);
main.getPbStart().setProgress(0.85);
System.out.println(driver.getPageSource());
driver.quit();
}
catch(InterruptedException e)
{
// Exception ...
}
}
public MainViewController getMain()
{
return main;
}
public void setMain(MainViewController main)
{
this.main = main;
}
}
MainViewController
public void startup()
{
if(main.getCc().getMjUsername() != null &&
main.getCc().getMjPassword() != null &&
main.getCc().getMjUsername().length() != 0 &&
main.getCc().getMjPassword().length() != 0)
{
SeleniumThread st = new SeleniumThread();
st.setMain(this);
st.setDaemon(true);
st.run();
}
}
我读过,我应该使用像任务工作者它,但我不知道如何实现它。我需要将参数传递给此任务,因为我需要将我的primaryStage设置为前端并更新进度栏。
我希望你能理解我的问题。我会很感激每一个帮助。
1)你看看试图让JavaFX的直接从后台线程中调用,虽然我知道关于JavaFX一点,我知道这是不允许的,这JavaFX的来电必须在JavaFX应用程序线程上进行。参见[JavaFX中的并发症](http://docs.oracle.com/javafx/2/threads/jfxpub-threads.htm)。 2)作为一个附注,你似乎在扩展Thread,你真的想实现Runnable。 –
“我读过我应该使用像Task这样的工作者,但我不知道如何实现它。” ['Task'](http://docs.oracle.com/javase/8/javafx/api/index.html?javafx/concurrent/Task.html)API文档有很多示例,包括具有参数和更新进度。 –