2015-02-13 5 views
4

Я сейчас в процессе модернизации от серии Behat 2.x до серии Behat 3.x. В предыдущей версии я мог загрузить драйвер Selenium 1, который подключался к PhantomJS для выполнения тестов. Когда я это сделал, я смог подключиться к функции waitForPageToLoad().Как получить драйвер Mink Selenium 2 дождаться загрузки страницы Behat

Эта функция была предоставлена ​​php-selenium (от Alexandre Salomé). Он подключен к селену и называется действием драйвера с тем же именем. Это отлично работало для обеспечения того, чтобы Selenium ждал загрузки страницы. По крайней мере, пока не был достигнут тайм-аут. Это сделало тесты намного быстрее.

Проблема в том, что драйвер Selenium 1 не совместим с Behat 3.x. Похоже, что все было заброшено, и я не вижу этой функциональности в драйвере Selenium 2 для Mink.

Кто-нибудь знает, как сделать эту работу с Behat 3.x и Selenium 2?

ответ

4

Selenium2 теперь имеет функцию wait($timeout, $condition).

Вы можете использовать его как:

/** 
* @Then /^I wait for the ajax response$/ 
*/ 
public function iWaitForTheAjaxResponse() 
{ 
    $this->getSession()->wait(5000, '(0 === jQuery.active)'); 
} 

Другие условия, которые вы могли бы испытать для являются:

  • появление определенного элемента на странице
  • DOM-чтобы закончить загрузку

Причина изменения указана на сайте selenium documentation

+0

Это метод, который я использовал для использования, это просто и эффективный. Однако, на мой взгляд, этот тест включает ограничения на ***, как работает приложение, когда все, о чем вы должны заботиться, - это ***, если *** приложение работает. Если вы торгуете jQuery в любом месте своего приложения, это не сработает, и вы не сможете его повторно использовать в проектах, которые не используют jQuery. Это зависит также от того, что вы используете Selenium, когда ваши тесты должны * попробовать * быть независимыми от водителя. Хотя, как я уже сказал, это работает, и все просто. – DanielM

+0

Я предполагаю, что вы можете вводить и включать jQuery динамически, если он не существует, чтобы иметь эту работу ... – Jimbo

+0

Если у вас есть ошибка, сообщающая, что jQuery неизвестна, измените условие на: '(typeof jQuery! = 'Undefined' && 0 === jQuery.active) ' – nickel715

8

Использование Selenium (или любого другого драйвера, если на то пошло), мне никогда не приходилось беспокоиться о том, загружена ли страница или нет, за одним исключением: если страница заканчивает загрузку, затем загружает больше контента через AJAX.

Чтобы справиться с этим, вы можете использовать функцию вращения, как описано в руководстве Behat.

http://docs.behat.org/en/v2.5/cookbook/using_spin_functions.html

Преимущество этого является:

  • Это не нужно использовать драйвер селена (например, вы могли бы использовать PhantomJS, если вы хотите ускорить над внешним видом).
  • Он не сломается, если вы прекратите использование JQuery и переключиться на что-то другое (например, Угловое в $ httpProvider)

Я бы не Использовать их, хотя, задний след нарушается, и кто хочет, чтобы ждать во-вторых, между проверками. :)

Попробуйте это:

Предполагая, что вы используете Mink Context (спасибо Mick), вы можете просто проверить страницу каждую секунду или около того, пока желаемый текст либо появился или исчез, или данность истекло время ожидания, и в этом случае мы допустим ошибку.

/** 
* @When I wait for :text to appear 
* @Then I should see :text appear 
* @param $text 
* @throws \Exception 
*/ 
public function iWaitForTextToAppear($text) 
{ 
    $this->spin(function(FeatureContext $context) use ($text) { 
     try { 
      $context->assertPageContainsText($text); 
      return true; 
     } 
     catch(ResponseTextException $e) { 
      // NOOP 
     } 
     return false; 
    }); 
} 


/** 
* @When I wait for :text to disappear 
* @Then I should see :text disappear 
* @param $text 
* @throws \Exception 
*/ 
public function iWaitForTextToDisappear($text) 
{ 
    $this->spin(function(FeatureContext $context) use ($text) { 
     try { 
      $context->assertPageContainsText($text); 
     } 
     catch(ResponseTextException $e) { 
      return true; 
     } 
     return false; 
    }); 
} 

/** 
* Based on Behat's own example 
* @see http://docs.behat.org/en/v2.5/cookbook/using_spin_functions.html#adding-a-timeout 
* @param $lambda 
* @param int $wait 
* @throws \Exception 
*/ 
public function spin($lambda, $wait = 60) 
{ 
    $time = time(); 
    $stopTime = $time + $wait; 
    while (time() < $stopTime) 
    { 
     try { 
      if ($lambda($this)) { 
       return; 
      } 
     } catch (\Exception $e) { 
      // do nothing 
     } 

     usleep(250000); 
    } 

    throw new \Exception("Spin function timed out after {$wait} seconds"); 
} 
+1

Примечание. Люди, вам нужно расширить [MinkContext] (https://github.com/Behat/MinkExtension/blob/master/src/Behat/MinkExtension/Context/MinkContext.php), поскольку он имеет 'assertPageContainsText' – Mick

0

Для того, чтобы помочь кому-то еще, я добавил этот метод в FeatureContext.php:

/** 
* @Then I wait :sec 
*/ 
public function wait($sec) 
{ 
    sleep($sec); 
} 

И это работает Will

Смежные вопросы