2012-11-13 22 views
5

Ich benutze Behat zum Testen, mit dem ZombieJS Treiber, und alles funktioniert sehr gut, aber es gibt eine Sache, die mich stört, ich kann nicht scheinen, herauszufinden, wie Behath einen Klick auf eine zu simulieren Nicht-Link-Element. Ich nehme an, dass Mink ein "Cross-Browser" -Treiber ist, und es macht keinen Sinn, auf Nicht-Link-Elemente zu klicken. Für meinen Anwendungsfall benötige ich es jedoch, weil es auf der Seite mehrere Elemente gibt, an die JavaScript-Ereignis-Listener angehängt sind, und ich möchte diese Funktionalitäten testen.Kann Behath/ZombieJS/Mink einen Klick auf ein "non-link" -Element simulieren, um JS-Listener auszulösen?

Ich versuchte

Then I follow "div.sa" 

aber es funktioniert nicht mit dem erwarteten Fehler mit:

01. Link with id|title|alt|text "div.sa" not found. 

Da es kein Verbindungselement ist. Es gibt einen ähnlichen Schritt in Behat:

Ich drücke „button.class“

Aber dies ist nur für Tasten.

Gibt es eine Möglichkeit, dass ich Behat auf Elemente klicken kann, die keine Tags sind?

Antwort

4

Ja, ich glaube ja, aber Sie werden einen benutzerdefinierten Schritt, etwas in dieser Richtung schreiben müssen (wenn Sie eine Unterklasse von MinkContext verwenden

/** 
* @When /^I click the something$/ 
*/ 
public function iClickTheSomething() 
{ 
    $something = $this->getSession() 
         ->getPage() 
         ->find("css", "div.sa") 
         ->click(); 
} 
12

Mit etwas Fehlerbehandlung.

/** Click on the element with the provided xpath query 
* 
* @When /^(?:|I)click on the element "([^"]*)"$/ 
*/ 
public function iClickOnTheElement($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 click on it 
    $element->click(); 
} 
1

Wenn ich ein Click-Ereignis ausführen, so dass die aktuelle URL Javascript gleich:

$this->iClickOnTheElementWithXPath(‘//div[@class="'.$arg2.'"]/div/div[@class="edit"]/a[text()="'.$arg1.'"]‘); 

In der Seite html:

<a onclick="editForm('Avatar')" href="javascript:;">Modifier</a> 
2

Dies ist meine Anpassung der Antwort von Comstar. Es wird die gleiche Funktionalität erreicht, jedoch erscheint es mir einfacher, dies auf diese Weise zu tun.

/** 
* @Then /^I click on "([^"]*)"$/ 
*/ 
public function iClickOn($arg1) 
{ 
    $page = $this->getSession()->getPage(); 

    $findName = $page->find("css", $arg1); 
    if (!$findName){ 
     throw new Exception($arg1." could not be found"); 
    } 
    else { 
     $findName->click(); 
    } 

} 
Verwandte Themen