如何在Web应用程序中测试上下文菜单功能?

问题描述:

我正在玩一个具有contextmenu的grails应用程序(右键单击)。 上下文菜单使用Chris Domigan的jquery contextmenu plugin构建。如何在Web应用程序中测试上下文菜单功能?

尽管上下文菜单确实有效,但我想要进行自动化测试,但我无法弄清楚如何去做。

  • 我试过Selenium 2.05a(即Webdriver),但没有rightClick方法。
  • 我注意到HtmlUnit有一个rightclick方法,但我似乎无法检测到点击之前和之后DOM之间的任何差异。

虽然我希望能够在Internet Explorer或Firefox中完成,但主要用法是HtmlUnit。很高兴HtmlUnit HtmlElement有一个rightClick()方法,但不幸的是它的protected,因此无法从WebDriver包装的HtmlUnitWebElement访问。

我写了一个黑客,使之接近,所以现在我可以打电话请右键单击(),虽然它只有当它与运行的HtmlUnit工作 - 不是IE或者FF。

// Needs to be in this package to get access to the element 
package org.openqa.selenium.htmlunit; 

import com.gargoylesoftware.htmlunit.html.HtmlElement; 

public class OpenHtmlUnitWebElement extends HtmlUnitWebElement { 

    // Provide a constructor, even though we don't really need it. 
    public OpenHtmlUnitWebElement(HtmlUnitDriver parent, HtmlElement element) { 
     super(parent, element); 
    } 

    // this is the method we really want. 
    public static HtmlElement using(HtmlUnitWebElement huwe) { 
     return huwe.element; 
    } 
} 

现在我的(常规)测试看起来是这样的:

import static org.openqa.selenium.htmlunit.OpenHtmlUnitWebElement.using 

... 

def itemWithContextMenu = driver.findElement(By.id('theId')) 
if (itemWithContextMenu instanceOf HtmlUnitWebElement) { 
    using(itemWithContextMenu).rightClick() 
    def contextMenu = driver.findElement(By.id('jqContextMenu')) 
    assert ... 
} 

目前有在webdriver的没有右键的方法,有打开它的增强请求 - http://code.google.com/p/selenium/issues/detail?id=161

现在你可以使用键盘快捷键Shift + F10模拟元素上点右键:

WebElement element = driver.findElement(....); 
element.sendKeys(Keys.chord(Keys.SHIFT, Keys.F10)); 
+0

感谢ZloiAdun,但我仍在挣扎。根据我向哪个元素发送Shift-F10,我可以看到常规的IE上下文菜单,或浏览器文件menubutton被选中。我无法让我的自定义情景菜单出现。 - 约翰。 – John 2010-07-20 23:15:37

+0

也许你应该尝试通过JavaScript显示你的菜单?喜欢的东西 ((JavascriptExecutor)驱动程序).executeScript( “menu.display(...)”); 我不知道你正在使用的菜单的细节,但肯定应该有一些JavaScript函数来显示它 – 2010-07-21 08:12:49

,如果你使用Ruby与水豚,这应该是有用的:

module Capybara 
    module Node 
    class Element 
     def context_click 
     @session.driver.browser.action.context_click(self.native).perform 
     end 
    end 
    end 
end