Java 测试时如何自动单击JOptionPane上的OK?
在我的程序中,我正在测试一个按钮,单击该按钮会在应用程序中弹出一个JOptionPane窗口 但是,当该窗口弹出时,它希望用户单击OK,这意味着除非手动关闭该窗口,否则测试无法继续Java 测试时如何自动单击JOptionPane上的OK?,java,swing,testing,popup,joptionpane,Java,Swing,Testing,Popup,Joptionpane,在我的程序中,我正在测试一个按钮,单击该按钮会在应用程序中弹出一个JOptionPane窗口 但是,当该窗口弹出时,它希望用户单击OK,这意味着除非手动关闭该窗口,否则测试无法继续 我希望能够在该窗口出现在我的测试中时以编程方式关闭该窗口,或者阻止这些JopOptions窗格窗口在此测试中弹出。首先,从JopOptions窗格对象创建JDialog。然后,创建一个计时器以在您想要的时间内运行(例如1分钟),并在对话框完成后处理对话框。然后,从JOptionPane对象中检索所选的值,确保在计时器
我希望能够在该窗口出现在我的测试中时以编程方式关闭该窗口,或者阻止这些JopOptions窗格窗口在此测试中弹出。首先,从
JopOptions窗格
对象创建JDialog
。然后,创建一个计时器
以在您想要的时间内运行(例如1分钟),并在对话框完成后处理对话框。然后,从JOptionPane
对象中检索所选的值,确保在计时器释放对话框时考虑未初始化的值
final JOptionPane pane = new JOptionPane(......., JOptionPane.OK_CANCEL_OPTION);
final JDialog dialog = pane.createDialog(.....);
Timer timer = new Timer(you_time, new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
dialog.dispose();
}
});
timer.start();
dialog.setVisible(true);
dialog.dispose();
Integer choice = (Integer) (pane.getValue() == JOptionPane.UNINITIALIZED_VALUE ? JOptionPane.OK_OPTION : pane.getValue());
首先,从JOptionPane
对象创建JDialog
。然后,创建一个计时器
以在您想要的时间内运行(例如1分钟),并在对话框完成后处理对话框。然后,从JOptionPane
对象中检索所选的值,确保在计时器释放对话框时考虑未初始化的值
final JOptionPane pane = new JOptionPane(......., JOptionPane.OK_CANCEL_OPTION);
final JDialog dialog = pane.createDialog(.....);
Timer timer = new Timer(you_time, new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
dialog.dispose();
}
});
timer.start();
dialog.setVisible(true);
dialog.dispose();
Integer choice = (Integer) (pane.getValue() == JOptionPane.UNINITIALIZED_VALUE ? JOptionPane.OK_OPTION : pane.getValue());
解决这个问题有两种基本方法。两者都要求您能够找到按钮
这需要能够使用第二个线程
查找窗口/对话框,并遍历其容器以查找按钮
根据您的测试设置方式,将取决于您可能需要完成的额外工作。UI应该在事件调度线程内运行,如果测试在同一线程中运行,则需要使用单独的线程
,因为作业窗格
将阻止EDT(以特殊方式),使代码无法运行,直到选项窗格关闭
如果您的测试已经在一个单独的线程中运行,那么您就有了更多的功能
这是一个非常简单的例子。它在EDT的上下文中初始化一个JOptionPane
,但有一些方法正在主线程中运行,这些方法查找并执行消息对话框的“OK”按钮
import java.awt.Button;
import java.awt.Component;
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.Frame;
import java.awt.Window;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class FindButton {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JOptionPane.showMessageDialog(null, "This is message dialog", "Message", JOptionPane.INFORMATION_MESSAGE);
}
});
JDialog frame = waitForDialog("Message");
System.out.println("Found window " + frame);
if (frame != null) {
final JButton btn = getButton(frame, "OK");
System.out.println("Found button " + btn);
if (btn != null) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
btn.doClick();
}
});
}
}
}
public static JDialog waitForDialog(String title) {
JDialog win = null;
do {
for (Window window : Frame.getWindows()) {
if (window instanceof JDialog) {
JDialog dialog = (JDialog) window;
System.out.println(dialog.getTitle());
if (title.equals(dialog.getTitle())) {
win = dialog;
break;
}
}
}
if (win == null) {
try {
Thread.sleep(250);
} catch (InterruptedException ex) {
break;
}
}
} while (win == null);
return win;
}
public static JButton getButton(Container container, String text) {
JButton btn = null;
List<Container> children = new ArrayList<Container>(25);
for (Component child : container.getComponents()) {
System.out.println(child);
if (child instanceof JButton) {
JButton button = (JButton) child;
if (text.equals(button.getText())) {
btn = button;
break;
}
} else if (child instanceof Container) {
children.add((Container) child);
}
}
if (btn == null) {
for (Container cont : children) {
JButton button = getButton(cont, text);
if (button != null) {
btn = button;
break;
}
}
}
return btn;
}
}
import java.awt.Button;
导入java.awt.Component;
导入java.awt.Container;
导入java.awt.EventQueue;
导入java.awt.Frame;
导入java.awt.Window;
导入java.util.ArrayList;
导入java.util.List;
导入javax.swing.JButton;
导入javax.swing.JDialog;
导入javax.swing.JOptionPane;
导入javax.swing.SwingUtilities;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
公共类FindButton{
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
例如printStackTrace();
}
showMessageDialog(null,“这是消息对话框”,“消息”,JOptionPane.INFORMATION\u消息);
}
});
JDialog frame=waitForDialog(“消息”);
System.out.println(“找到的窗口”+框架);
如果(帧!=null){
最终JButton btn=getButton(帧“OK”);
系统输出打印项次(“找到按钮”+btn);
如果(btn!=null){
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
btn.doClick();
}
});
}
}
}
公共静态JDialog waitForDialog(字符串标题){
JDialog win=null;
做{
对于(窗口:Frame.getWindows()){
if(JDialog的窗口实例){
JDialog对话框=(JDialog)窗口;
System.out.println(dialog.getTitle());
if(title.equals(dialog.getTitle())){
win=对话;
打破
}
}
}
if(win==null){
试一试{
睡眠(250);
}捕获(中断异常例外){
打破
}
}
}while(win==null);
回归胜利;
}
公共静态JButton getButton(容器容器,字符串文本){
JButton btn=null;
列表子项=新数组列表(25);
对于(组件子级:container.getComponents()){
系统输出打印项次(子项);
if(JButton的子实例){
JButton按钮=(JButton)子按钮;
if(text.equals(button.getText())){
btn=按钮;
打破
}
}else if(容器的子实例){
添加((容器)子对象);
}
}
如果(btn==null){
适用于(容器内容:儿童){
JButton button=getButton(cont,text);
如果(按钮!=null){
btn=按钮;
打破
}
}
}
返回btn;
}
}
本例使用JButton
的doClick
方法模拟单击按钮。您可以使用按钮中的locationOnScreen
信息和java.awt.Robot
来实际单击按钮。但这似乎更简单
您还可以看看哪一个实用程序库设计用于更容易地测试基于Swing(和JavaFX)的应用程序…有两种基本方法可以解决此问题。都是r
public class ActionWithUI extends AbstractAction{
@Override
public void actionPerformed( ActionEvent e ){
//... do some stuff
int result = askUserForInput();
//do some other stuff based on the result of the JOptionPane
}
int askUserForInput(){
return JOptionPane.show...
}
}