2017-10-13 19 views
2

버튼을 클릭하면 새 페이지가 양식과 함께 열리고 해당 페이지의 필드를 채워야합니다.어떻게 그것을 채우기 전에 화면에 표시되는 요소에 대한 behat 기다릴 수 있도록?

그러나 페이지가로드되기 시작하면 behat는 아직로드되지 않은 필드를 채우려 고 시도합니다.

필드 채우기를 시도하기 전에 필드가 표시되기를 기다리는 암시 적 대기 시간을 지정하고 싶습니다.

/** 
    * @Given que preencho corretamente os campos da tela 
    */ 
    public function quePreenchoCorretamenteOsCamposDaTela() 
    { 
    $faker = Faker\Factory::create(); 
    $this->getPage()->findField('voucher_subject')->setValue($faker->text); 
    $this->getPage()->findField('voucher_nameRecipient')->setValue($faker->name); 
    } 

나를 도와 줄 사람이 있습니까?

+0

타이머와 함께 'do-while' 루프를 사용하십시오. – lauda

+0

분도기 또는 밍크가 이에 대한 프레임 워커 기능을 제공합니까? –

답변

1

당신은 스핀 기능을 사용할 수 있습니다 :

다음
trait FeatureContextHelper 
{ 
    public function spin (callable $lambda, $wait = 5) 
    { 
     $lastErrorMessage = ''; 

     for ($i = 0; $i < $wait; $i++) { 
      try { 
       if ($lambda($this)) { 
        return true; 
       } 
      } catch (Exception $e) { 
       // do nothing 
       $lastErrorMessage = $e->getMessage(); 
      } 

      sleep(1); 
     } 


     throw new ElementNotVisible('The element is not visible ' . $lastErrorMessage); 
    } 
} 

당신의 맥락에서 :

class FeatureContext extends MinkContext 
{ 
    use FeatureContextHelper; 

    /** 
    * @Given que preencho corretamente os campos da tela 
    */ 
    public function quePreenchoCorretamenteOsCamposDaTela() 
    { 
     $this->spin(function ($context) { 
      $faker = Faker\Factory::create(); 
      $context->getSession()->getPage()->findField('voucher_subject')->setValue($faker->text); 
      $context->getSession()->getPage()->findField('voucher_nameRecipient')->setValue($faker->name); 
      return true; 
     } 
    } 
} 

그것은 5 초 이내에 요소를 찾기 위해 노력하고 그것을 발견하지 않은 경우 다음 시간이 초과됩니다. Selenium2와 Goutte는 우리에게 잘 맞습니다. 내 관점에서

0

브라우저를 시뮬레이트하는 드라이버 (예 : BrowserKit 또는 Goutte)를 사용하는 경우 behat는 DOM이 올바르게 작성되고 준비되어있을 때만 제어 할 수 있습니다. 물론 j는 해석하거나 실행할 수 없습니다. Selenium2와 같은 것을 사용하고 필드가 비동기 호출로 작성된 경우 (올바르게 이해하면이 경우) 페이지가 완전히로드되었는지 여부는 사용자가 결정합니다. 요청에 응답이 있고 제어가 Behat 프로세스로 다시 전달되기 때문입니다.
이 문제의 가능한 해결 방법은 각 ajax/async 호출 바로 전에 클래스를 본문에 추가하고 모든 호출이 끝난 직후에이를 제거하는 것입니다. 그런 다음, 당신의 행동 컨텍스트에서 사라질 클래스를 확인하기 위해 "회 전자 (spinner)"함수를 생성하십시오.

+0

이 스핀 기능을 사용하고 작동합니다! 고맙습니다! ' $ element = null; return $ element && $$ this-> 스핀 (함수 ($ 컨텍스트) 사용 (& $ 요소) { $ 요소 - $ getSession() -> getPage -> findField ('voucher_subject' element-> isVisible(); }); $ element-> setValue ($ faker-> text); ' –

1

이 이제 더 우아한 수행 할 수 있습니다 : 당신은 또한 몇 가지 private 함수 내에서이 작업을 마무리 할 수 ​​

$page = $this->getSession()->getPage(); 

$page->waitFor(5000, 
    function() use ($page) { 
     return $page->findField('voucher_subject')->isVisible(); 
    } 
); 

.