我想使用SWTBot通过快速帮助菜单内联局部变量。我的 SWTBot 测试弹出快速帮助菜单,但无法选择提案项。我在GitHub 上创建了一个演示此问题的最小项目,并打开了一个详细描述该问题的问题。
问问题
384 次
1 回答
1
我在自动完成菜单上遇到了同样的问题,我发现的唯一解决方法是实现我自己的 autoComplete 方法。您可以轻松地执行类似的操作以获得快速帮助。我的代码已经在windows和unix系统下测试过:
package aaa.bbb.ccc;
import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.widgetOfType;
import java.util.List;
import org.eclipse.jface.bindings.keys.KeyStroke;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swtbot.swt.finder.SWTWorkbenchBot;
import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
import org.eclipse.swtbot.swt.finder.results.VoidResult;
import org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotTable;
import org.junit.Assert;
public abstract class AutoCompletionHelper {
public static void autoCompleteWithFirstMatchingProposal(SWTWorkbenchBot bot) {
SWTBotTable proposalsTable = showCompletionProposalsTable(bot);
Assert.assertTrue("No completion proposals found", proposalsTable.rowCount() > 0);
selectProposal(proposalsTable, 0);
}
public static void autoCompleteWithProposal(SWTWorkbenchBot bot, String completionProposal) {
SWTBotTable proposalsTable = showCompletionProposalsTable(bot);
int rowCount = proposalsTable.rowCount();
int index = -1;
int matchingProposalsCount = 0;
for (int i = 0; i < rowCount; i++) {
if (proposalsTable.cell(i, 0).startsWith(completionProposal)) {
index = i;
matchingProposalsCount++;
}
}
Assert.assertFalse("No completion proposals matching '" + completionProposal + "'", matchingProposalsCount == 0);
Assert.assertFalse("Multiple completion proposals matching '" + completionProposal + "'", matchingProposalsCount > 1);
selectProposal(proposalsTable, index);
}
private static SWTBotTable showCompletionProposalsTable(EclipseBot bot) {
bot.pressShortcut(KeyStroke.getInstance(SWT.CTRL, 0), KeyStroke.getInstance(0, SWT.SPACE));
bot.sleep(100); //Wait for auto-completion shell to be displayed
List<Shell> shells = bot.shells("");
Table proposalsTable = null;
long timeout = SWTBotPreferences.TIMEOUT;
SWTBotPreferences.TIMEOUT = 200;
boolean findInvisibleControls = bot.getFinder().shouldFindInvisibleControls();
bot.getFinder().setShouldFindInvisibleControls(true);
try {
for (Shell shell : shells) {
try {
proposalsTable = bot.widget(widgetOfType(Table.class), shell);
} catch (WidgetNotFoundException ex) {
continue;
}
break;
}
} finally {
bot.getFinder().setShouldFindInvisibleControls(findInvisibleControls);
SWTBotPreferences.TIMEOUT = timeout;
}
if (proposalsTable == null) {
throw new RuntimeException("Did not find any completion proposals table ...");
}
return new SWTBotTable(proposalsTable);
}
private static void selectProposal(final SWTBotTable proposalsTable, final int proposalIndex) {
UIThreadRunnable.asyncExec(new VoidResult() {
@Override
public void run() {
Table table = proposalsTable.widget;
table.setSelection(proposalIndex);
Event event = new Event();
event.type = SWT.Selection;
event.widget = table;
event.item = table.getItem(proposalIndex);
table.notifyListeners(SWT.Selection, event);
table.notifyListeners(SWT.DefaultSelection, event);
}
});
}
}
于 2012-05-15T12:10:08.820 回答