Java Try-在给定的时间内使用Python除外

Java Try-在给定的时间内使用Python除外,java,python,jcomponent,Java,Python,Jcomponent,我正在使用Marathon(Java桌面应用程序测试工具)自动化回归测试。Marathon使用Jython,因此我可以使用Java库和Python库。当我的脚本填写某些字段时,各种字段会根据我在前面字段中输入的值显示(或不显示)。由于明显的原因,我需要跳过不存在的字段。当字段被禁用但仍然存在时,这很好,因为我可以使用 if Component.isEnabled(): #do something else: #do something 问题是当组

我正在使用Marathon(Java桌面应用程序测试工具)自动化回归测试。Marathon使用Jython,因此我可以使用Java库和Python库。当我的脚本填写某些字段时,各种字段会根据我在前面字段中输入的值显示(或不显示)。由于明显的原因,我需要跳过不存在的字段。当字段被禁用但仍然存在时,这很好,因为我可以使用

    if Component.isEnabled():
        #do something
    else:
        #do something
问题是当组件不存在时。在Java中,是否有任何方法可以测试组件的存在?例如,
Component.exists()
可以满足我的需要,但是Component类中没有这样的方法


我更愿意通过使用
if Component.exists():
语句来解决我的问题,但我可以使用try绕过它,除了block。但是,这会导致脚本的主要执行时间问题。在抛出异常之前,它会尝试查找组件约2或3分钟。我能看到这个问题的唯一方法是,如果有类似
的语句,请尝试x秒
,如果找不到组件,请继续。有没有办法限制您尝试任何给定语句的时间?

我发现一些代码在您的代码中抛出超时异常,作为对另一个Stackoverflow问题的回答:,但是它只在linux机器上工作,如链接中所述

具体地说:

import signal, time

class Timeout():
  """Timeout class using ALARM signal"""
  class Timeout(Exception): pass

  def __init__(self, sec):
    self.sec = sec

  def __enter__(self):
    signal.signal(signal.SIGALRM, self.raise_timeout)
    signal.alarm(self.sec)

  def __exit__(self, *args):
    signal.alarm(0) # disable alarm

  def raise_timeout(self, *args):
    raise Timeout.Timeout()

# Run block of code with timeouts
try:
  with Timeout(60):
    #do something

except Timeout.Timeout:
  #do something else

这将尝试“做点什么”60秒,如果执行时间超过60秒,则继续执行…

这是问题的解决方案:

import signal
def time_out(self):
    def signal_handler(signum, frame):
        raise Exception("Timed out!")

    signal.signal(signal.SIGALRM, signal_handler)
    signal.alarm(3)  
    all_games = []
    try:
        while True:
            #do what you want to do

    except Exception as msg:
        print msg
3是功能超时的时间


祝您好运,Shlomy

在Java端,您可以使用
FutureTask
执行器
FutureTask
实现了
Future
,它有一个带超时的
.get()
(如果超时,抛出
TimeoutException
),我很感激这个响应,但不幸的是我没有Linux机器。这个例子适用于我所寻找的。然而,似乎我无法捕捉错误名称。例如,如果您捕获如下异常
但异常为e:
,并执行
打印(e)
,则不会打印任何内容。