键盘机器人类问题

时间:2015-08-14 07:09:38

标签: java awtrobot

我已经创建了用于使用Robot的Keyboard类。但是当我开始使用这个类中的方法时,我在日志中有错误。

这是我的Keyboard.java方法pressEscape()

public class Keyboard {

    private static Robot robot;
    private static int time = 1000;

    public Keyboard(){
        try {
            robot = new Robot();
        } catch (AWTException e) {
            e.printStackTrace();
        }
    }

   public void pressEscape() throws TestException {
        if (!getSession().CanRun())
            throw new TestException(InvalidStateMessage);
        robot.delay(time);
        robot.keyPress(KeyEvent.VK_ESCAPE);
        robot.delay(time);
        robot.keyRelease(KeyEvent.VK_ESCAPE);
        robot.delay(time);
    }

}

来自日志的错误:

  

[2015/08/13 15:43:29] [ID:7F4315A] [Selenium]:java.lang.NullPointerException
  [2015/08/13 15:43:29] [ID:7F4315A] [Selenium]:在Kodak.AutoTest.Framework.Keyboard.pressEscape(Keyboard.java:128)

改变一点方法:

public void pressEscape() throws TestException {
        if (!getSession().CanRun())
            throw new TestException(InvalidStateMessage);
        try {
            new Robot();
            robot.setAutoDelay(time);
            robot.keyPress(KeyEvent.VK_ESCAPE);     
            robot.setAutoDelay(time);
            robot.keyRelease(KeyEvent.VK_ESCAPE);
        } catch (AWTException e) {
            e.printStackTrace();
        }

    }

但在线上仍有相同的错误:

robot.keyPress(KeyEvent.VK_ESCAPE); 

3 个答案:

答案 0 :(得分:0)

看起来好像唯一可以在该方法中实际获得空指针异常的地方是:

if (!getSession().CanRun())

如果getSession()返回null,则会抛出NPE。实际上另一种选择是,如果您未能初始化robot,那么您将在日志中看到AWTException

但是你应该通过查看日志给你的行号来确认这一点。如果这是对的,我建议改变

if (!getSession().CanRun())
            throw new TestException(InvalidStateMessage);

Session session = getSession();
if ((session==null) || !session.CanRun())
            throw new TestException(InvalidStateMessage);

这将使该部分变硬,并且如果会话为空,则意味着您将获得TestException。 (我猜测getSession()返回的类型。)

此外,虽然您在构造函数中初始化robot,但您应该知道它是一个静态字段。这意味着如果你有很多Keyboard个实例,那么每次创建一个实例时,它都会用新的实例覆盖robot的前一个实例,因为它们都共享同一个实例。

您应该将其更改为实例字段(删除static修饰符),或者只将其初始化一次(检查它是否为空,并且仅在初始化时)。

答案 1 :(得分:0)

为了实现这一点,您的public function widgets_with_selected($banner_id) { return $this->belongsToMany('App\Models\Widget', 'zone_has_widgets') ->leftJoin('banner_has_widgets', function($join) use($banner_id) { $join->on('widgets.id', '=', 'banner_has_widgets.widget_id') ->where('banner_has_widgets.banner_id', '=', $banner_id); }) ->select('widgets.*', 'banner_has_widgets.banner_id'); } 变量在第128行应为空。只有robot才会发生异常。检查您的日志以查看是否是这种情况。另请参阅MadProgrammer对您的问题的评论并对其采取行动。

答案 2 :(得分:0)

现在正在运行,这是完整的代码:

  EMEA             100
     UK             50
     France         50