2014-11-21 59 views
2

我正在使用Behat測試註冊頁面。
此頁面包含一些自動完成的字段。 用戶填寫字段中的某些值,頁面等待500毫秒,發出ajax請求並顯示一些選項以及相關消息(找不到找到的項目/找到多個項目/找到一個項目)。Behat +水貂如何測試jquery-ui自動填充字段?

我使用預定義的步驟「我填寫字段」(試圖用「我填寫字段」代替)。
下一步是自定義的,與documentation中描述的類似 - 我只是在等待消息出現並檢查它是否有正確的文本。

但是在填充字段後,Mink將焦點從其中移除,導致模糊事件在字段中被觸發。
Jquery-ui清除字段值以響應這個模糊事件,所以在500毫秒後字段爲空並且ajax請求被中止。

我該如何解決這個問題?

貝哈特V2.5.0
水貂V1.5.0
水貂擴展V1.3.3
jQuery的UI v1.8.21
硒v2.44.0

+0

https://github.com/Behat/MinkSelenium2Driver/blob/v1.1.1/src/Behat/Mink/Driver/Selenium2Driver.php#L615 這是我煩惱的原因 - 水貂在場上產生變化事件,所以我想這個問題是在我的js。 – 2014-11-28 06:59:29

回答

0

以下解決方案是專門針對我的標記代碼,但應很容易適應你的。您可能需要修改它。

假設在文本框中選擇自動建議的選項。在用戶的擊鍵之後,自動消除選項顯示爲<li>元素。 <li>元素在頁面中呈現,但是它的內容在開始時是空的,所以沒有什麼可以被behat選擇。爲了解決這個問題,在<li>標籤之間的非現有內容被標記爲<label>。在這種自動建議字段

用戶類型:

<input name="brand" type="text" /> 

如果出現自我暗示數據:

<ul> 
<li><label>{{ suggestion }}</label></li> 
</ul> 

小黃瓜:

When I fill in "brand" with "S" 
And I wait 1 seconds 
Then I select autosuggestion option "Sula" 
And I wait 1 seconds 
...... 

FeatureContext:

/** 
* @Given /^I wait (\d+) seconds$/ 
*/ 
public function iWaitSeconds($seconds) 
{ 
    sleep($seconds); 
} 

/** 
* @Then /^I select autosuggestion option "([^"]*)"$/ 
* 
* @param $text Option to be selected from autosuggestion 
* @throws \InvalidArgumentException 
*/ 
public function selectAutosuggestionOption($text) 
{ 
    $session = $this->getSession(); 
    $element = $session->getPage()->find(
     'xpath', 
     $session->getSelectorsHandler()->selectorToXpath('xpath', '*//*[text()="'. $text .'"]') 
    ); 

    if (null === $element) { 
     throw new \InvalidArgumentException(sprintf('Cannot find text: "%s"', $text)); 
    } 

    $element->click(); 
} 
+0

感謝您的回答。 我的標記和步驟非常相似,問題出在「當我用」S「填充」品牌「時。 當填充字段時,它會失去焦點,所以不會發出ajax請求,並且等待任何秒數都沒有意義 - 沒有顯示任何值。 – 2014-11-27 08:38:02

+0

在我的情況下沒有焦點問題的損失,上面的例子等待響應,所以'wait'必須到位,但如果你有不同的處理方式,那麼你仍然可以根據需要修改它。 – BentCoder 2014-11-27 11:45:53

+0

我的同事在他的電腦上也沒有這個問題。我試圖使用相同的硒和Firefox版本,但它沒有幫助。 – 2014-11-28 06:12:20

0
@Scenario: I'm stuck 
    Given I use jquery-ui-autocomplete 
    And I can not test it with behat 
    Then I trigger keyDown event like this: 
    """ 
    /** 
    * @When I select :entry after filling :value in :field 
    */ 
    public function iFillInSelectInputWithAndSelect($entry, $value, $field) 
    { 
     $page = $this->getSession()->getPage(); 
     $field = $this->fixStepArgument($field); 
     $value = $this->fixStepArgument($value); 
     $page->fillField($field, $value); 

     $element = $page->findField($field); 
     $this->getSession()->getDriver()->keyDown($element->getXpath(), '', null); 
     $this->getSession()->wait(500); 
     $chosenResults = $page->findAll('css', '.ui-autocomplete a'); 
     foreach ($chosenResults as $result) { 
      if ($result->getText() == $entry) { 
       $result->click(); 
       return; 
      } 
     } 
     throw new \Exception(sprintf('Value "%s" not found', $entry)); 
    } 
    """