2012-11-13 41 views
5

Tôi đang sử dụng Behat để thử nghiệm, với trình điều khiển ZombieJS và mọi thứ đang hoạt động rất tốt cho đến nay, nhưng có một điều làm phiền tôi, tôi dường như không thể tìm ra cách làm sao để mô phỏng nhấp chuột vào phần tử không liên kết. Tôi đoán điều này xuất phát từ Mink là một trình điều khiển "qua trình duyệt", và nó không thực sự có ý nghĩa để bấm vào các yếu tố không liên kết. Đối với trường hợp sử dụng của tôi mặc dù, tôi cần nó, bởi vì có một số yếu tố trên trang có trình lắng nghe sự kiện javascript gắn liền với họ, và tôi muốn kiểm tra các chức năng này.Tôi có thể làm cho Behat/ZombieJS/Mink mô phỏng một cú nhấp chuột trên phần tử "không liên kết", để kích hoạt trình lắng nghe JS không?

tôi đã cố gắng sử dụng

Then I follow "div.sa" 

Nhưng nó không thành công với các lỗi dự kiến:

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

Vì nó không phải là một yếu tố liên kết. Có một bước tương tự trong Behat:

Tôi nhấn "button.class"

Nhưng điều này chỉ dành cho các nút.

Có cách nào tôi có thể khiến Behat nhấp vào các yếu tố không phải là thẻ không?

Trả lời

4

Có, tôi tin như vậy, nhưng bạn sẽ cần phải viết một bước tùy chỉnh, một cái gì đó dọc theo những dòng (nếu bạn đang sử dụng một lớp con của MinkContext

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

Với một số xử lý lỗi:.

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

Khi tôi thực hiện một sự kiện nhấp chuột, do đó URL hiện tại được tính bằng javascript:

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

Trong trang html:

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

Đây là câu trả lời của tôi về câu trả lời của Comstar. Tuy nhiên, chức năng tương tự cũng đạt được, có vẻ như đơn giản hơn với tôi để thực hiện theo cách này.

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

}