我是Behat的新手。我目前正在使用Mink Extension和Selenium2驱动程序,我想知道如何指定测试应该作为场景的一部分悬停在元素上。
例如,这是我的方案:
Scenario: Testing that the Contact Us submenu appears
Given I am on "/"
When I hover over "About"
Then I should see "Contact Us"
答案 0 :(得分:9)
我根据这个答案https://stackoverflow.com/a/17217598找到了它,并用mouseOver()替换了click()。
这是我的FeatureContext代码:
/**
* @When /^I hover over the element "([^"]*)"$/
*/
public function iHoverOverTheElement($locator)
{
$session = $this->getSession(); // get the mink session
$element = $session->getPage()->find('css', $locator); // runs the actual query and returns the element
// errors must not pass silently
if (null === $element) {
throw new \InvalidArgumentException(sprintf('Could not evaluate CSS selector: "%s"', $locator));
}
// ok, let's hover it
$element->mouseOver();
}
我必须在使用时传递css选择器,因此用法如下:
...
When I hover over the element ".about"
...
答案 1 :(得分:0)
替换悬停在
上/**
* @Then /^I hover over "([^"]*)"$/
*/
public function iHoverOver($arg1)
{
$page = $this->getSession()->getPage();
$findName = $page->find("css", $arg1);
if (!$findName) {
throw new Exception($arg1 . " could not be found");
} else {
$findName->mouseOver();
}
}
答案 2 :(得分:0)
/**
* works better with css, uses different method for css than xpath
* @Then /^I mouse over "(?P<selector>[^"]*)"$/
*/
public function iMouseOver($selector){
$element = $this->find($selector);
if($element == null){
throw new Exception('Element '.$selector.' NOT found');
}
$this->iFocusOn($selector);
if (strstr($selector, '//')) {
$element->mouseOver();
} else {
$this->mouseOver($selector, '1');
}
}
答案 3 :(得分:0)
我很高兴知道这个问题已有4年的历史了,并且得到了公认的答案,但是您的示例使用了一个短语来标识要悬停在哪个元素上的语言,而不是CSS选择器。我认为这是一件好事,因为我希望客户和项目团队的非技术人员都可以阅读Behat脚本。
所以,如果我可以提供替代答案:
脚本:
...
When I hover over the "About" link
...
FeatureContext中的步骤定义:
/**
* @Then I hover over the :phrase link
*/
public function iHoverOverLink($phrase)
{
$session = $this->getSession();
// Get all link elements on the page
$links = $session->getPage()->findAll('css', 'a');
foreach($links as $link) {
if ($link->getText() == $phrase) {
// ok, let's hover it
return $link->mouseOver();
}
}
throw new \InvalidArgumentException(sprintf('Could not find anchor element matching "%s"', $phrase));
}
我的示例将目标对象的范围缩小到仅锚元素,以提高速度和效率,但是如果您的导航菜单中确实有一些不可单击的项目要悬停,则可以轻松地从最后删除“链接”一词步骤模板,然后更改CSS选择器以匹配所有文本元素p, span, li, a
。