`

在SWTBot中触发右键菜单(ContextMenu)

阅读更多

在SWTBot中,触发右键菜单是简单的task,但是当要触发contextMenu的二级菜单时,就会出现问题,原因可能是事件的丢失,诸如下面的菜单:

   Tree

     TreeItem1

       TreeItem2

  想要在TreeItem2上触发SOMA->SOMA sub menu是困难的,下面是我的解决方案(从SWTBot 论坛上抄出来的呵呵http://www.eclipse.org/forums/index.php?t=msg&goto=629948&S=96549f36b839765eb99c047d8b51151c

 

经验是,不能直接传入TreeItem, 要把整个Tree node传入才行 

 

 String[] paths={"SOMA-ME","Extract SOMA Service Model Elements"};			
ContextMenuHelper.clickContextMenu(projectTree,paths);

 

ContextMenuHelper 源代码:

package com.ibm.asset.adit.mdhi.test.util;

import static
org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.withMnemonic;
import static org.hamcrest.Matchers.allOf;
import static org.hamcrest.Matchers.instanceOf;

import java.util.Arrays;

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
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.results.WidgetResult;
import org.eclipse.swtbot.swt.finder.widgets.AbstractSWTBot;
import org.hamcrest.Matcher;

public class ContextMenuHelper {
	/**
	 * Clicks the context menu matching the text.
	 * 
	 * @param text
	 *            the text on the context menu.
	 * @throws WidgetNotFoundException
	 *             if the widget is not found.
	 */
	public static void clickContextMenu(final AbstractSWTBot<?> bot,
			final String... texts) {

		// show
		final MenuItem menuItem = UIThreadRunnable
				.syncExec(new WidgetResult<MenuItem>() {
					public MenuItem run() {
						MenuItem menuItem = null;
						Control control = (Control) bot.widget;
						Menu menu = control.getMenu();
						for (String text : texts) {
							Matcher<?> matcher = allOf(
									instanceOf(MenuItem.class),
									withMnemonic(text));
							menuItem = show(menu, matcher);
							if (menuItem != null) {
								menu = menuItem.getMenu();
							} else {
								hide(menu);
								break;
							}
						}

						return menuItem;
					}
				});
		if (menuItem == null) {
			throw new WidgetNotFoundException("Could not find menu: "
					+ Arrays.asList(texts));
		}

		// click
		click(menuItem);

		// hide
		UIThreadRunnable.syncExec(new VoidResult() {
			public void run() {
				hide(menuItem.getParent());
			}
		});
	}

	private static MenuItem show(final Menu menu, final Matcher<?> matcher) {
		if (menu != null) {
			menu.notifyListeners(SWT.Show, new Event());
			MenuItem[] items = menu.getItems();
			for (final MenuItem menuItem : items) {
				if (matcher.matches(menuItem)) {
					return menuItem;
				}
			}
			menu.notifyListeners(SWT.Hide, new Event());
		}
		return null;
	}

	private static void click(final MenuItem menuItem) {
		final Event event = new Event();
		event.time = (int) System.currentTimeMillis();
		event.widget = menuItem;
		event.display = menuItem.getDisplay();
		event.type = SWT.Selection;

		UIThreadRunnable.asyncExec(menuItem.getDisplay(), new VoidResult() {
			public void run() {
				menuItem.notifyListeners(SWT.Selection, event);
			}
		});
	}

	private static void hide(final Menu menu) {
		menu.notifyListeners(SWT.Hide, new Event());
		if (menu.getParentMenu() != null) {
			hide(menu.getParentMenu());
		}
	}
}
 
分享到:
评论

相关推荐

    swtbot 详细例子说明

    在"swtbotw例子"中,我们可以深入理解SWTBot的用法和功能。 首先,SWTBot提供了一种简洁的API,用于选择和操作UI元素,如按钮、文本框、菜单项等。例如,你可以使用`Bot.button()`或`Bot.menuItem()`来定位并触发...

    swtbot详细例子说明网页分享

    首先,在Eclipse中打开`Help` -&gt; `Install New Software`,然后添加SWTBot的更新站点地址,选择要安装的版本,按照向导提示完成安装。 ### 示例详解 一个简单的SWTBot测试示例可能如下: ```java import org....

    SWTBot收集

    使用SWTBot,你可以编写测试脚本来模拟用户在Eclipse RCP应用中的各种操作。例如,你可以创建一个测试来打开特定的视图,点击某个按钮,检查结果是否符合预期。SWTBot提供了如`Bot.button()`、`Bot.menu()`和`Bot....

    SWTBot自动化测试学习软件

    在学习SWTBot的过程中,首先需要理解SWT和RCP的概念。SWT是Eclipse项目开发的一种轻量级的图形用户界面库,它允许开发者构建与操作系统原生UI紧密集成的Java应用程序。RCP则是Eclipse平台提供的一种框架,用于快速...

    swtbot学习资料

    在SWTBot中,你可以使用查找机制来定位GUI元素。这可以通过Widget的属性,如标签、ID或位置来实现。例如,`bot.button("OK")` 将找到并返回一个标签为"OK"的按钮对象,然后可以调用其方法执行点击操作。 接下来,...

    SWTBot插件包及例子

    1. **安装与配置**:首先,开发者需要在Eclipse环境中安装SWTBot插件,这可以通过Eclipse的内置更新站点或下载离线包完成。安装后,需要导入相关的库到项目中,以便在测试代码中引用。 2. **基本组件操作**:SWTBot...

    swtbot运行原理

    在提供的文件中,“SWTBot工作机制.txt”应该详细介绍了SWTBot的内部工作流程和设计思想;“swtbot编译.txt”可能包含了如何编译和设置SWTBot的环境;而“bat制作1.txt”和“bat制作.txt”可能是关于如何创建批处理...

    使用SWTBOT进行GUI自动化测试

    SWTBOT的核心优势在于其能够准确识别和操作界面元素,即使这些元素在不同的运行环境中可能有所变化。 #### SWTBOT的关键特点 - **易于学习与使用**:对于熟悉Eclipse RCP的开发者来说,SWTBOT的API相对直观易懂。 -...

    swtbot eclipse插件 测试界面

    swtbot eclipse插件 测试界面

    Web页面测试-swtbot

    #### 五、sbtwot工具在Web测试中的应用 sbtwot(应为swtbot)是一种开源的Java GUI测试工具,它专注于测试Swing和SWT/SWT JFace UI组件。尽管swtbot最初是为了测试桌面应用程序而设计的,但它也可以用于Web页面测试...

    SWTBot - SWT/Eclipse functional testing-开源

    SWTBot是用于SWT / RCP应用程序的自动化和测试工具,具有记录和回放脚本的功能。 功能将包括基于文本的脚本,对测试套件的回放,报告和多线程回放的ant支持。

    SWT的详解,例子,介绍

    2. **基本概念**:了解SWTBOT的核心类,如`SWTBot`、`BotFactory`和`WidgetFinder`,以及它们在测试中的作用。 3. **选择和操作控件**:学习如何通过SWTBOT选取和操作窗口、菜单、按钮、文本框等GUI元素。 4. **...

    scenarioo-e4-swtbot-example-integration

    方案示例-swtbot-e4 结合使用场景和SWTBot来测试和记录Eclipse RCP e4示例应用程序的示例UI测试和Scenarioo集成可在plugins/org.scenarioo.example.e4.test/src/org/scenarioo/example/e4文件夹中找到。构建并运行...

    eclipse4.4.4+gmf+swtbot

    NULL 博文链接:https://mwhgjava.iteye.com/blog/2257771

    pdi-ui-test:基于SWTBot的用于Pentaho数据集成的UI测试的集合

    SWTBot提供了丰富的API,可以模拟用户的操作,如点击按钮、填写表单、选择菜单项等,从而实现对GUI应用的自动化测试。 【Pentaho数据集成(PDI)】PDI,也称为Kettle,是Apache 2.0许可下的一款开源ETL(Extract, ...

    如何为EclipseJFaceUI运行单元测试Java开发

    4. 在Eclipse中配置JUnit运行配置,指定SWTBot测试运行器。 5. 运行测试并根据结果迭代改进代码。 通过遵循这些步骤,开发者可以有效地对Eclipse JFace UI应用程序进行单元测试,确保代码的质量和稳定性。

    SWT的自动化测试框架

    3. **初始化Bot**:在测试类中,通常会在`setUp`方法中初始化SWTBot对象。 4. **编写测试用例**:使用SWTBot API编写测试步骤,模拟用户操作并验证结果。 5. **执行测试**:运行测试类,查看测试报告以确定应用...

    SWT-Designer教程

    1. **创建新的Java项目**:在Eclipse中,通过菜单“File -&gt; New -&gt; Java Project”创建一个新的Java项目。 2. **添加SWT依赖**:为了能够使用SWT库,需要将SWT的JAR文件添加到项目的构建路径中。这可以通过右键点击...

Global site tag (gtag.js) - Google Analytics