2012-11-13 12 views
5

Używam Behat do testowania, ze sterownikiem ZombieJS i wszystko działa jak dotąd dobrze, ale jest jedna rzecz, która mi przeszkadza, nie mogę wymyślić, jak sprawić, by Behat symulował kliknięcie element non-link. Domyślam się, że pochodzi ona od Mink'a, który jest sterownikiem opartym na różnych przeglądarkach i nie ma sensu klikać elementów niebędących łączami. Jednak w moim przypadku jest to potrzebne, ponieważ na stronie znajduje się kilka elementów, które mają dołączone detektory zdarzeń javascript i chcę przetestować te funkcje.Czy mogę uczynić Behat/ZombieJS/Mink symulującym kliknięcie elementu "non-link", aby uruchomić detektory JS?

Próbowałem za pomocą

Then I follow "div.sa" 

Ale nie jest on z oczekiwanego błędu:

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

Ponieważ nie jest to element łączący. Jest podobny krok w Behat:

naciśnięciu „button.class”

Ale to jest tylko dla przycisków.

Czy istnieje sposób, w jaki mogę uzyskać Behat, klikając elementy, które nie są znacznikami?

Odpowiedz

4

Tak Tak sądzę, ale trzeba napisać niestandardowy krok, coś wzdłuż tych linii (jeśli używasz podklasy MinkContext

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

Z pewnym obsługi błędów.

/** 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

Kiedy wykonać zdarzenie click, tak że obecny URL równa javascript:

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

Na stronie html:

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

To jest moja adaptacja odpowiedzi przez Comstar. Ta sama funkcjonalność została osiągnięta, jednak wydaje mi się, że prostsze jest wykonanie tego w ten sposób.

/** 
* @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(); 
    } 

} 
Powiązane problemy