我正在使用具有上下文菜单(右键单击)的 grails 应用程序。上下文菜单是使用 Chris Domigan 的jquery contextmenu 插件构建的。
虽然上下文菜单确实有效,但我想要进行自动化测试,但我不知道如何去做。
- 我试过 Selenium 2.05a(即 Webdriver),但没有 rightClick 方法。
- 我注意到 HtmlUnit 有一个 rightclick 方法,但我似乎无法检测到单击之前和之后的 DOM 中的任何差异。
我正在使用具有上下文菜单(右键单击)的 grails 应用程序。上下文菜单是使用 Chris Domigan 的jquery contextmenu 插件构建的。
虽然上下文菜单确实有效,但我想要进行自动化测试,但我不知道如何去做。
目前 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));
虽然我也希望能够在 Internet Explorer 或 Firefox 中执行此操作,但主要用途是 HtmlUnit。很高兴 HtmlUnit HtmlElement 有一个rightClick()
方法,但不幸的是它protected
不能从 WebDriver 包装的 HtmlUnitWebElement 访问。
我编写了一个 hack 以使其可访问,因此现在我可以调用 rightClick(),尽管它仅在它与 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 ...
}
如果您将 Ruby 与 Capybara 一起使用,这个应该很有用:
module Capybara
module Node
class Element
def context_click
@session.driver.browser.action.context_click(self.native).perform
end
end
end
end