- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
Possible Duplicate:
Making FEST to wait for the application to load
注意:这个问题与 this question 基本相同。由于这个问题没有答案,我决定将示例从那里扩展到可运行的 SSCE,并提供一些附加信息,希望能得到一些帮助。
因此,问题是当所查找的组件可能尚不存在时,您应该如何处理组件查找。看看这个简单的单标签 GUI。
public class MyFrame extends JFrame {
JLabel theLabel;
public MyFrame() {
this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
theLabel = new JLabel();
theLabel.setName("theLabelName");
computeLabelContentOnWorkerThread();
}
private void computeLabelContentOnWorkerThread() {
new SwingWorker<String, Void>() {
@Override
protected String doInBackground() throws Exception {
Thread.sleep(5000);
return "Info from slow database connection";
}
@Override
protected void done() {
try {
theLabel.setText(get());
add(theLabel);
pack();
setVisible(true);
} catch (InterruptedException ignore) {
} catch (ExecutionException ignore) {
}
}
}.execute();
}
}
这个测试用例:
public class TestOfDelayedComponent extends FestSwingJUnitTestCase {
FrameFixture frameWrapper;
@Before
public void onSetUp() {
MyFrame frame = GuiActionRunner.execute(new GuiQuery<MyFrame>() {
protected MyFrame executeInEDT() {
return new MyFrame();
}
});
frameWrapper = new FrameFixture(robot(), frame);
frameWrapper.show();
}
@Test
public void testLabelContent() {
String labelContent = frameWrapper.label("theLabelName").text();
assertTrue(labelContent.equals("Info from slow database connection"));
}
}
会发生什么?标签组件的构造被委托(delegate)给一个缓慢的工作线程。因此,当 GUI 出现时,标签不会立即出现。当测试用例运行时,标签还没有出现,因此在执行组件查找frameWrapper.label("theLabelName")
时,抛出 ComponentLookupException。
问题是如何防止抛出此异常?如果它是顶级组件,我可以这样做 WindowFinder.findFrame("title").withTimeout(10000)
获取一个 FrameFinder 对象,即使在帧出现之前有延迟,该对象也可以找到帧。我想要的是与此类似的东西,但是对于其他类型的组件,例如一个 JLabel。
注意:当然,您自己实现该功能不会那么困难。做起来相当简单:
while(noComponentFound and notReachedTimeout){
look for component using FEST
sleep for a short delay
}
但是,最好不要被迫用这样的循环来使测试脚本变得困惑。感觉等待组件在测试脚本中似乎并不是一个太不寻常的任务。所以,在我看来,FEST 应该支持这样做。也许事实并非如此?难道不能等待组件吗?
最佳答案
有一种方法可以编写暂停和等待的条件。这是您需要的 while(noComponentFound 和 notReachedTimeout) 的示例。这可以通过 Pause.pause(new ComponentFoundCondition(...),timeout_milis) 来完成。示例:
frame = WindowFinder.findFrame("frame0").using(robot);
//Wait for the event of loading tables in the GUI before we fail looking for them concurrently
final GenericTypeMatcher<JTable> matcher = new GenericTypeMatcher<JTable>(JTable.class) {
@Override protected boolean isMatching(JTable table){ return (table instanceof myTable && table.getColumnCount()<20); } //Condition has to be totally identitary for one particular component. If not, we will never reach condition and so a timeout will be thrown in next line
};
Pause.pause(new ComponentFoundCondition("Waiting for myTable to load before I look for it...", frame.robot.finder(), matcher, frame.target), 50000); //frame.target argument can be omitted. We also put an associated 50 sec timeout even if the condition is never satisfied
fixedTable = frame.table(matcher); //Look finally for the table now we are sure its loaded
您可以与不同的匹配者一起玩。例如,如果框架下只有一种类型的表 myTable,那就很简单了:
final ComponentMatcher matcher = new TypeMatcher(myTable.class); // We could use an easier TypeMatcher, because we would not need to add any additional distinction apart from the class type
Pause.pause(new Condition("Waiting for myTable to load...") { // If we are totally sure that there will be only one occurrence, we can use here the simplest form like above new ComponentFoundCondition("DebugMsg", frame.robot.finder(), matcher, frame.target)
@Override public boolean test() { return !frame.robot.finder().findAll(frame.target, matcher).size().isEmpty(); } // If not we need a custom condition that checks for >0 instead of =1 results like ComponentNotFound.
}, 50000);
问题是 (component->frame).table(matcher) 不接受 TypeMatcher,而只是接受 GenericMatcher,所以无论如何我们都应该创建 GenericMatcher
如果你找不到任何东西,总是可以选择静态修复 Pause.pause(5, TimeUnit.SECONDS);
关于java - 制作节 :s component lookup mechanism wait for a component to exist,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8957334/
我的 Tableview 有 N 个部分,其中 0,1 个部分是固定的。永远不会从 TableView 中删除。但从第2节开始到第N节,可以删除或插入。从第 2 部分到 N 部分 -> 每个部分也有行
节/段指令有多重要?我注意到它们通常是可选的。另外,我注意到当您包含或不包含它们时,输出大小会发生变化。 我正在使用NASM ,如果有帮助的话。 最佳答案 它们非常重要,因为如果将字符串保存在代码段中
我正在尝试使用已解析并存储在字典中的Firestore数据填充tableview的Sections and Rows,看起来像这样... dataDict = ["Monday": ["Chest",
所以这应该是相当基本的......我正在这样做,但我想要求一些不同的选择。 一种选择是使用“平滑滚动”和 anchor 名称......但我发现这非常不一致。 这是我的 HTML 结构:
我尝试将 3 篇文章嵌套到一个部分中。为什么它们会溢出部分的边界? CSS: article{ border-right:solid 1px grey; height:50%; width:30%;
早上好伙计们,这只是我在这里的第二个问题,所以请耐心等待我和我的最低要求: 我刚刚写了这篇冗长的消息,说明如何将 ID 和 class 命令放在 section 而不是 容器中,以及为什么该部分突然覆
我正在尝试使用以下代码段编码消息: JAXBContext jContext = JAXBContext.newInstance(Iq.class); Marshall
我正在尝试使用以下代码段编码消息: JAXBContext jContext = JAXBContext.newInstance(Iq.class); Marshall
我需要生成一个 PDF 文档,其中我需要一些“章节”(连同其部分和小节)没有编号但仍包含在 ToC 中。 这是我的硕士论文。我正在使用 book 文档类,因为我不喜欢 memoir 默认值。 如果我使
我正在使用正则表达式来尝试匹配 INI 文件中的节 block 。我正在使用书中给出的食谱Regular Expressions Cookbook ,但它似乎对我不起作用。 这是我正在使用的代码: f
我有一个多线程进程,其中文件由多个线程共享(读取和写入)。有没有什么办法可以让一个线程锁定一个文件段,使其他线程无法访问它?我尝试过fcntl(fd, F_SETLKW, &flock),但是这个锁只
Closed. This question needs to be more focused。它当前不接受答案。
我正在尝试使用以下代码片段编码消息: JAXBContext jContext = JAXBContext.newInstance(Iq.class); Marshal
我使用的是分段 tableView。如果我单击 tableview,它总是将索引路径 0 传递给详细 View Controller 。如果我单击第二行,但它的 indexpath pass 总是传递
我有一个多线程进程,其中一个文件由多个线程共享(读取和写入)。有没有什么方法可以让一个线程锁定一个文件段,使其他线程无法访问它?我试过fcntl(fd, F_SETLKW, &flock),但是这个锁
我正在尝试使用以下代码片段编码消息: JAXBContext jContext = JAXBContext.newInstance(Iq.class); Marshal
我想创建一个“术语”部分,其中包含我正在使用的术语的定义,以便每次我在此术语部分中使用这些术语时,都会创建一个指向该定义的链接。 目前,我能想到的最好的方法是: .. |flavor| replace
文档引用 configuring information with stanzas ,但什么是节? 它只是配置子部分的一个花哨名称吗? 最佳答案 您是对的,在此上下文中,节是指 IBM MQ 配置文件
我正在尝试在消息包中接收 XMPP 自定义节。例如, wololo haiooh ... 关键是我知道我会收到一个“custom_sta
为什么这是有效的: (= '(:anything :goes :here) (filter (fn [x] true) '(:anything :goes :here))) 但不是这个? (= (:a
我是一名优秀的程序员,十分优秀!