启动 Firefox 并等待它关闭
Launch Firefox and Wait until it is Closed
问题
我想启动 Firefox 网络浏览器作为访问特定网站的进程,然后等到它关闭。
一种特殊情况是浏览器可能已经打开并且 运行正在访问,因为用户可能已经访问过某些网站。
在这种情况下,浏览器可能会在现有 window 中打开一个新选项卡,并且新启动的进程将立即终止。这不应该混淆我的等待过程:要么,我想要一个新的浏览器 window(如果可以以某种方式强制执行,也许通过命令行参数)并等到它关闭,或者保留现有的浏览器 window 然后等到我的过程产生的所有选项卡都关闭。
环境
我觉得没关系,但是我的编程环境是Java
,你可以假设我知道浏览器的路径。
示例
我唯一可以获得预期行为的浏览器是 Internet Explorer(叹息)。在这里,我基本上需要在临时文件夹中创建一个新的批处理脚本,其中包含
start /WAIT "" "C:\Program Files\Internet Explorer\iexplore.exe" -noframemerging http://www.test.com/
然后我 运行 批处理脚本而不是直接浏览器并在我完成等待后将其删除。
预期过程
为了使预期的过程更清晰:
- 我的程序启动。
- 我的程序将 Firefox 浏览器作为单独的进程启动,并提供一个 URL 作为该进程的参数进行访问。
- Firefox 浏览器 运行 作为一个新进程异步运行,并访问提供的 URL。到目前为止,这很容易。
- 启动新进程(Firefox 浏览器)后,我自己的程序应该等待所述进程终止。这是困难的部分,因为
- 许多现代浏览器启动多个进程。我需要等待所有这些。
- 许多现代浏览器可能以某种方式 "detach" 自己从我启动的过程中。抱歉,我不知道更好的词,我的意思是:我启动一个进程,然后启动另一个进程并立即终止,而另一个进程保持 运行ning。如果我等待最初由我的程序启动的浏览器进程,则等待将在浏览器仍处于打开状态时完成。
- 上面的一个特例是在许多浏览器中实现的选项卡式浏览:如果浏览器在我启动时已经打开(在用户启动的单独进程中),我新启动的浏览器进程可能会简单地传达URL 访问现有进程并终止。用户仍在我提供的 URL 上,而我的程序认为她已关闭浏览器。可以通过指定一个特殊的命令行参数来禁止这个问题,比如 IE 的
noframemerging
。
- 一旦浏览器终止或与我提供的 URL 相关的所有选项卡都已关闭,我的程序将停止等待,而是继续执行其业务。
用例是我有一个 Web 应用程序,它可以 运行 在本地或在服务器上。如果是本地运行,则启动一个web服务器,然后打开浏览器访问入口页面。浏览器关闭后,该 Web 应用程序也应关闭。这对 Internet Explorer 可靠,对于所有其他情况,用户必须关闭浏览器,然后明确地关闭 Web 应用程序。因此,如果我可以可靠地等待 Firefox 完成,这将使用户体验更好。
解决方案首选项:
解决方案按以下顺序优先选择
- 纯 Java JRE 附带的任何东西。这包括浏览器的特殊命令行参数。
- 需要我做的事情,例如,创建批处理脚本(例如在 IE 情况下。)
- 任何需要第 3 方开源库的东西。
- 任何需要第 3 方闭源库的东西。
任何与平台无关的答案(同时适用于 Windows 和 Linux)优于依赖于平台的答案。
原因:在理想情况下,我想知道到底做了什么并将其包含到我自己的代码中。因为我想支持不同的浏览器(请参阅下面的 "PS"),所以我想避免为每个浏览器包含一个库。最后,我不能使用商业或闭源库,但如果没有更好的答案出现,我当然会接受任何可行的解决方案。我将接受类型为“1”的第一个(相当不错的)工作答案。如果出现偏好较低的答案,我会等几天再接受其中最好的一个。
PS
我将为其他浏览器推出几个类似的问题。因为我相信浏览器在它们消化的命令行参数、启动线程和子进程的方式上有很大不同,我认为这是有道理的。
- 关于 Chrome 的类似问题:
- 关于 Opera 的类似问题:Launch Opera and Wait Until it is Closed
- 关于 Chromium 的类似问题:Launch Chromium and Wait Until it is Closed
- 关于 Edge 的类似问题:Launch Edge Browser and Wait Until it is Closed
- 关于 Safari 的类似问题:
这是一个示例程序,它可能会以某种方式设法证明 selenium 库能够满足您的需求。您需要先下载 selenium 库并将其设置为您的 IDE,然后才能 运行 此程序。
该程序允许您单击一个按钮。然后 firefox 浏览器会在几秒钟内自动打开并启动一个网站。正在加载网站,请稍候。之后您可以关闭 Firefox 浏览器。程序也会在2秒后自动关闭。
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.net.ConnectException;
import javax.swing.*;
import org.openqa.selenium.NoSuchWindowException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class AnotherTest extends JFrame {
WebDriver driver;
JLabel label;
public AnotherTest() {
super("Test");
java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
setBounds((screenSize.width - 400) / 2, (screenSize.height - 100) / 2, 400, 100);
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent evt) {
quitApplication();
}
});
JButton jButton1 = new javax.swing.JButton();
label = new JLabel("");
JPanel panel = new JPanel(new FlowLayout());
panel.add(jButton1);
add(panel, BorderLayout.CENTER);
add(label, BorderLayout.SOUTH);
jButton1.setText("Open Microsoft");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
label.setText("Loading browser. Please wait..");
java.util.Timer t = new java.util.Timer();
t.schedule(new java.util.TimerTask() {
@Override
public void run() {
openBrowserAndWait();
}
}, 10);
}
});
}
private void openBrowserAndWait() {
driver = new FirefoxDriver();
String baseUrl = "https://www.microsoft.com";
driver.get(baseUrl);
java.util.Timer monitorTimer = new java.util.Timer();
monitorTimer.schedule(new java.util.TimerTask() {
@Override
public void run() {
while (true) {
checkDriver();
try {
Thread.sleep(2000);
} catch (InterruptedException ex) {
}
}
}
}, 10);
}
private void checkDriver() {
if (driver == null) {
return;
}
boolean shouldExit = false;
try {
label.setText(driver.getTitle());
} catch (NoSuchWindowException e) {
System.out.println("Browser has been closed. Exiting Program");
shouldExit = true;
} catch (Exception e) {
System.out.println("Browser has been closed. Exiting Program");
shouldExit = true;
}
if (shouldExit) {
this.quitApplication();
}
}
private void quitApplication() {
// attempt to close gracefully
if (driver != null) {
try {
driver.quit();
} catch (Exception e) {
}
}
System.exit(0);
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new AnotherTest().setVisible(true);
}
});
}
}
Selenium 主要用于测试 Web 应用程序的自动化。可以直接打开浏览器,读取里面的html内容。有关更多信息,请参阅 http://www.seleniumhq.org/。
问题
我想启动 Firefox 网络浏览器作为访问特定网站的进程,然后等到它关闭。
一种特殊情况是浏览器可能已经打开并且 运行正在访问,因为用户可能已经访问过某些网站。
在这种情况下,浏览器可能会在现有 window 中打开一个新选项卡,并且新启动的进程将立即终止。这不应该混淆我的等待过程:要么,我想要一个新的浏览器 window(如果可以以某种方式强制执行,也许通过命令行参数)并等到它关闭,或者保留现有的浏览器 window 然后等到我的过程产生的所有选项卡都关闭。
环境
我觉得没关系,但是我的编程环境是Java
,你可以假设我知道浏览器的路径。
示例
我唯一可以获得预期行为的浏览器是 Internet Explorer(叹息)。在这里,我基本上需要在临时文件夹中创建一个新的批处理脚本,其中包含
start /WAIT "" "C:\Program Files\Internet Explorer\iexplore.exe" -noframemerging http://www.test.com/
然后我 运行 批处理脚本而不是直接浏览器并在我完成等待后将其删除。
预期过程
为了使预期的过程更清晰:
- 我的程序启动。
- 我的程序将 Firefox 浏览器作为单独的进程启动,并提供一个 URL 作为该进程的参数进行访问。
- Firefox 浏览器 运行 作为一个新进程异步运行,并访问提供的 URL。到目前为止,这很容易。
- 启动新进程(Firefox 浏览器)后,我自己的程序应该等待所述进程终止。这是困难的部分,因为
- 许多现代浏览器启动多个进程。我需要等待所有这些。
- 许多现代浏览器可能以某种方式 "detach" 自己从我启动的过程中。抱歉,我不知道更好的词,我的意思是:我启动一个进程,然后启动另一个进程并立即终止,而另一个进程保持 运行ning。如果我等待最初由我的程序启动的浏览器进程,则等待将在浏览器仍处于打开状态时完成。
- 上面的一个特例是在许多浏览器中实现的选项卡式浏览:如果浏览器在我启动时已经打开(在用户启动的单独进程中),我新启动的浏览器进程可能会简单地传达URL 访问现有进程并终止。用户仍在我提供的 URL 上,而我的程序认为她已关闭浏览器。可以通过指定一个特殊的命令行参数来禁止这个问题,比如 IE 的
noframemerging
。
- 一旦浏览器终止或与我提供的 URL 相关的所有选项卡都已关闭,我的程序将停止等待,而是继续执行其业务。
用例是我有一个 Web 应用程序,它可以 运行 在本地或在服务器上。如果是本地运行,则启动一个web服务器,然后打开浏览器访问入口页面。浏览器关闭后,该 Web 应用程序也应关闭。这对 Internet Explorer 可靠,对于所有其他情况,用户必须关闭浏览器,然后明确地关闭 Web 应用程序。因此,如果我可以可靠地等待 Firefox 完成,这将使用户体验更好。
解决方案首选项:
解决方案按以下顺序优先选择
- 纯 Java JRE 附带的任何东西。这包括浏览器的特殊命令行参数。
- 需要我做的事情,例如,创建批处理脚本(例如在 IE 情况下。)
- 任何需要第 3 方开源库的东西。
- 任何需要第 3 方闭源库的东西。
任何与平台无关的答案(同时适用于 Windows 和 Linux)优于依赖于平台的答案。
原因:在理想情况下,我想知道到底做了什么并将其包含到我自己的代码中。因为我想支持不同的浏览器(请参阅下面的 "PS"),所以我想避免为每个浏览器包含一个库。最后,我不能使用商业或闭源库,但如果没有更好的答案出现,我当然会接受任何可行的解决方案。我将接受类型为“1”的第一个(相当不错的)工作答案。如果出现偏好较低的答案,我会等几天再接受其中最好的一个。
PS
我将为其他浏览器推出几个类似的问题。因为我相信浏览器在它们消化的命令行参数、启动线程和子进程的方式上有很大不同,我认为这是有道理的。
- 关于 Chrome 的类似问题:
- 关于 Opera 的类似问题:Launch Opera and Wait Until it is Closed
- 关于 Chromium 的类似问题:Launch Chromium and Wait Until it is Closed
- 关于 Edge 的类似问题:Launch Edge Browser and Wait Until it is Closed
- 关于 Safari 的类似问题:
这是一个示例程序,它可能会以某种方式设法证明 selenium 库能够满足您的需求。您需要先下载 selenium 库并将其设置为您的 IDE,然后才能 运行 此程序。
该程序允许您单击一个按钮。然后 firefox 浏览器会在几秒钟内自动打开并启动一个网站。正在加载网站,请稍候。之后您可以关闭 Firefox 浏览器。程序也会在2秒后自动关闭。
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.net.ConnectException;
import javax.swing.*;
import org.openqa.selenium.NoSuchWindowException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class AnotherTest extends JFrame {
WebDriver driver;
JLabel label;
public AnotherTest() {
super("Test");
java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
setBounds((screenSize.width - 400) / 2, (screenSize.height - 100) / 2, 400, 100);
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent evt) {
quitApplication();
}
});
JButton jButton1 = new javax.swing.JButton();
label = new JLabel("");
JPanel panel = new JPanel(new FlowLayout());
panel.add(jButton1);
add(panel, BorderLayout.CENTER);
add(label, BorderLayout.SOUTH);
jButton1.setText("Open Microsoft");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
label.setText("Loading browser. Please wait..");
java.util.Timer t = new java.util.Timer();
t.schedule(new java.util.TimerTask() {
@Override
public void run() {
openBrowserAndWait();
}
}, 10);
}
});
}
private void openBrowserAndWait() {
driver = new FirefoxDriver();
String baseUrl = "https://www.microsoft.com";
driver.get(baseUrl);
java.util.Timer monitorTimer = new java.util.Timer();
monitorTimer.schedule(new java.util.TimerTask() {
@Override
public void run() {
while (true) {
checkDriver();
try {
Thread.sleep(2000);
} catch (InterruptedException ex) {
}
}
}
}, 10);
}
private void checkDriver() {
if (driver == null) {
return;
}
boolean shouldExit = false;
try {
label.setText(driver.getTitle());
} catch (NoSuchWindowException e) {
System.out.println("Browser has been closed. Exiting Program");
shouldExit = true;
} catch (Exception e) {
System.out.println("Browser has been closed. Exiting Program");
shouldExit = true;
}
if (shouldExit) {
this.quitApplication();
}
}
private void quitApplication() {
// attempt to close gracefully
if (driver != null) {
try {
driver.quit();
} catch (Exception e) {
}
}
System.exit(0);
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new AnotherTest().setVisible(true);
}
});
}
}
Selenium 主要用于测试 Web 应用程序的自动化。可以直接打开浏览器,读取里面的html内容。有关更多信息,请参阅 http://www.seleniumhq.org/。