我前几天提到了一个关于类似问题的话题,我以为我已经解决了它但是当我尝试接受用户建议并将我的代码拆分为更符合OO的代码时,我只是继续遇到同样的异常
首先,我有一个'main'类,它加载一个JFrame,然后加载一个ComboBox类的实例和一个runButton类的实例。一旦显示这些,它就会运行一个while循环,等待来自运行按钮的特定响应,然后加载相应的Web驱动程序。
这是驱动程序类。
public class DynamicBrowsers {
public static void main(String[] args) {
BrowserBox b = new BrowserBox();
GoButton g = new GoButton();
JFrame IDE = new JFrame("IDE");
IDE.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
IDE.setContentPane(b);
IDE.add(g);
IDE.setPreferredSize(new Dimension(200, 100));
IDE.pack();
IDE.setVisible(true);
WebDriver driver = null;
while (g.browserValue == 0){
if(g.browserValue == 1){
driver = new FirefoxDriver();
System.out.println("FF!");
break;
}else if(g.browserValue == 2){
driver = new ChromeDriver();
System.out.println("Chrome!");
break;
}else if(g.browserValue == 3){
driver = new InternetExplorerDriver();
System.out.println("IE!");
break;
}
}
本课程中还有更多内容,但它不相关,主要是我测试我在Selenium中可以做些什么。
它从中读取的类是BrowserBox类,它实现了一个组合框,代码为: -
public class BrowserBox extends JPanel {
public String browserPick;
String[] browsers = {"Please Select a Browser","Mozilla", "Chrome", "IE"};
public JComboBox browserPicker = new JComboBox(browsers);
public BrowserBox() {
add(browserPicker);
ActionListener cbActionListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent listChoice) {
String s = (String) browserPicker.getSelectedItem();//get the selected item
switch (s) {//check for a match
case "Please Select a Browser":
browserPick = "Please Select a Browser";
System.out.println(browserPick);
break;
case "Mozilla":
browserPick = "Mozilla";
System.out.println("Could have been a worse choice than " + browserPick);
break;
case "Chrome":
browserPick = "Chrome";
System.out.println("Good choice picking " + browserPick);
break;
case "IE":
browserPick = "IE";
System.out.println("For some reason you chose " + browserPick);
break;
default:
browserPick = "Please Select a Browser";
System.out.println("No match selected, defaulting too " + browserPick);
break;
}
}
};
browserPicker.addActionListener(cbActionListener);
}
}
最后按钮,GoButton类: -
public class GoButton extends JButton {
public int browserValue = 0;
JButton runButton = new JButton("Run Test");
BrowserBox cb = new BrowserBox();
public GoButton() {
add(runButton);
ActionListener bActionListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent runClicked) {
if (cb.browserPick.equals("Mozilla")){
browserValue = 1;
System.out.println("FF clicked " + browserValue);
}
else if (cb.browserPick.equals("Chrome")){
browserValue = 2;
System.out.println("Chrome clicked " + browserValue);
}
else if (cb.browserPick.equals("IE")){
browserValue = 3;
System.out.println("IE clicked " + browserValue);
}
}
};
runButton.addActionListener(bActionListener);
}
}
这是我得到异常的地方
线程“AWT-EventQueue-0”中的异常java.lang.NullPointerException 在GoButton $ 1.actionPerformed(GoButton.java:21)
我认为问题是browserPick的值不会改变我对它的预期方式,这意味着该值为null,因此不是我想要的,但我无法解决原因。或者如何解决它。
如果我的问题很烦人,或者我做的事情非常愚蠢,我很抱歉。在我深入了解更多Selenium之前,试着在周围的Java中取得好成绩。
谢谢你, 法雷尔
答案 0 :(得分:1)
在GoButton
班级中,您正在创建BrowswerBox
BrowserBox cb = new BrowserBox();
与您添加到框架中的实例无关...
BrowserBox b = new BrowserBox();
GoButton g = new GoButton();
JFrame IDE = new JFrame("IDE");
IDE.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
IDE.setContentPane(b);
IDE.add(g);
IDE.setPreferredSize(new Dimension(200, 100));
IDE.pack();
IDE.setVisible(true);
从JButton
延伸实际上是矫枉过正。不仅如此,你还在其中创建了另一个JButton
的实例,并将其添加到按钮中?
您只需将ActionListener
目录添加到g
(GoButton
的实例),该目录将有更多容量来引用BrowserButton
的正确实例
例如......
final BrowserBox b = new BrowserBox();
JButton g = new JButton("Run Test");
JFrame IDE = new JFrame("IDE");
IDE.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
IDE.setContentPane(b);
IDE.add(g);
IDE.setPreferredSize(new Dimension(200, 100));
IDE.pack();
IDE.setVisible(true);
g.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent runClicked) {
WebDriver driver = null;
if ("Mozilla".equals(b.browserPick)){
driver = new FirefoxDriver();
System.out.println("FF clicked " + browserValue);
}
else if ("Chrome".equals(b.browserPick)){
System.out.println("Chrome clicked " + browserValue);
driver = new ChromeDriver();
}
else if ("IE".equals(b.browserPick)){
System.out.println("IE clicked " + browserValue);
driver = new InternetExplorerDriver();
}
if (driver != null) {
// Drive away...
}
}
});
我的下一个关注点是,您将browserPicker
公开为public
,任何人都可以更改可用值,删除它,替换它并做一些令人讨厌的事情。
就个人而言,我简单地将“开始测试”按钮作为BrowswerBox
窗格的一部分包含在内,并确保组件具有private
访问权限。如果需要,我会提供某种吸气剂来返回所选项目的值......
我建议您花一些时间阅读Creating a GUI With JFC/Swing,您可能会发现Initial Threads也很有趣。
<强>更新强>
我还应该提到这个:
while (g.browserValue == 0){
if(g.browserValue == 1){
driver = new FirefoxDriver();
System.out.println("FF!");
break;
}else if(g.browserValue == 2){
driver = new ChromeDriver();
System.out.println("Chrome!");
break;
}else if(g.browserValue == 3){
driver = new InternetExplorerDriver();
System.out.println("IE!");
break;
}
}
不是您对GUI环境中用户交互/更改的反应方式。大多数GUI都是事件驱动的,也就是说,用户做了某些事情并且你做出了反应。我已将前一个示例中的ActionListener
更新为更“准确”
答案 1 :(得分:0)
如果您尚未选择浏览器,则browserPick
将为null
。变量为null
时不应导致NullPointerException
。我想你可能希望它是“请选择一个浏览器”......